sklearn中网格搜索和交叉验证

什么是网格搜索(Grid Search)

Sklearn中寻找最佳的超参数的组合的过程称为网格搜索。
当然我们可以自己写代码寻找最佳超参数,但效率较慢。Sklearn中已经提供了现成的方法供我们使用。

网格搜索的API

sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)

参数:

  • estimator:估计器对象
  • param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
  • cv:指定几折交叉验证

方法:

  • fit:输入训练数据
  • score:准确率,是一次性结果

结果分析:

  • best_score_:在交叉验证中验证的最好准确率,是N次交叉验证后得到的平均分
  • best_estimator_:最好的参数模型
  • cv_results_:每次交叉验证后的验证集准确率结果和训练集准确率结果

交叉验证

上面API中还有一个CV参数,就是表示交叉验证。
交叉验证是将训练集数据分为N份,其中一份为验证集。每次更换不用的验证集,对数据进行N次测试,得到N次结果,最后对结果取平均值作为最终结果。以上被称为N折交叉验证。
sklearn中网格搜索和交叉验证_第1张图片
交叉验证可以让模型更加准确可信。

代码示例

from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 归一化处理后数据集划分
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=22)

# 使用MinMaxScaler进行归一化处理
scaler = StandardScaler()
X_train2 = scaler.fit_transform(X_train)
X_test2 = scaler.transform(X_test)

# knn分类
knn_clf= KNeighborsClassifier()

# 参数字典,并将字典传入网格搜索中,采用3折交叉验证
param_dic = {'n_neighbors': [1,3,5], 'weights': ['uniform', 'distance']}
gscv = GridSearchCV(knn_clf, param_grid=param_dic, cv=3)

#用网格搜索后的模型进行训练
gscv.fit(X_train2, y_train)
y_predict = gscv.predict(X_test2)
print('结果对比', y_predict==y_test)

# 模型评估
score = gscv.score(X_test2, y_test)
print('模型准确率:', score)

输出结果
在这里插入图片描述

print(gscv.best_score_)
print(gscv.best_params_)

输出结果在这里插入图片描述
可以看出score和best_score的结果不一样,这是因为best_score是进行交叉验证得到的平均分,而score是采用最好参数后一次的得分,所以交叉验证后的score比best_score的得分更高。

你可能感兴趣的:(sklearn,python,人工智能)