gridsearchcv(网格搜索)&kfold validation(k折验证) in ML

网格搜索算法是一种通过遍历给定的参数组合来优化给定模型性能的方法。

以决策树为例,当我们确定了要使用决策树算法的时候,为了能够更好地拟合和预测,我们需要调整它的参数。在决策树算法中,我们通常选择的参数是决策树的最大深度。

于是我们会给出一系列的最大深度的值,比如 {‘max_depth’: [1,2,3,4,5]},我们会尽可能包含最优最大深度。

不过,我们如何知道哪一个最大深度的模型是最好的呢?我们需要一种可靠的评分方法,对每个最大深度的决策树模型都进行评分,这其中非常经典的一种方法就是交叉验证,下面我们就以K 折交叉验证为例,详细介绍它的算法过程。

首先我们先看一下数据集是如何分割的。我们拿到的原始数据集首先会按照一定的比例划分成训练集和测试集。比如下图,以 8:2 (5折)分割的数据集:
gridsearchcv(网格搜索)&kfold validation(k折验证) in ML_第1张图片

训练集用来训练我们的模型;测试集用来评估我们训练好的模型性能。

因此,在K 折交叉验证中,我们用到的数据是训练集中的所有数据。我们将训练集的所有数据平均划分成 K 份(通常选择 K=10),取第 K 份作为验证集,它的作用就像我们用来估计高考分数的模拟题,余下的 K-1 份作为交叉验证的训练集。

对于我们最开始选择的决策树的 5 个最大深度 ,以 max_depth=1 为例,我们先用第 2-10 份数据作为训练集训练模型,用第 1 份数据作为验证集对这次训练的模型进行评分,得到第一个分数;然后重新构建一个 max_depth=1 的决策树,用第 1 和 3-10 份数据作为训练集训练模型,用第 2 份数据作为验证集对这次训练的模型进行评分,得到第二个分数……以此类推,最后构建一个 max_depth=1 的决策树用第 1-9 份数据作为训练集训练模型,用第 10 份数据作为验证集对这次训练的模型进行评分,得到第十个分数。于是对于 max_depth=1 的决策树模型,我们训练了 10 次,验证了 10 次,得到了 10 个验证分数,然后计算这 10 个验证分数的平均分数,就是 max_depth=1 的决策树模型的最终验证分数。
gridsearchcv(网格搜索)&kfold validation(k折验证) in ML_第2张图片

对于 max_depth = 2,3,4,5 时,分别进行和 max_depth=1 相同的交叉验证过程,得到它们的最终验证分数。然后我们就可以对这 5 个最大深度的决策树的最终验证分数进行比较,分数最高的那一个就是最优最大深度,我们利用最优参数在全部训练集上训练一个新的模型,整个模型就是最优模型


举个栗子:

from sklearn.model_selection import GridSearchCV, KFold, train_test_split
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data['data'], data['target'], train_size=0.8, random_state=0)
regressor = DecisionTreeClassifier(random_state=0)
parameters = {'max_depth': range(1, 6)}
scoring_fnc = make_scorer(accuracy_score)
kfold = KFold(n_splits=10)
grid = GridSearchCV(regressor, parameters, scoring_fnc, cv=kfold)
grid = grid.fit(X_train, y_train)
reg = grid.best_estimator_
print('best score: %f'%grid.best_score_)
print('best parameters:')
for key in parameters.keys():
    print('%s: %d'%(key, reg.get_params()[key]))
print('test score: %f'%reg.score(X_test, y_test))
import pandas as pd
pd.DataFrame(grid.cv_results_).T

直接用决策树得到的分数大约是92%,经过网格搜索优化以后,我们可以在测试集得到95.6%的准确率:

best score: 0.938462
best parameters:
max_depth: 4
test score: 0.956140

gridsearchcv(网格搜索)&kfold validation(k折验证) in ML_第3张图片
转载:https://zhuanlan.zhihu.com/p/25637642

你可能感兴趣的:(python,ML)