机器学习之交叉验证和网格搜索

交叉验证

将拿到的训练数据,分为训练集和验证机。以下图为例:将训练数据分为4份,其中一份作为验证集,。然后经过5次的测试,每次都更换不同的验证机,

最后得到5组模型的结果。最后取平均值作为最后的结果。这也称为4折交叉验证。

网格搜索(超参数搜索):

通常情况下,有很多参数是需要手动指定的(如K-近邻算法中的K值),这种教超参数。但是手动过程繁杂,所提需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

作用:调参数。

API:sklearn.model_selection.GridSearchCV

 以K-近邻那篇文章的例子进行修改,代码如下:

 1 from sklearn.model_selection import GridSearchCV
 2 from sklearn.datasets import load_iris
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.preprocessing import StandardScaler
 5 from sklearn.neighbors import KNeighborsClassifier
 6 
 7 def knn():
 8     """
 9     鸢尾花分类
10     :return: None
11     """
12 
13     # 数据集获取和分割
14     lr = load_iris()
15 
16     #标准化
17     std = StandardScaler()
18     x = std.fit_transform(lr.data)
19 
20     x_train, x_test, y_train, y_test = train_test_split(x, lr.target, test_size=0.25)
21 
22     # estimator流程
23     knn = KNeighborsClassifier()
24 
25     #构造一些参数的值进行搜索
26     param = {'n_neighbors': [3,5,10]}
27 
28     #j进行网格搜索
29     gc = GridSearchCV(knn,param_grid = param, cv = 10)
30 
31     gc.fit(x_train,y_train)
32 
33     #预测准确率
34     print('再测试集上的准确率:',gc.score(x_test,y_test))
35     print('再交叉验证中最好的结果:',gc.best_score_)
36     print('选择的最好的模型是:',gc.best_estimator_)
37     print('每个超参数每次交叉验证的结果',gc.cv_results_)
38 
39     return None
40 
41 if __name__ == "__main__":
42     knn()

可以看到结果,在K=10的时候,10折交叉验证的结果最好,准确率达到了95.5%。比单用K-邻近法的94%稍微高一些。

猜你喜欢

转载自www.cnblogs.com/GouQ/p/11871070.html