机器学习中调参、调优思想以随机森林乳腺癌数据集为例子

本文通过随机森林在sklearn乳腺癌数据集上的调参过程,探讨了如何正确调整模型参数以降低泛化误差。首先介绍了模型复杂度与泛化误差的关系,然后详细展示了调参步骤,包括先调对模型影响最大的参数,如n_estimators和max_depth,再逐步调整其他参数。最终,强调了明确调参目标、有条理的调参思路及分析调参结果的重要性。

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


通过画学习曲线,网格搜索,我们可以探索到调参边缘(代价可能是训练一次模型可能要跑很久很久)。现实中,高手调参往往依赖于长久积累的经验,这些经验主要来源:1.非常正确的调参思路;2.对模型评估指标非常深入的理解;3.对数据的感觉和经验;4.用洪荒之力不断去尝试。
虽然我们没有高手多年积累的经验,但是我们可以学习他们对模型评估指标的理解和调参思路。

正确的调参思路

第一步是要找准目标:我们要做什么? 一般来说这个目标是提升某个模型的评估指标。比如对随机森林来说,我们要提升模型在未知数据上的准确率(由score,或oob_score来衡量)。找准了这个目标我们就要思考,模型在未知数据上的准确率受什么影响,。在机器学习中,我们用来衡量模型在未知数据上准确率的指标叫做泛化误差

泛化误差

当模型在未知数据(测试集或者袋外数据)上表现糟糕时,我们说模型的泛化程度不够,泛化误差大,模型的效果不好。泛化误差受到模型的结构(复杂度)影响。看下面这张图,它准确地描绘了泛化误差与模型复杂度的关系,当模型太复杂,模型就会过拟合,泛化能力就不够,所以泛化误差大。当模型太简单,模型就会欠拟合,拟合能力就不够,所以误差也会大。只有当模型的复杂度刚刚好的才能够达到泛化误差最小的目标。
在这里插入图片描述
那模型的复杂度与我们的参数有什么关系呢?对树模型来说,树越茂盛,深度越深,枝叶越多,模型就越复杂。所以树模型是天生位于图的右上角的模型,随机森林是以树模型为基础,所以随机森林也是天生复杂度高的模型。随机森林的参数,都是向着一个目标去:减少模型的复杂度,把模型往图像的左边移动,防止过拟合。当然了,调参没有绝对,也有天生处于图像左边的随机森林,所以调参之前,我们要先判断,模型现在究竟处于图像的哪一边(过拟合还是欠拟合)。
四个关键点:
1)模型太复杂或者太简单,都会让泛化误差高,我们追求的是位于中间的平衡点
2)模型太复杂就会过拟合,模型太简单就会欠拟合
3)对树模型和树的集成模型来说,树的深度越深,枝叶越多,模型越复杂
4)树模型和树的集成模型的目标,都是减少模型复杂度,把模型往图像的左边移动

随机森林各个参数对模型在未知数据上评估性能的影响

参数 对模型评估性能的影响 影响程度
n_estimators 越大越稳定 ****
max_depth 对模型的影响有增有减,max_depth默认最大深度,即此时模型复杂度最高,往往降低模型的泛化能力 ***
min_samples_leaf 影响有增有减,默认值1,即最高复杂度。min_samples_leaf越大,模型越简单 **
min_samples_split 影响有增有减,默认值2,也是最高复杂度,min_samples_split越大模型越简单 **
max_features 影响有增有减,max_features越大,模型越复杂;max_features越小模型越简单.max_features默认值为特征数的平方根,是处使模型复杂度处在中间的一个参数。 *
criterion 影响有增有减,一般默认gini 视情况而定

示例—随机森林在sklearn乳腺癌数据集上的调参

调参思路:先调对模型影响最大的参数,再逐步调后面的参数,最终找到最优的参数

从sklearn中导入相关的包

from sklearn.datasets import load_breast_cancer # 乳腺癌数据集接口
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV # 网格搜索
from sklearn.model_selection import cross_val_score # 交叉验证
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

导入数据,不经过调参直接看模型准确度

# 导入数据
data = load_breast_cancer()
X = data['data']
y = data['target']

# 看一下不经过调参直接交叉验证模型得分
rfc = RandomForestClassifier()
init_score = cross_val_score(rfc, X, y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值