sklearn的系统学习——随机森林调参(含案例及完整python代码)

本文介绍了随机森林调参的核心问题、调参方向和具体方法,通过绘制学习曲线和使用网格搜索来优化模型。重点讨论了如何降低模型复杂度以提高泛化误差,提供了调参代码示例,包括调整`n_estimators`、`max_depth`等关键参数,并展示了最佳参数组合和得分。

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

目录

一、 调参核心问题

二、 随机森林调参方向

 三、随机森林调参方法

 1、绘制学习曲线

 2、网格搜索

四、 详细代码


       对于调参,首先需要明白调参的核心问题是什么,然后理清思路,再进行调参。调参并非是一件容易的事情,很多大牛靠的是多年积累的经验和清晰的处理思路,那对于我们而言,也应对调参思路和方向有一个认识,然后就是不断地尝试。

一、调参核心问题

1、调参的目的是什么?

2、模型在未知数据上的准确率受什么因素影响?

泛化误差:衡量模型在未知数据上的准确率(准确率越高,泛化误差越小),受模型复杂度的影响。

模型复杂度与准确率的关系,就像压力值与考试成绩的关系,压力越大或者没有压力成绩往往越低,只有压力适当时,成绩才会更高。同理,模型越复杂或越简单往往结果也会不尽人意,那我们的目标就清楚了,就是将模型不至于太复杂也不至于太简单。比如,当为模型增加复杂度时,准确率提升,泛化误差降低,那说明此时模型有些简单,反之,如果降低模型复杂度,反而准确率提升,那说明此时模型较为复杂,适当调整简单即可。

对于树模型或者树的集成模型,树的深度越深,枝叶越多,模型越复杂。往往树模型或者树的集成模型普遍较为复杂,我们需要做的就是降低复杂度,进而提升准确率。

二、 随机森林调参方向

       降低复杂度,对复杂度影响巨大的参数挑选出来,研究他们的单调性,然后专注调整那些最大限度能让复杂度降低的参数,对于那些不单调的参数或者反而让复杂度升高的参数,视情况而定,大多时候甚至可以退避。(表中从上往下,建议调参的程度逐渐减小)

 三、随机森林调参方法

 1、绘制学习曲线

       有些参数没有参照,很难说清楚范围,这种情况用学习曲线看趋势,从曲线跑出的结果中选取一个更小的区间,再跑曲线,以此类推(建议打印输出最大值及其取的值)。

#调参第一步:n_estimators
cross = []
for i  in range(0,200,10):
    rf = RandomForestClassifier(n_estimators=i+1, n_jobs=-1,random_state=42)
    cross_score = cross_val_score(rf, xtest, ytest, cv=5).mean()
    cross.append(cross_score)
plt.plot(range(1,201,10),cross)
plt.xlabel('n_estimators')
plt.ylabel('acc')
plt.show()
print((cross.index(max(cross))*10)+1,max(cross))

 

2、网格搜索

       有一些参数有一定范围,或者我们知道他们的取值和随着他们的取值模型的准确率会如何变化。在这里值得说明的一点是,网格搜索,如果一次性在参数列表中写出多个参数及对应值,它不会抛弃任何一个我们设置的参数值,会尽力组合,而有时候效果可能不太好,且费时。那建议的操作是,可以一次设定一到两个参数及其值。

from sklearn.model_selection import GridSearchCV
#调整max_depth
param_grid = {'max_depth' : np.arange(1,20,1)}
#一般根据数据大小进行尝试,像该数据集 可从1-10 或1-20开始
rf = RandomForestClassifier(n_estimators=11,random_state=42)
GS = GridSearchCV(rf,param_grid,cv=5)
GS.fit(data.data,data.target)
GS.best_params_  #最佳参数组合
GS.best_score_   #最佳得分

四、详细代码

        代码建议在jupyter notebook分段运行,因为最起码能保证划分的测试集和训练集不会变化,这样调参才有意义。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier

data = load_breast_cancer()  #乳腺癌案例
print(data.data.shape)

xtrain,xtest,ytrain,ytest = train_test_split(data.data,data.target,test_size=0.3)
# GridSearchCV
rf = RandomForestClassifier(n_estimators=100,random_state=42)
rf.fit(xtrain,ytrain)
score = rf.score(xtest,ytest)
cross_s = cross_val_score(rf,xtest,ytest,cv=5).mean()
print('rf:',score)
print('cv:',cross_s)

#调参第一步:n_estimators
cross = []
for i  in range(0,200,10):
    rf = RandomForestClassifier(n_estimators=i+1, n_jobs=-1,random_state=42)
    cross_score = cross_val_score(rf, xtest, ytest, cv=5).mean()
    cross.append(cross_score)
plt.plot(range(1,201,10),cross)
plt.xlabel('n_estimators')
plt.ylabel('acc')
plt.show()
print((cross.index(max(cross))*10)+1,max(cross))
# n_estimators缩小范围
cross = []
for i  in range(0,25):
    rf = RandomForestClassifier(n_estimators=i+1, n_jobs=-1,random_state=42)
    cross_score = cross_val_score(rf, xtest, ytest, cv=5).mean()
    cross.append(cross_score)
