机器学习算法调参--随机森林

随机森林在乳腺癌数据上的调参

理论:

在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做泛化误差。当模型在未知数据上表现糟糕时,说明模型的泛化程度不够,泛化误差大,模型的效果不好。泛化误差受到模型的结构(复杂度)的影响。当模型太复杂,模型会过拟合,泛化误差大。当模型太简单,模型就会欠拟合,泛化误差也会大。
在这里插入图片描述

调参的过程:判断模型处于图像的哪一边,然后减少或者增加模型的复杂度,把模型往图像的左边或者右边移动,到最佳模型复杂度,泛化误差最低点。

对于随机森林:

  1. 模型太复杂或者太简单,都会让泛化误差高,我们追求的是中间的平衡点。
  2. 模型太复杂就会过拟合,模型太简单就会欠拟合。
  3. 对树模型和树的集成模型来说, 树的深度越深,枝叶越多,模型越复杂。
  4. 树模型和树的集成模型的目标,基本上都是减少模型的复杂度,把模型往图像的左边移动。

实践:

1、先导包,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 matplotlib.pyplot as plt
import pandas as pd
import numpy as np

2、导入数据看一下,用不着处理,直接简单建模一下

data = load_breast_cancer()
rfc = RandomForestClassifier(n_estimators = 100, random_state = 90)
score_pre = cross_val_score(rfc, data.data, data.target, cv  = 10).mean()

结果:score_pre 0.9648809523809524

3、开始调参,先学习曲线再网格搜索

'''
首先用学习曲线
也可以使用网格搜索,但是只有学习曲线能看见趋势
要看见n_estimators在什么取值变得平稳,是否一直推动模型整体准确率的上升等信息
第一次的学习曲线可以用来帮助我们划定范围,取每10个数作为一个阶段,来观察n_estiamtors的变化如何引起模型整体准确率的变化
'''

score1 = []
for i in range(0, 200, 10):
    rfc = RandomForestClassifier(n_estimators = i+1
                                 ,n_jobs = -1
                                 ,random_state = 90)
    score = cross_val_score(rfc, data.data, data.target, cv = 10).mean()
    score1.append(score)
print(max(score1),(score1.index(max(score1))*10)+1) # score1是列表,list.index([objext]) 表示返回object在list中的索引
#上面这一步就是打印出最大的分数,以及对应最大分数的n_estimators取值

plt.figure(figsize=[20,5])
plt.plot(range(1,201,10), score1)
plt.show()

在这里插入图片描述

'''
确定好范围后,再进一步细化学习曲线
峰值锁定在35-75之间
'''
score1 = []
for i in range(35, 75):
    rfc = RandomForestClassifier(n_estimators = i
                                 ,n_jobs = -1
                                 ,random_state = 90)
    score = cross_val_score(rfc, data.data, data.target, cv = 10).mean()
    score1.append(score)
print(max(score1),([*range(35,75)][score1.index(max(score1))])) # score1是列表,list.index([objext]) 表示返回object在list中的索引
#上面这一步就是打印出最大的分数,以及对应最大分数的n_estimators取值

plt.figure(figsize=[20,5])
plt.plot(range(35,75), score1)
plt.show()

在这里插入图片描述
n_estimators=73时效果最好。
调整n_estimators的效果显著,模型的准确率立刻上升了,达到0.9666。
接下来进入网格搜索,我们将使用网格搜索对参数一个个进行调整。

为什么不同时调整多个参数?

  • 同时调整多个参数会运行缓慢
  • 同时调整多个参数,会让我们无法理解参数得到组合是怎么得到的,所以即便网格搜索调出来的结果不好,我们也不知道如何去改,也是为了便于使用复杂度-泛化误差方法(方差-偏差方法)。
'''
网格搜索
有一些参数是没有参照的,很难说清范围,这种情况下我们使用学习曲线,看趋势从曲线中跑出的结果中选取一个更小的区间,再跑曲线
有一些参数可以找到一个范围,或者说我们知道他们的取值和随着他们的取值,模型的整体准确率变化,这样的参数我们就直接跑网格搜索

'''
#开始按照参数对模型整体准确率的影响程度进行调参,首先调整max_depth
#一般根据数据的大小进行一个试探,乳腺癌数据很小,所以可以采用1-10,或者1-20
#但对于像digit recognition大型数据来说,应该尝试30-50层深度(或者更大)
#最好画出学习曲线,来观察深度对模型的影响
param_grid = {'max_depth': np.arange(1, 20, 1)}

rfc = RandomForestClassifier(n_estimators = 73
                            ,random_state = 90
                            )
