随机森林在乳腺癌数据上的调参
应用机器学习调参方法和思路。
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降低了模型的泛化误差。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义