首页 > 其他分享 >随机森林在乳腺癌数据上的调参

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

时间:2023-01-24 23:33:06浏览次数:43  
标签:GS 乳腺癌 调参 rfc score 随机 print 20 data

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

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降低了模型的泛化误差。

 

标签:GS,乳腺癌,调参,rfc,score,随机,print,20,data
From: https://www.cnblogs.com/shi-yi/p/17066533.html

相关文章

  • 随机算法之水塘抽样算法
    本文首发:随机算法之水塘抽样算法读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:382.链表随机节点(中等)398.随机数索引(中等)-----------我最近在力扣上做到两道......
  • 谈谈游戏中的随机算法
    本文首发:谈谈游戏中的随机算法读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:382.链表随机节点398.随机数索引384.打乱数组-----------没事儿的时候我喜欢......
  • 基于A星和dijkstra算法的障碍物规避matlab仿真,可以设置行列数,随机产生障碍物
    1.算法概述Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止(BFS、pr......
  • 基于A星和dijkstra算法的障碍物规避matlab仿真,可以设置行列数,随机产生障碍物
    1.算法概述       Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到......
  • 随机森林
    一、随机森林分类器关键词:决策树、随机森林分类、print标准格式、交叉验证、plot、scipy-comb、确保随机性、常用接口。1.1导入库和数据集fromsklearn.treeimportDe......
  • 4个随机字母和1个随机数字
    packagecom.fqs.demo;importjava.util.Random;publicclassYZM{publicstaticvoidmain(String[]args){//随机输出前四位字母后一位数字......
  • 04常用random随机函数
    importnumpyasnpnp.random.seed(666)print(np.random.rand(5))print(np.random.rand(3,4))print(np.random.rand(2,3,4))print('*****************************......
  • 随机数 abAB+数字
    packagecom.fqs.demo;importjava.util.Random;publicclassCharAB{//输出26个小写字母和26个大写字母publicstaticvoidmain(String[]args){......
  • Python学习笔记-常用模块介绍--random随机数函数
    1.random模块基本使用importrandomprint(random.random())#(0,1)----float大于0且小于1之间的小数print(random.randint(1,3))#[1,3]大于等于1且小......
  • string 接收 char 随机数abcd
    packagecom.fqs.demo;importjava.util.Random;publicclassCharAB{//输出26个小写字母和26个大写字母publicstaticvoidmain(String[]args){......