赞
踩
本系列文章都是根据菜菜大神的视频编写:
机器学习实战
泛化误差和模型复杂度之间的关系:
模型调参是机器学习中的重要内容,那么为什么要进行模型调参数?
在模型参数很多时,需要采用网格搜索进行调参数。但是并不是每个参数对模型的影响都很大,如果对所有的参数都进行调整,不一定会得到最优的结果,只会是一个相对平均的结果。
因此,从另一个角度来看,需要分析不同的模型参数对结果的影响程度,对参数的重要性进行排序,然后按照重要性从大到小对相对重要的参数依次进行调参,这样才比较容易获取比较好的结果。
以决策树参数为例,其参数重要程度如下:
from sklean.datasets import load_breast_cancer from sklearn.emsemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV from sklearn.model_selection import cross_val_score import matplotlib.pyplt as plt import pandas as pd import numpy as np data = load_breast_cancer() # 参数n_estimators的学习曲线 score1 = [] # 确定范围后细化区间 # for i in range(35, 45): # 得到最终结果是39 for i in range(0, 200, 10): rfc = RandomForestClassifier(n_estimators=i+1, n_jobs=1, random_state=90) score = cross_val_score(rfc, wine.data, wine.target, cv=10).mean() score1.append(score) print(max(score1), score1.index((max(score1)))+1) # 最大n_estimator是41 plt.figure(figsize=[20, 5]) plt.plot(range(1, 201, 10), score1) plt.show()
对于没有参照的参数,很难说清范围,这种情况下使用学习曲线,根据曲线确定更细化的区间。
如随机森林中的:n_estimator、max_depth、max_leaf_nodes。
对于可以找到范围的参数,或者我们知道其取值,以及随着它们的取值模型整体准确率会怎么变化,这样的参数则使用网格搜索进行调整。
如随机森林中的:criterion、min_sample_split、min_samples_leaf、max_features。
使用网格搜索一个一个地调参,若一起调,会无法知道具体存在问题的点,而且耗时很长,因此为了更清楚调参细节,需要逐一观察调整:
# 根据影响程度调参,先调max_depth(本案例中学习曲线跑的太慢了才用的网格搜索)
param_grid = {"max_depth":np.arange(1,20,1)}
# n_estimator是学习曲线学习出来的最优参数
rfc = RandomForestClassifier(n_estimator=39, random_state=90)
GS = GridSearchCV(rfc, param_grid, cv=10)
GS.fit(data.data, data.target)
print(GS.best_params_) # 显示调整出来的最佳参数
print(GS.best_scroe_) # 显示调整出来的最佳准确率
若调整了另一个参数后,准确率反而降低了,那么需要考虑增加模型复杂度的参数。这里调整max_depth后模型准确率下降,表示模型处于最佳模型复杂度左侧,因此需要增加模型复杂度。因此不调整max_depth,而且减少模型复杂度的参数min_sample_split、min_samples_leaf均不需调整,因此可以调整max_features。
param_grid = {"max_features":np.arange(5,30,1)}
# n_estimator是学习曲线学习出来的最优参数
rfc = RandomForestClassifier(n_estimator=39, random_state=90)
GS = GridSearchCV(rfc, param_grid, cv=10)
GS.fit(data.data, data.target)
print(GS.best_params_) # 显示调整出来的最佳参数
print(GS.best_scroe_) # 显示调整出来的最佳准确率
如果此时模型准确率还是降低,那么说明在 r a n d o m _ s t a t e random\_state random_state为90的情况下已达到最优。若还想增加准确率,此时考虑其他模型或改变数据预处理方式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。