plt.plot(range(1,26),cross)
plt.xlabel('n_estimators')
plt.ylabel('acc')
plt.show()
print(cross.index(max(cross))+1,max(cross))

#调整max_depth
param_grid = {'max_depth' : np.arange(1,20,1)}
#一般根据数据大小进行尝试,像该数据集 可从1-10 或1-20开始
rf = RandomForestClassifier(n_estimators=11,random_state=42)
GS = GridSearchCV(rf,param_grid,cv=5)
GS.fit(data.data,data.target)
GS.best_params_
GS.best_score_

#调整max_features
param_grid = {'max_features' : np.arange(5,30,1)}
rf = RandomForestClassifier(n_estimators=11,random_state=42)
GS = GridSearchCV(rf,param_grid,cv=5)
GS.fit(data.data,data.target)
GS.best_params_
GS.best_score_

#调整min_samples_leaf
param_grid = {'min_samples_leaf' : np.arange(1,1+10,1)}
#一般是从其最小值开始向上增加10或者20
# 面对高维度高样本数据,如果不放心,也可以直接+50,对于大型数据可能需要增加200-300
# 如果调整的时候发现准确率怎么都上不来,那可以放心大胆调一个很大的数据,大力限制模型的复杂度
rf = RandomForestClassifier(n_estimators=11,random_state=42)
GS = GridSearchCV(rf,param_grid,cv=5)
GS.fit(data.data,data.target)
GS.best_params_
GS.best_score_

#调整min_samples_split
param_grid = {'min_samples_split' : np.arange(2,2+20,1)}
#一般是从其最小值开始向上增加10或者20
# 面对高维度高样本数据,如果不放心,也可以直接+50,对于大型数据可能需要增加200-300
# 如果调整的时候发现准确率怎么都上不来,那可以放心大胆调一个很大的数据,大力限制模型的复杂度
rf = RandomForestClassifier(n_estimators=11,random_state=42)
GS = GridSearchCV(rf,param_grid,cv=5)
GS.fit(data.data,data.target)
GS.best_params_
GS.best_score_

#调整criterion
param_grid = {'criterion' :['gini','entropy']}
#一般是从其最小值开始向上增加10或者20
# 面对高维度高样本数据,如果不放心,也可以直接+50,对于大型数据可能需要增加200-300
# 如果调整的时候发现准确率怎么都上不来,那可以放心大胆调一个很大的数据,大力限制模型的复杂度
rf = RandomForestClassifier(n_estimators=11,random_state=42)
GS = GridSearchCV(rf,param_grid,cv=5)
GS.fit(data.data,data.target)
GS.best_params_
GS.best_score_

希望大家有所收获,欢迎留言~

### 将YOLOv8主干网络替换为MobileNetv3 在目标检测模型中,主干网络的选择对于性能至关重要。为了提高计算效率并保持良好的精度,在YOLOv8框架下采用更轻量级的MobileNetV3作为新的骨干网是一个合理的选择[^1]。 #### 修改配置文件 首先需要调整`yolov8.yaml`中的backbone部分定义来匹配MobileNet v3结构特性: ```yaml # yolov8_custom.yaml nc: 80 # number of classes depth_multiple: 0.33 width_multiple: 0.5 ... backbone: - [Focus, c1=3, c2=16, k=3] - [Conv, c1=16, c2=16, ... ] # Replace with MobileNet V3 layers accordingly. ``` 注意这里仅展示了简化版配置片段;实际操作时应依据官方文档指导完成全部必要参数设置[^2]。 #### 编写自定义Backbone模块 由于预训练权重不兼容问题,建议重新构建适用于YOLO架构下的MobileNetV3类,并确保其输入输出维度与原有设计相吻合。可以参考如下Python代码创建相应组件: ```python import torch.nn as nn from torchvision.models.mobilenet import mobilenet_v3_large class CustomMobilenetV3(nn.Module): def __init__(self, pretrained=True): super(CustomMobilenetV3, self).__init__() base_model = mobilenet_v3_large(pretrained=pretrained) # Remove last few fully connected layers to adapt YOLO structure requirements features = list(base_model.features.children()) self.backbone = nn.Sequential(*features[:-1]) def forward(self, x): return self.backbone(x) if __name__ == "__main__": model = CustomMobilenetV3() print(model) ``` 此脚本实现了基于PyTorch库加载mobilenet_v3_large函数生成的基础版本,并移除了不适合直接用于特征提取的部分层以适应YOLO需求[^3]。 #### 训练过程中的挑战 当更换不同类型的卷积神经网络作为探测器的核心组成部分时可能会面临一些困难: - **迁移学习效果不佳**: 如果新旧两套体系差异较大,则简单复制原模型权值往往难以取得理想成绩; - **超参调优复杂度增加**: 更改基础构件后原有的优化策略未必适用,需投入更多精力探索最佳实践方案; - **硬件资源消耗变化**: 轻量化改进虽然有助于降低功耗提升速度,但也可能导致GPU利用率波动等问题发生[^4]。 通过上述步骤可以在一定程度上实现在YOLOv8基础上引入MobileNetV3的目标,但仍需针对具体应用场景不断测试验证直至满足预期指标为止。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值