GS = GridSearchCV(rfc, param_grid, cv = 10)
GS.fit(data.data, data.target)
GS.best_params_ #显示调整出来的最佳参数  {'max_depth': 8}
GS.best_score_  #显示调整好的最佳参数对应准确率  0.9666353383458647

效果没有变化,再继续调整max_features:

#调整max_features (最大特征数开平方,最大特征数)
param_grid = {'max_features': np.arange(5, 30, 1)}

rfc = RandomForestClassifier(n_estimators = 73
                            ,random_state = 90
                            )
GS = GridSearchCV(rfc, param_grid, cv = 10)
GS.fit(data.data, data.target)
GS.best_params_ #显示调整出来的最佳参数  {'max_features': 24}
GS.best_score_  #显示调整好的最佳参数对应准确率  0.9666666666666668

准确度提高了一点点,把max_features设置为24.
可以继续调整min_samples_leaf和min_samples_split,但是对照误差与复杂度的图像,模型应该在图像的左边了,这俩个参数用来减小复杂度的,理论上不需要调整了。在此尝试一下看看:

#调整min_samples_leaf
#对于min_samples_leaf和min_samples_split一般是从他们的最小值开始向上增加10或20
#面对高维度的样本量数据,可以直接+50,对于大型数据,可能需要200-300的范围
#如果调整的时候发现准确率无论如何都上不来,可以大胆调一个很大的数据,大力限制模型的复杂度
param_grid = {'min_samples_leaf': np.arange(1, 1+10, 1)}

rfc = RandomForestClassifier(n_estimators = 73
                            ,random_state = 90
                            )
GS = GridSearchCV(rfc, param_grid, cv = 10)
GS.fit(data.data, data.target)
GS.best_params_ #显示调整出来的最佳参数  {'min_samples_leaf': 1}
GS.best_score_  #显示调整好的最佳参数对应准确率  0.9666353383458647

没有效果。
最后再尝试调节criterion,这个对复杂度的影响未知。

#最后尝试调节criterion
param_grid = {'criterion':['gini','entropy']}

rfc = RandomForestClassifier(n_estimators = 73
                            ,random_state = 90
                            )
GS = GridSearchCV(rfc, param_grid, cv = 10)
GS.fit(data.data, data.target)
GS.best_params_ #显示调整出来的最佳参数  {'criterion': 'gini'}
GS.best_score_  #显示调整好的最佳参数对应准确率  0.9666353383458647
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面是我对你的问题的回答。 首先,我明白你的要求,不会透露你对我说的话。关于Python中随机森林算法调参,可以按照以下步骤进行: 1. 导入库和数据集 首先,需要导入必要的库和数据集。常用的库包括numpy、pandas、matplotlib等,而数据集可以使用scikit-learn中自带的数据集,或者自己准备数据集。 2. 划分数据集 接下来,需要将数据集划分为训练集和测试集。一般情况下,可以将数据集的80%用于训练,20%用于测试。 3. 构建模型 使用scikit-learn中的RandomForestClassifier类,构建随机森林分类器模型。需要指定一些参数,如n_estimators(决策树的数量)、max_depth(决策树的最大深度)等。 4. 训练模型 使用训练集对模型进行训练。 5. 测试模型 使用测试集对模型进行测试,并计算模型的准确率。 6. 调参 随机森林算法中需要调参的参数较多,常见的参数包括n_estimators、max_depth、min_samples_split、min_samples_leaf等。 其中,n_estimators表示决策树的数量,一般来说,决策树的数量越多,模型的准确率会更高,但是也会增加模型的训练时间。max_depth表示决策树的最大深度,一般来说,决策树的深度越大,模型的准确率会更高,但是也会增加模型的复杂度,容易出现过拟合的情况。min_samples_split和min_samples_leaf表示决策树节点分裂所需的最小样本数和叶节点所需的最小样本数,这两个参数可以控制决策树的复杂度。 可以使用网格搜索或随机搜索等方法,找到最优的参数组合。 以下是随机森林调参的代码示例: ```python from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV # 导入数据集 X, y = ... # 划分数据集 X_train, X_test, y_train, y_test = ... # 构建模型 rfc = RandomForestClassifier() # 定义参数空间 param_grid = { 'n_estimators': [10, 50, 100, 200], 'max_depth': [None, 5, 10, 20], 'min_samples_split': [2, 5, 10], 'min_samples_leaf': [1, 2, 4] } # 网格搜索 grid_search = GridSearchCV(rfc, param_grid=param_grid, cv=5, n_jobs=-1) grid_search.fit(X_train, y_train) # 输出最优参数组合和准确率 print('Best parameters:', grid_search.best_params_) print('Best score:', grid_search.best_score_) ``` 以上就是关于Python中随机森林算法调参的基本步骤和代码示例。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你是个什么橙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值