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

应用机器学习调参方法和思路。

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
# 导入数据集
data = load_breast_cancer()
print(data.data.shape)
print(data.target.shape)

 

 

# 建模查看初始效果
rfc = RandomForestClassifier(n_estimators=100,random_state=20)
score_ = cross_val_score(rfc,data.data,data.target,cv=10).mean()
score_
# 该数据集表现很好,现实不大可能

 

 

参数对模型在未知数据上的评估性能的影响(影响程度由高到低):

n_estimators,max_depth,min_samples _leaf ,min_samples _split,max_features,criterion。

max_features是唯一一个让模型可以既简单也可以复杂的参数;其他都是为了降低复杂度。

复制代码
# 调参第一步 n_estimators
# 因为学习曲线可以看见趋势,所以选择学习曲线来调参
scorel = []
for i in range(0,200,10):
    rfc = RandomForestClassifier(n_estimators=i+1,
                                 n_jobs=-1,
                                 random_state=20)
    score = cross_val_score(rfc,data.data,data.target,cv=10).mean()
    scorel.append(score)

print(max(scorel),scorel.index(max(scorel))*10+1)    
plt.figure(figsize=(20,5))
plt.plot(range(1,201,10),scorel)
plt.show()
复制代码

 

 

复制代码
# 在确定好的范围下继续细化学习曲线
scorel = []
for i in range(65,76):
    rfc = RandomForestClassifier(n_estimators=i,
                                 n_jobs=-1,
                                 random_state=20)
    score = cross_val_score(rfc,data.data,data.target,cv=10).mean()
    scorel.append(score)

print(max(scorel),([*range(65,76)][scorel.index(max(scorel))]))   
plt.figure(figsize=(20,5))
plt.plot(range(65,76),scorel)
plt.show()
复制代码

 

 

复制代码
# max_depth 网格搜索
param_grid = {'max_depth':np.arange(1,20,1)}
# 一般根据数据的大小来进行一个试探,乳腺癌数据很小,所以可以采用1~10,或者1~20这样的试探
# 但对于像digit recognition那样的大型数据来说,我们应该尝试30~50层深度(或许还不足够
# 更应该画出学习曲线,来观察深度对模型的影响
rfc = RandomForestClassifier(n_estimators=71,
                            n_jobs=-1,
                            random_state=20)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
print(GS.best_params_)
print(GS.best_score_)
# 模型整体准确率下降了,泛化误差上升,且偏差增大,所以模型现在位于最低点左边
复制代码

 

 

复制代码
# max_features寻求更高的模型复杂度
param_grid = {'max_features':np.arange(5,30,1)}
rfc = RandomForestClassifier(n_estimators=71,
                            n_jobs=-1,
                            random_state=20)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
print(GS.best_params_)
print(GS.best_score_)
# 模型选择max_features的最小值,说明max_features升高,复杂度上升,
# 准确率下降,泛化误差上升,模型在往右走,即max_features和max_depth之前
# 就已经达到了泛化误差最低点,剩下的误差是由噪声决定的。
复制代码

 

 

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

 

 

复制代码
# min_samples_split
param_grid = {'min_samples_split':np.arange(2,2+20,1)}
rfc = RandomForestClassifier(n_estimators=71,
                            n_jobs=-1,
                            random_state=20)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)

print(GS.best_params_)
print(GS.best_score_)
# min_samples_split调参后模型出乎意料的有了进步
复制代码

 

 

复制代码
# Criterion
param_grid = {'criterion':['gini','entropy']}
rfc = RandomForestClassifier(n_estimators=71,
                            n_jobs=-1,
                            random_state=20)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
print(GS.best_params_)
print(GS.best_score_)
复制代码

 

 

# 综上,总结出模型的最佳参数
rfc = RandomForestClassifier(n_estimators=71,random_state=20
                             ,min_samples_split=5
                            )
score = cross_val_score(rfc,data.data,data.target,cv=10).mean()
print(score)
print(score-score_)

 

 综上,在本次调参过程中,只有n_estimators和min_samples_split降低了模型的泛化误差。

 

posted @   Yalking  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示