交叉验证和网格搜索一般结合使用,用来解决超参的选择问题。超参指定就是算法模型中需要手动指定的参数,比如KNN算法中的n_neighbors。
网格搜索指的就是,预设几组超参组合,每组都是用交叉验证的方式进行评估,选择最优的超参组合建立模型。
交叉验证原理:
- 将所有数据集分成5份。
- 不重复地每次取其中1份做验证集,其他4份做训练集来训练模型,之后计算该模型在验证集上的MSE(均方误差)。
- 将5次的MSE取平均得到最后的MSE。
- 像上面这样分5次验证的方式,又称为5(K)折交叉验证。
代码使用
from sklearn.model_selection import GridSearchCV
kn = KNeighborsClassifier()
# 网格搜索
param = {'n_neighbors': [3, 5, 9, 11]}
gc = GridSearchCV(estimator=kn, param_grid=param, cv=5)
gc.fit(x_train, y_train)
y_predict = gc.predict(x_test)
print('测试集精确率:', gc.score(x_test, y_test))
print('最优超参为:', gc.best_params_)
print('最优模型为:', gc.best_estimator_)
print('最优评估为:', gc.best_score_)
print('每个超参每次交叉验证的结果:', gc.cv_results_)
estimator:指定模型实例。
param_grid:字典类型的超参列表。
cv:指定几折交叉验证。
fit:训练数据。
score:测试集准确率。
best_params_:最优超参。
best_estimator_:最优模型。
best_score_:最优评估分数。
cv_results_:每组超参每次交叉验证的结果。