当前位置:   article > 正文

机器学习之调参的基本思想_模型预测为什么要进行调参

模型预测为什么要进行调参

一、调参基本思想

本系列文章都是根据菜菜大神的视频编写:
机器学习实战
泛化误差和模型复杂度之间的关系:
在这里插入图片描述

模型调参是机器学习中的重要内容,那么为什么要进行模型调参数?

  1. 模型太简单或太复杂都会让模型的泛化误差高,因此要寻求平衡点;
  2. 模型太复杂会过拟合,模型太简单会欠拟合

在模型参数很多时,需要采用网格搜索进行调参数。但是并不是每个参数对模型的影响都很大,如果对所有的参数都进行调整,不一定会得到最优的结果,只会是一个相对平均的结果。
因此,从另一个角度来看,需要分析不同的模型参数对结果的影响程度,对参数的重要性进行排序,然后按照重要性从大到小对相对重要的参数依次进行调参,这样才比较容易获取比较好的结果。
以决策树参数为例,其参数重要程度如下:
在这里插入图片描述

二、随机森林调参实战

1. 学习曲线调参

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2. 网格搜索调参

对于没有参照的参数,很难说清范围,这种情况下使用学习曲线,根据曲线确定更细化的区间。
如随机森林中的: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_) # 显示调整出来的最佳准确率
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

若调整了另一个参数后,准确率反而降低了,那么需要考虑增加模型复杂度的参数。这里调整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_) # 显示调整出来的最佳准确率
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果此时模型准确率还是降低,那么说明在 r a n d o m _ s t a t e random\_state random_state为90的情况下已达到最优。若还想增加准确率,此时考虑其他模型或改变数据预处理方式

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/557394
推荐阅读
相关标签
  

闽ICP备14008679号