GridSearchCV调参(一) - 入门(KNN,KFold,StratifiedKFold)

前面看了一些基础的机器学习算法,今晚用到sklearn了,才发现原来还可以自动去调参数。。。记录一下

  1. GridSearchCV

网格搜索交叉验证,关键在于交叉验证,意思就是把训练数据集拆分成训练集和验证集,拆分成不同组合来验证对于某个分类器取什么参数值最好

方法参数:
class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=None, iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’, return_train_score=’warn’)[source]

estimator:你想用的分类器,比如KNN
param_grid:要预测的参数列表,比如对KNN来说最重要的是n_neighbors
scoring :准确度评价标准,默认None,这时需要使用score函数;或者如scoring=’roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。
cv :交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器,比如KFold和StratifiedKFold
refit :默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。
iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。
verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。
n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值。

训练结果:
gridKNN.best_estimator_
gridKNN.best_score_
一个是最好的分类器,一个这个分类器跑出来的分数

  1. KFold和StratifiedKFold

都可以作为GridSearchCV里参数cv的输入

其实就是把数据集拆分成不同的训练集+验证集,如下下面的代码所示:
floder = KFold(n_splits=4, random_state=0, shuffle=False)
sfolder = StratifiedKFold(n_splits=4, random_state=0, shuffle=False)
一共8条数据,K=4就是把数据拆成2个一组,那么三组做训练集,一组做验证集,4种组合
两者不同在于KFold是顺序的切片, StratifiedKFold是跳跃的切片

X = np.array([
      [1, 2, 3, 4],
      [11, 12, 13, 14],
      [21, 22, 23, 24],
      [31, 32, 33, 34],
      [41, 42, 43, 44],
      [51, 52, 53, 54],
      [61, 62, 63, 64],
      [71, 72, 73, 74]
])
# 一共八个数据,分成K = 4 组,每组两个数据
# 正好可以组成K=4个训练+验证集
#
y = np.array([1, 1, 0, 0, 1, 1, 0, 0])
floder = KFold(n_splits=4, random_state=0, shuffle=False)
sfolder = StratifiedKFold(n_splits=4, random_state=0, shuffle=False)

for train, test in sfolder.split(X, y):
      print('Train: %s | test: %s' % (train, test))
      print(" ")
print('KFold===============')
for train, test in floder.split(X, y):
      print('Train: %s | test: %s' % (train, test))
      print(" ")
# StratifiedKFold 是分层采样, KFold是顺序采样
#==========StratifiedKFold
# Train: [1 3 4 5 6 7] | test: [0 2]
#
# Train: [0 2 4 5 6 7] | test: [1 3]
#
# Train: [0 1 2 3 5 7] | test: [4 6]
#
# Train: [0 1 2 3 4 6] | test: [5 7]
#
# KFold == == == == == == == =
# Train: [2 3 4 5 6 7] | test: [0 1]
#
# Train: [0 1 4 5 6 7] | test: [2 3]
#
# Train: [0 1 2 3 6 7] | test: [4 5]
#
# Train: [0 1 2 3 4 5] | test: [6 7]
  1. 训练例子

这里随便拿了一个处理好的数据,准备用KNN去预测测试数据的结果,但不知道n_neighbors取什么好,于是用GridSearchCV调试一下
先做一个StratifiedKFold的切片器,这里切了10组,就意味着会有十次交叉验证
然后是规定我要测试的分类器是KNeighborsClassifier
要调试的参数是’n_neighbors’,并且定了取值范围是16和18

测试结果看上去还行,精确度有八成,参数是n_neighbors=16
KNeighborsClassifier(algorithm=‘auto’, leaf_size=30, metric=‘minkowski’,
metric_params=None, n_jobs=None, n_neighbors=16, p=2,
weights=‘uniform’)
0.8217934165720772

# Cross validate model with Kfold stratified cross val
kfold = StratifiedKFold(n_splits=10)

k_range=list([16,18])
knn_param_grid={'n_neighbors' : k_range}
gridKNN = GridSearchCV(KNeighborsClassifier(),param_grid = knn_param_grid, cv=kfold, scoring="accuracy", n_jobs= -1, verbose = 1)
gridKNN.fit(X_train,Y_train)
print(gridKNN.best_estimator_)
print(gridKNN.best_score_)

于是用挑好的参数再来跑一下预留的测试数据:
结果:0.8138528138528138

knn = KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=16, p=2,
           weights='uniform')
knn.fit(X_train,Y_train)
print(knn.score(X_test, Y_test))

你可能感兴趣的:(调参)