机器学习之调参的基本思想

本文介绍如何通过学习曲线调参找出决策树参数的平衡点,并结合网格搜索优化随机森林模型,重点关注n_estimators、max_depth等关键参数。通过实例演示如何利用sklearn库进行参数调整以提升模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、调参基本思想

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

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

  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()

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_) # 显示调整出来的最佳准确率

若调整了另一个参数后,准确率反而降低了,那么需要考虑增加模型复杂度的参数。这里调整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的情况下已达到最优。若还想增加准确率,此时考虑其他模型或改变数据预处理方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值