要知道算法模型对未知的数据表现如何,最好的评估方法是利用已经明确知道结果的数据运行生成的算法模型进行验证。此外还可以采用重新采样评估的方法,使用新的数据来评估算法模型。
分离数据集的方法
1. 分离训练集和评估数据集
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.33,random_state=4)#指定随机粒度可以确保每次执行程序得到相同的结果,有助于比较两个不同算法生成的模型的结果
model=LogisticRegression()
model.fit(X_train,Y_train)
result=model.score(X_test,Y_test)
print("算法评估结果:%.3f%%"%(result*100))
2. K折交叉验证分离
将原始数据集分成K组,每个子集数据分别做一次验证集,其余K-1组做训练集,得到K个模型。
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
kfold=KFold(n_splits=10,random_state=7,shuffle=True)
model=LogisticRegression()
result = cross_val_score(model,X,Y,cv=kfold)
print("算法评估结果:%.3f%%(%.3f%%)"% (result.mean()*100,result.std()*100))
3. 弃一交叉验证分离
原始数据N个样本,弃一交叉验证就是N-1个交叉验证,每个样本单独作为验证集得到N个模型
相较于K折交叉验证,弃一交叉验证有两个显著优点:
·每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠
·实验过程中没有随机因素会影响实验数据,实验可复制
#弃一交叉验证
from sklearn.model_selection import LeaveOneOut
loocv=LeaveOneOut()
model=LogisticRegression()
result=cross_val_score(model, X,Y,cv=loocv)
print("算法评估结果:%.3f%%(%.3f%%)"% (result.mean()*100,result.std()*100))
4. 重复随机评估、训练数据集分离
#重复随机分离训练集和验证集
from sklearn.model_selection import ShuffleSplit
kfold=ShuffleSplit(n_splits=10,test_size=0.33,random_state=7)
model=LogisticRegression()
result=cross_val_score(model, X,Y,cv=kfold)
print("算法评估结果:%.3f%%(%.3f%%)"% (result.mean()*100,result.std()*100))
总结一下
K折交叉验证是用来评估机器学习算法的黄金准则,通常K会取3、5、10来分离数据。
分离训练集和数据集方法的执行效率比较高,多用于算法执行效率比较低或者具有大量数据的时候。
弃一交叉验证和重复随机分离评估数据集与训练数据集这两种方法,通常会用于平衡评估算法、模型训练的速度及数据集的大小。
reference:《机器学习python实践》,魏贞原,2018.