目录
随机森林概念
RF使用了CART决策树作为弱学习器,并行的训练出多棵互相独立的树,最后通过投票得出结果,进一步在决策树的训练过程中引入了随机特征选择和样本选择。
RF有两个随机采样过程:
行采样:采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本
列采样: 从M个feature中,选择m个(m << M)
通过样本的随机采样和特征的随机采样,RF的鲁棒性非常好,RF包括四个部分:
1,随机选择样本(放回抽样);
2,随机选择特征;
3,构建决策树;
4,分类:随机森林投票。回归:平方误差最小化。
缓解了树模型方差大的特点,方差减小,而且方差的减小补偿了偏差的增大,因此总体而言是更好的模型。
在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。
特征重要性度量
RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。
优缺点
优点:
1)在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);
2)能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性;
3)容易做成并行化方法。
缺点:
在噪声较大的分类或者回归问题上会过拟合。
参数
主要步骤:第一步调整RF框架内决策树的数量,第二是调整框架内决策树的参数(选择的最大特征数量,一般为根号N)
n_estimators : integer, optional (default=10),树的棵树
criterion : string, optional (default="gini"),分裂标准,不同分裂标准对应不同基模型
max_features : int, float, string or None, optional (default="auto",log,none),寻找最佳分裂点时要考虑的样本数目,默认为开方,log(nfeatures,2),none=nfeatures
max_depth : integer or None, optional (default=None),树的最大深度,如果没有则节点被扩展到完全纯净
min_samples_split : int, float, optional (default=2),分裂时所需最少样本数目
min_samples_leaf : int, float, optional (default=1),叶子节点上最少样本数,预剪枝相关
min_weight_fraction_leaf : float, optional (default=0.)
random_state: 理解
网格搜索及交叉验证调优:详解
代码:超参数选择
#模型和数据
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
#网评价指标
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_auc_score
#网格搜索
from sklearn.model_selection import GridSearchCV
#------------------数据载入
data = load_iris()
X=data.data
Y=data.target
#------------------默认参数
'''
oob_score:是否采用袋外样本来评估模型的好坏,True代表是,默认值False,袋外样本误差是测试数据集误差的无偏估计,所以推荐设置True。
'''
RFClassifier = RandomForestClassifier(oob_score=True,random_state=10)
RFClassifier.fit(X,Y)
print(RFClassifier.oob_score_)
#------------------网格搜索+交叉验证 选择外层树的个数
param_grad = {"n_estimators":range(1,101,10)}
gard_search = GridSearchCV(RandomForestClassifier(random_state=10), param_grad, scoring='accuracy', cv = 5)
gard_search.fit(X, Y)
print(gard_search.cv_results_['mean_test_score'])#模型在不同参数下的分数(交叉验证的均值,每个参数都进行5交叉验证)
print(gard_search.best_params_)#最好的模型参数
print("best accuracy:%f" % gard_search.best_score_)#最好的模型对应分数
#------------------网格搜索+交叉验证 选择内部树的参数
param_grad1 = {"max_features":range(1,4,1)}
gard_search1 = GridSearchCV(RandomForestClassifier(n_estimators=41 ,random_state=10), param_grad1, scoring='accuracy', cv = 5)
gard_search1.fit(X, Y)
print(gard_search1.cv_results_['mean_test_score'])#模型在不同参数下的分数(交叉验证的均值,每个参数都进行5交叉验证)
print(gard_search1.best_params_)#最好的模型参数
print("best accuracy:%f" % gard_search1.best_score_)#最好的模型对应分数
#------------------确定最终的参数 n = 41, ,max_featres = 3
final_rf = RandomForestClassifier(n_estimators=41, max_features=3, oob_score=True, random_state=10)
final_rf.fit(X,Y)
#训练精度
print(final_rf.score(X,Y))
#泛化精度:
print(final_rf.oob_score_)