交叉验证
问题
我们在训练数据的时候通常把原数据分成 训练集以及测试集两份。当我们使用训练集训练出模型后再使用测试集进行预测。从而得出模型的好坏程度。这样也会暴露一个问题,当发现训练集产生的模型不能很好的拟合测试集的时候我们会重新调整超参数,让模型拟合测试集。所以有的时候可能会造成测试集的过拟合,但是却难以发觉。对应着超参数就不是最佳。
解决方案
交叉验证。将测试集分成多等份,将所有份进行组合。每组中,有一份是测试集,其余是训练集。例如:我们将数据分成ABC三份。对这些数据进行组合,可以将AB组合成训练集C为测试集,同理AC为训练集,B为测试集。BC为训练集A为测试集。再将这些组合进行训练,得到模型用测试集进行评分,得到总体评分最高的超参数及最合理的超参数。
使用交叉验证
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=666)
knn_clf = KNeighborsClassifier()
cross_val_score(knn_clf, X_train, y_train,cv=5)# 参数为用来训练的算法,训练集X,Y,cv=5为分成5份,不填写默认为分成3份,会返回三个评分
使用交叉验证+网格搜索找到最佳参数
from sklearn.model_selection import GridSearchCV
param_grid = [
{
'weights': ['distance'],
'n_neighbors': [i for i in range(2, 11)],
'p': [i for i in range(1, 6)]
}
]
grid_search = GridSearchCV(knn_clf, param_grid, verbose=1,cv=5)#这个末尾的CV就是交叉验证的意思,cv=5同上
grid_search.fit(X_train, y_train)
best_knn_clf = grid_search.best_estimator_ #获得最佳分类器
best_knn_clf.score(X_test, y_test)
k-folds
以上使用的就是k-folds,因为要分成K个模型,分别要训练所以整体训练速度会慢非常多
留一法 LOO-CV
把训练集分成m份,每次留1份作为测试,m-1作为训练集