今天聊一下数据集分割的问题,在使用机器学习算法的时候,我们需要对原始数据集进行分割,分为训练集、验证集、测试集。训练集用于建立模型,验证集用于模型参数的选择,测试集用于评估选定模型的泛化情况。测试集是不能动的,使用了测试集调整参数,就相当于作弊。下面是使用 sklearn.model_selection.train_test_split 实现数据集的分割。
iris = load_iris()
X_trainval,X_test,y_trainval,y_test = train_test_split(iris.data,iris.target,test_size=0.2, random_state=0)
X_train,X_valid,y_train,y_valid = train_test_split(X_trainval,y_trainval,test_size=0.25, random_state=0)
# X_train.size = 0.6 ,X_valid.size = 0.2 ,X_test.size = 0.2 #
对于大数据集,使用上面的分割方式没有问题,但是对于小数据集,将它分成三份,会导致训练量的下降。所以,对于小数据集,我们使用交叉验证(cross validation),交叉验证有许多版本,一般使用k折交叉验证,它的原理如下图:
交叉验证的好处有3点
1:验证结果更加稳定,训练数据是要做随机打乱,如果是单纯拆分做训练就可能刚刚碰到一组数据表现特别好或者特别差,这种情况在小数据集中很常见,所以使用交叉验证结果会更稳定。
2:能够查看数据分布对于模型效果的影响,通过查看每折的验证结果,可以得到该数据集分布对模型的影响。
3:更好的利用训练数据,如果是5折交叉验证,那么训练量占了80%,如果是10折交叉验证,那么训练量达到90%。
当然,在使用交叉验证时,计算量就会增加很多,对于处理大数据集是个负担。
下面是使用sklearn实现交叉验证的代码。
我们可以通过查看交叉验证中的train_score,test_score,判断模型是否过拟合或者欠拟合。