一、随机森林参数调整概览

局部解释:
分裂所需最小样本数:设定后,若当前节点样本过小,则不进行分类。
叶节点最小样本数:顾名思义。
max越大,模型趋于过拟合。min越大,模型趋于欠拟合。

<center>调参
调参

二、前期准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 以下代码是导入这个数据集
# 注意data返回的是一个字典
from sklearn.datasets import load_iris
data = load_iris()
X = data['data'] # 确定参数
y = data['target'] # 确定目标
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.1,random_state = 0)

# 准备库
from sklearn.model_selection import GridSearchCV # 网格搜索库
from sklearn.model_selection import RandomizedSearchCV # 随机网格搜索库
from skopt import BayesSearchCV # 贝叶斯搜索库
'''
这三个都是常用的筛选最优参数的库
'''
from sklearn.ensemble import RandomForestClassifier # 随机森林分类库
from sklearn.metrics import accuracy_score # 评价指标库
from sklearn.metrics import make_scorer #
from sklearn.linear_model import LogisticRegression # 逻辑回归库
from sklearn.model_selection import cross_val_score # 交叉验证库
import numpy as np
import time
import warnings
warnings.filterwarnings("ignore") # 忽略一下警告

三、网格搜索

  • 网格搜索即为暴力枚举,把所有情况都遍历一遍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'''
逻辑斯特调参
'''
start = time.time() # 计算时间,开始时间
lr = LogisticRegression() # 实例化模型
params = {'C':[0.1,1,10,100],'penalty':['l1','l2']} # 参数

# 实例化网格搜索,参数:模型、参数、交叉验证五折、根据accuracy_score进行判断
gs_lr = GridSearchCV(estimator = lr,param_grid = params,cv = 5,scoring = make_scorer(accuracy_score))

gs_lr.fit(X_train,y_train) # 训练数据
end = time.time() # 结束时间
print(gs_lr.best_params_) # 查看下最优参数
print(gs_lr.best_score_) # 查看下最优参数下的指标情况,也就是训练集准确率
print('网格搜索所消耗的时间为:%.3f S'% float(end - start))

gs_lr.score(X_test,y_test) # 查看测试集的准确率
gs_lr.predict(X_test) # 做预测
gs_lr.cv_results_ # 查看调参的过程


'''
随机森林调参
'''
start = time.time() # 计算时间,开始时间
rfc = RandomForestClassifier(random_state = 0) # 实例化模型,设置种子,避免影响
params = {'n_estimators':list(range(10,200,40)),'max_depth':list(range(10,200,40))} # 参数

# 实例化网格搜索,参数:模型、参数、交叉验证五折、根据accuracy_score进行判断
gs_rfc = GridSearchCV(estimator = rfc,param_grid = params,cv = 5,scoring = make_scorer(accuracy_score)) # make_scorer默认越大越好,如果是线性回归则应该让mse越小越好,使用make_scorer(mean_absolute_error,greater_is_better=False)。


gs_rfc.fit(X_train,y_train) # 训练数据
end = time.time() # 结束时间
print(gs_rfc.best_params_) # 查看最优参数
print(gs_rfc.best_score_) # 查看最优参数下的指标情况
print('网格搜索所消耗的时间为:%.3f S'% float(end - start))


gs_rfc.score(X_test,y_test) # 查看测试集的准确率
gs_rfc.predict(X_test) # 做预测
gs_rfc.cv_results_ # 查看调参的过程

# 缩小范围,多次重复,即可得到更准确的最优参数。

四、随机网格搜索

  • 区别于随机网络搜索,会将随机组合中最可能的组合挑出来进行测试,速度更快。
  • 适用于非常多参数的情况,网格搜索无法解决的时候,用于缩小区间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'''
以随机森林为例
'''
start = time.time() # 计算时间,开始时间
rfc = RandomForestClassifier(random_state = 0) # 实例化模型,设置种子,避免影响
params = {'n_estimators':list(range(10,200,40)),'max_depth':list(range(10,200,40))} # 参数

# 实例化网格搜索,参数:模型、参数、交叉验证五折、根据accuracy_score进行判断
gs_rfc = RandomizedSearchCV(estimator = rfc,param_distributions = params,cv = 5,scoring = make_scorer(accuracy_score))


gs_rfc.fit(X_train,y_train) # 训练数据
end = time.time() # 结束时间
print(gs_rfc.best_params_) # 查看最优参数
print(gs_rfc.best_score_) # 查看最优参数下的指标情况
print('随机网格搜索所消耗的时间为:%.3f S'% float(end - start))


gs_rfc.score(X_test,y_test) # 查看测试集的准确率
gs_rfc.predict(X_test) # 做预测
gs_rfc.cv_results_ # 查看调参的过程

五、贝叶斯搜索

  • 利用迭代,类似于梯度下降法,寻找最优参数。
  • 比随机网格慢一些。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'''
以随机森林为例
'''
start = time.time() # 计算时间,开始时间
rfc = RandomForestClassifier(random_state = 0) # 实例化模型,设置种子,避免影响
params = {'n_estimators':list(range(10,200,40)),'max_depth':list(range(10,200,40))} # 参数

# 实例化网格搜索,参数:模型、参数、交叉验证五折、根据accuracy_score进行判断、迭代次数
gs_rfc = BayesSearchCV(rfc,params,cv = 5,scoring = make_scorer(accuracy_score),n_iter = 40)


gs_rfc.fit(X_train,y_train) # 训练数据
end = time.time() # 结束时间
print(gs_rfc.best_params_) # 查看最优参数
print(gs_rfc.best_score_) # 查看最优参数下的指标情况
print('随机网格搜索所消耗的时间为:%.3f S'% float(end - start))


gs_rfc.score(X_test,y_test) # 查看测试集的准确率
gs_rfc.predict(X_test) # 做预测
gs_rfc.cv_results_ # 查看调参的过程

六、嵌套交叉验证

  • 了解查全率、召回率波动范围。
1
2
3
4
5
# 交叉验证
scores = cross_val_score(gs_rfc,X_train,y_train,scoring = 'accuracy',cv = 10)
np.mean(scores) # 平均准确率
np.std(scores) # 波动性
print('CV accuracy:%.3f +/- %.3f'%(np.mean(scores),np.std(scores)))