import numpy as np
import pandas as pd
import sklearn
import matplotlib as mlp
import seaborn as sns
import re, pip, conda
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.tree import DecisionTreeRegressor as DTR
from sklearn.model_selection import cross_validate, KFold
类型 | 参数 |
---|---|
弱分类器数量 | n_estimators |
弱分类器的训练数据 | bootstrap, oob_score, max_samples, max_features, random_state |
弱分类器结构 | criterion, max_depth, min_samples_split, min_samples_leaf, min_weight_fraction_leaf, max_leaf_nodes, min_impurity_decrease |
其他 | n_jobs, verbose, ccp_alpha |
类型 | 参数 |
---|---|
弱分类器结构 | criterion:弱评估器分枝时的不纯度衡量指标 max_depth:弱评估器被允许的最大深度,默认None min_samples_split:弱评估器分枝时,父节点上最少要拥有的样本个数 min_samples_leaf:弱评估器的叶子节点上最少要拥有的样本个数 min_weight_fraction_leaf:当样本权重被调整时,叶子节点上最少要拥有的样本权重 max_leaf_nodes:弱评估器上最多可以有的叶子节点数量 min_impurity_decrease:弱评估器分枝时允许的最小不纯度下降量 |
criterion
与 feature_importances_
与分类树中的信息熵/基尼系数不同,回归树中的 criterion 可以选择"squared_error"(平方误差),“absolute_error”(绝对误差)以及"poisson"(泊松偏差)。对任意样本 i i i 而言, y i y_i yi 为真实标签, y i ^ \hat{y_i} yi^ 为预测标签,则各个 criterion 的表达式为:max_depth
是最粗犷的剪枝方式,从树结构层面来看,对随机森林抗过拟合能力影响最大的参数。max_depth 的默认值为 None,也就是不限深度。因此当随机森林表现为过拟合时,选择一个小的 max_depth 会很有效。max_leaf_nodes
与 min_sample_split
是比 max_depth
更精细的减枝方式,但限制叶子数量和分枝,既可以实现微调,也可以实现大刀阔斧的剪枝。max_leaf_nodes 的默认值为 None,即不限叶子数量。min_sample_split 的默认值为 2,等同于不限制分枝。min_impurity_decrease
最精细的减枝方式,可以根据不纯度下降的程度减掉相应的叶子。默认值为 0,因此是个相当有空间的参数。n_estimators
是森林中树木的数量,即弱评估器的数量,在 sklearn 中默认 100,它是唯一一个对随机森林而言必填的参数。n_estimators 对随机森林模型的精确程度、复杂度、学习能力、过拟合情况、需要的计算量和计算时间都有很大的影响,因此 n_estimators 往往是我们在调整随机森林时第一个需要确认的参数。def RMSE(cvresult,key):
return (abs(cvresult[key])**0.5).mean()
reg_f = RFR(n_estimators=3)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
result_f = cross_validate(reg_f,X,y,cv=cv,scoring="neg_mean_squared_error"
,return_train_score=True
,verbose=True
,n_jobs=-1)
#[Parallel(n_jobs=-1)]: Using backend LokyBackend with 16 concurrent workers.
#[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 0.8s finished
RMSE(result_f,"test_score")
#36398.0444570051
reg_f = RFR(n_estimators=100)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
result_f = cross_validate(reg_f,X,y,cv=cv,scoring="neg_mean_squared_error"
,return_train_score=True
,verbose=True
,n_jobs=-1)
#[Parallel(n_jobs=-1)]: Using backend LokyBackend with 16 concurrent workers.
#[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 1.9s finished
RMSE(result_f,"test_score")
#30156.835268943938
reg_f = RFR(n_estimators=500)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
result_f = cross_validate(reg_f,X,y,cv=cv,scoring="neg_mean_squared_error"
,return_train_score=True
,verbose=True
,n_jobs=-1)
#[Parallel(n_jobs=-1)]: Using backend LokyBackend with 16 concurrent workers.
#[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 7.1s finished
RMSE(result_f,"test_score")
#30305.720408696703
类型 | 参数 |
---|---|
弱分类器数量 | n_estimators:弱评估器的数量 |
bootstrap
参数的输入为布尔值,默认 True,控制是否在每次建立决策树之前对数据进行随机抽样。如果设置为 False,则表示每次都使用全部样本进行建树,如果为 True,则随机抽样建树。max_samples
次,一次也没有抽到该样本的概率就是 ( 1 − 1 m ) m a x _ s a m p l e s (1-\frac{1}{m})^{max\_samples} (1−m1)max_samples。max_samples
时,公式可以被修改为: 1 − ( 1 − 1 m ) m 1-(1-\frac{1}{m})^{m} 1−(1−m1)moob_score
和 max_samples
,其中:oob_score
控制是否使用袋外数据进行验证,输入为布尔值,默认为 False,如果希望使用袋外数据进行验证,修改为 True 即可。max_samples
表示自助集的大小,可以输入整数、浮点数或 None,默认为 None。oob_score_
来查看我们的在袋外数据上测试的结果,遗憾的是我们无法调整 oob_score_
输出的评估指标,它默认是 R2。reg = RFR(n_estimators=20
, bootstrap=True #进行随机抽样
, oob_score=True #按袋外数据进行验证
, max_samples=500
).fit(X,y)
#D:\ProgramData\Anaconda3\lib\site-packages\sklearn\base.py:445: UserWarning: X does not have #valid feature names,
#but RandomForestRegressor was fitted with feature names
# warnings.warn(
#重要属性oob_score_
reg.oob_score_ #在袋外数据上的R2为83%
#0.8254774869029703
reg = RFR(n_estimators=20
, bootstrap=False
, oob_score=True
, max_samples=500).fit(X,y) #直接无法运行,因为boostrap=False时oob_score分数根本不存在
-
reg = RFR(n_estimators=20
, bootstrap=True #允许抽样
, oob_score=False #但不进行计算
, max_samples=500).fit(X,y)
reg.oob_score_ #虽然可以训练,但oob_score无法被调用
max_features
数据抽样还有另一个维度:对特征的抽样。在学习决策树时,我们已经学习过对特征进行抽样的参数 max_features,在随机森林中 max_features 的用法与决策树中完全一致,其输入也与决策树完全一致:sqrt_ = []
log_ = []
for n_features in range(1,101,2):
sqrt_.append(np.sqrt(n_features))
log_.append(np.log2(n_features))
xaxis = range(1,101,2)
plt.figure(figsize=(8,6),dpi=80)
#RMSE
plt.plot(xaxis,sqrt_,color="green",label = "sqrt(n)")
plt.plot(xaxis,log_,color="orange",label = "log2(n)")
plt.xticks(range(1,101,10))
plt.legend()
plt.show()
random_state
。list_ = [1,2,3,4,5]
import random
random.sample(list_,k=3) #随机从列表中抽取样本,抽取3个
#random.seed是random模块中的随机数种子,等同于sklearn中的random_state
random.seed(0) #0号规则
random.sample(list_,k=3)
random.seed(2)
random.sample(list_,k=3)
random.seed(1412)
random.sample(list_,k=3)
random.seed(2333)
random.sample(list_,k=3)
import pandas as pd
import random
list_ = [1,2,3,4,5]
list_p = pd.Series(list_)
list_p
#0 1
#1 2
#2 3
#3 4
#4 5
#dtype: int64
#random中的随机抽样
random.seed(1)
random.sample(list_,k=3)
#[2, 1, 5]
#pandas中的随机抽样
list_p.sample(n=3,random_state=1).values
#array([3, 2, 5], dtype=int64)
类型 | 参数 |
---|---|
弱分类器的训练数据 | bootstrap:是否对样本进行随机抽样 oob_score:如果使用随机抽样,是否使用袋外数据作为验证集 max_samples:如果使用随机抽样,每次随机抽样的样本量 max_features:随机抽取特征的数目 random_state:控制一切随机模式 |
类型 | 参数 |
---|---|
其他 | n_jobs:允许调用的线程数 verbose:打印建树过程 ccp_alpha:结构风险$ |