目录

  • 步骤
  • 1.导入需要的库
  • 2. 导入数据集,探索数据
  • 3. 进行一次简单的建模,看看模型本身在数据集上的效果
  • 4. 随机森林调整的第一步:无论如何先来调n_estimators
  • 5. 在确定好的范围内,进一步细化学习曲线
  • 6.利用网格搜索,按照参数对模型整体准确率的影响程度进行调参,首先调整max_depth
  • 7.调整max_features
  • 8.调整min_samples_leaf
  • 9.调整min_samples_split
  • 完整代码


步骤

1.导入需要的库

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. 导入数据集,探索数据

python乳腺癌聚类 sklearn乳腺癌数据集_sklearn

3. 进行一次简单的建模,看看模型本身在数据集上的效果

#建模三步
#实例化
rfc=RandomForestClassifier(n_estimators=100,random_state=90)
#交叉验证
score_pre=cross_val_score(rfc,data.data,data.target,cv=10).mean()
score_pre

python乳腺癌聚类 sklearn乳腺癌数据集_随机森林_02

4. 随机森林调整的第一步:无论如何先来调n_estimators

"""
在这里我们选择学习曲线,可以使用网格搜索吗?可以,但是只有学习曲线,才能看见趋势
我个人的倾向是,要看见n_estimators在什么取值开始变得平稳,是否一直推动模型整体准确率的上升等信息
第一次的学习曲线,可以先用来帮助我们划定范围,我们取每十个数作为一个阶段,来观察n_estimators的变化如何
引起模型整体准确率的变化
"""
#####【TIME WARNING: 30 seconds】#####
scorel = []
for i in range(0,200,10):
    rfc = RandomForestClassifier(n_estimators=i+1,
                                 random_state=90)
    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()
#list.index([object])
#返回这个object在列表list中的索引

python乳腺癌聚类 sklearn乳腺癌数据集_数据_03

5. 在确定好的范围内,进一步细化学习曲线

scorel = []
for i in range(65,75):
    rfc = RandomForestClassifier(n_estimators=i,
                                 n_jobs=-1,
                                 random_state=90)
    score = cross_val_score(rfc,data.data,data.target,cv=10).mean()
    scorel.append(score)
#[*range(65,75)]把下标替换成对应序号的值 比方说 第一个就是65 第二个就是66.......
print(max(scorel),([*range(65,75)][scorel.index(max(scorel))]))
plt.figure(figsize=[20,5])
plt.plot(range(65,75),scorel)
plt.show()

python乳腺癌聚类 sklearn乳腺癌数据集_随机森林_04

6.利用网格搜索,按照参数对模型整体准确率的影响程度进行调参,首先调整max_depth

#调整max_depth
param_grid = {'max_depth':np.arange(1, 20, 1)}
# 一般根据数据的大小来进行一个试探,乳腺癌数据很小,所以可以采用1~10,或者1~20这样的试探
# 但对于像digit recognition那样的大型数据来说,我们应该尝试30~50层深度(或许还不足够
#   更应该画出学习曲线,来观察深度对模型的影响
rfc = RandomForestClassifier(n_estimators=73
                             ,random_state=90
                           )
    #网格搜索 参数(实例化模型,希望其进行搜索的参数,网格搜索中交叉验证的次数)*****************************************
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)

python乳腺癌聚类 sklearn乳腺癌数据集_随机森林_05

7.调整max_features

#调整max_features
param_grid = {'max_features':np.arange(5,30,1)}
"""
max_features是唯一一个即能够将模型往左(低方差高偏差)推,也能够将模型往右(高方差低偏差)推的参数。我
们需要根据调参前,模型所在的位置(在泛化误差最低点的左边还是右边)来决定我们要将max_features往哪边调。
现在模型位于图像左侧,我们需要的是更高的复杂度,因此我们应该把max_features往更大的方向调整,可用的特征
越多,模型才会越复杂。max_features的默认最小值是sqrt(n_features),因此我们使用这个值作为调参范围的
最小值。
"""
rfc = RandomForestClassifier(n_estimators=73
                             ,random_state=90
                           )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)

python乳腺癌聚类 sklearn乳腺癌数据集_python_06

8.调整min_samples_leaf

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

python乳腺癌聚类 sklearn乳腺癌数据集_数据_07


可以发现此时 调整leaf已经没啥用处

9.调整min_samples_split

#调整min_samples_split
param_grid={'min_samples_split':np.arange(2, 2+20, 1)}
rfc = RandomForestClassifier(n_estimators=39
                             ,random_state=90
                           )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)

python乳腺癌聚类 sklearn乳腺癌数据集_数据_08


调完反而下降所以没用

完整代码

python乳腺癌聚类 sklearn乳腺癌数据集_python乳腺癌聚类_09