import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
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
一、数据类型查看
data = load_breast_cancer()
# data data.data.shape 569 * 30 data.target (569,) 0,1二分类
二、模型建立
rfc = RandomForestClassifier(n_estimators=100,random_state=10) # 实例化
score_pre = cross_val_score(rfc,data.data,data.target,cv=10).mean() # 交叉验证
score_pre
三、随机森林调参第一步:调n_estimators画学习曲线
# 确定一个大概范围
score1 =[]
for i in range(0,200,10):
rfc = RandomForestClassifier(n_estimators=i+1
,n_jobs=-1
,random_state=5)
score=cross_val_score(rfc,data.data,data.target,cv=10).mean()
score1.append(score)
print(max(score1),(score1.index(max(score1))*10)+1)
plt.figure(figsize=[20,5])
plt.plot(range(1,201,10),score1)
plt.show()
# 确定精确范围
score1 =[]
for i in range(65,75):
rfc = RandomForestClassifier(n_estimators=i+1
,n_jobs=-1
,random_state=5)
score=cross_val_score(rfc,data.data,data.target,cv=10).mean()
score1.append(score)
print(max(score1),([*range(65,75)][score1.index(max(score1))]+1)) # 注意返回值的索引更改
plt.figure(figsize=[20,5])
plt.plot(range(66,76),score1)
plt.show()
四、为网格搜索做准备,能将范围缩小的尽量将范围缩小
-
适合先用学习曲线得到一个小区间的参数
- n_estimators : \qquad np.arange(0,200,10)
- max_depth : \qquad np.arange(1,20)
- max_leaf_nodes : \qquad np.arange(25,50)
-
适合用网格搜索的参数:知道范围,或者说知道随着取值的变化模型怎么变化
- criterion : \qquad [‘gini’,‘entropy’]
- min_samples_split : \qquad np.arange(2,2+20)
- min_samples_leaf : \qquad np.arange(1,1+10)
- max_features : \qquad np.arange(5,30)
4.1、 调整max_depth
# 小数据集可以采用1-10,或者1-20 大数据集采用30-50,甚至更多
# 画学习曲线观察
param_grid = {'max_depth':np.arange(1,20)}
rfc = RandomForestClassifier(n_estimators=71
,random_state=5
)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
4.2、调整max_features 默认为sqrt(n_features) sqrt(30)
# max_features是唯一能够将模型往左又往右推的参数
# 先确定当前模型在哪个位置,再决定往哪边推
param_grid = {'max_features':np.arange(5,30)}
rfc = RandomForestClassifier(n_estimators=71
,random_state=5
)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
4.3、调整两个关于叶子的参数与上面方式一样
4.4、调整criterion
param_grid = {'criterion':['gini','entropy']}
rfc = RandomForestClassifier(n_estimators=71
,random_state=5
)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)