sklearn.ensemble.RandomForestClassifier 随机深林参数详解
随机森林是一种元估计量,它适合数据集各个子样本上的许多决策树分类器,并使用平均数来提高预测准确性和控制过度拟合。子样本大小由max_samples参数bootstrap=True (default)控制,否则整个数据集用于构建每棵树
随机森林优势
- 随机森林算法几乎不需要输入的准备。它们不需要测算就能够处理二分特征、分类特征、数值特征的数据。随机森林算法能完成隐含特征的选择,并且提供一个很好的特征重要度的选择指标。
- 随机森林算法训练速度快。性能优化过程刚好又提高了模型的准确性,这种精彩表现并不常有,反之亦然。这种旨在多样化子树的子设定随机特征,同时也是一种突出的性能优化!调低给定任意节点的特征划分,能让你简单的处理带有上千属性的数据集。(如果数据集有很多行的话,这种方法同样的也可以适用于行采样)
- 随机森林算法很难被打败。针对任何给定的数据集,尽管你常能找到一个优于它的模型(比较典型的是神经网络或者一些增益算法 boosting algorithm),但这类算法肯定不多,而且通常建这样的模型并调试好要比随机森林算法模型要耗时的更多。这也是为何随机森林算法作为基准模型表现出色的原因。
- 建立一个差劲的随机森林模型真的很难!因为随机森林算法对指定使用的超参数(hyper-parameters )并不十分敏感。为了要得到一个合适的模型,它们不需要做很多调整。只需使用大量的树,模型就不会产生很多偏差。大多数的随机森林算法的实现方法的参数设置初始值也都是合理的。
- 通用性。随机森林算法可以应用于很多类别的模型任务。它们可以很好的处理回归问题,也能对分类问题应付自如(甚至可以产生合适的标准概率值)。虽然我从没亲自尝试,但它们还可以用于聚类 分析问题。
Extra trees,Extremely Randomized Trees,指极度随机树,和随机森林区别是:
1、随机森林应用的是Bagging模型,而ET是使用所有的训练样本得到每棵决策树,也就是每棵决策树应用的是相同的全部训练样本;
2、随机森林是在一个随机子集内得到最佳分叉属性,而ET是完全随机的得到分叉值,从而实现对决策树进行分叉的。
训练随机森林时,建议使用cross_validated(交叉验证),把数据n等份,每次取其中一份当验证集,其余数据训练随机森林,并用于预测测试集。最终得到n个结果,并平均得到最终结果
class sklearn.ensemble.RandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2,
min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0,
warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)
参数详解:
- n_estimators:森林中决策树的数量。默认100
- criterion:分裂节点所用的标准,可选“gini”, “entropy”,默认“gini”。
- max_depth:树的最大深度。如果为None,则将节点展开,直到所有叶子都是纯净的(只有一个类),或者直到所有叶子都包含少于min_samples_split个样本。默认是None。
- min_samples_split:拆分内部节点所需的最少样本数:如果为int,则将min_samples_split视为最小值。如果为float,则min_samples_split是一个分数,而ceil(min_samples_split * n_samples)是每个拆分的最小样本数。默认是2。
- min_samples_leaf:在叶节点处需要的最小样本数。仅在任何深度的分割点在左分支和右分支中的每个分支上至少留下min_samples_leaf个训练样本时,才考虑。这可能具有平滑模型的效果,尤其是在回归中。如果为int,则将min_samples_leaf视为最小值。如果为float,则min_samples_leaf是分数,而ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。默认是1。
- min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。
- max_features:寻找最佳分割时要考虑的特征数量:如果为int,则在每个拆分中考虑max_features个特征。如果为float,则max_features是一个分数,并在每次拆分时考虑int(max_features * n_features)个特征。如果为“auto”,则max_features = sqrt(n_features)。如果为“ sqrt”,则max_features = sqrt(n_features)。如果为“ log2”,则max_features = log2(n_features)。如果为None,则max_features = n_features。注意:在找到至少一个有效的节点样本分区之前,分割的搜索不会停止,即使它需要有效检查多个max_features功能也是如此。
- max_leaf_nodes:最大叶子节点数,整数,默认为None
- min_impurity_decrease:如果分裂指标的减少量大于该值,则进行分裂。
- min_impurity_split:决策树生长的最小纯净度。默认是0。自版本0.19起不推荐使用:不推荐使用min_impurity_split,而建议使用0.19中的min_impurity_decrease。min_impurity_split的默认值在0.23中已从1e-7更改为0,并将在0.25中删除。
- bootstrap:是否进行bootstrap操作,bool。默认True。如果bootstrap==True,将每次有放回地随机选取样本,只有在extra-trees中,bootstrap=False
- oob_score:是否使用袋外样本来估计泛化精度。默认False。
- n_jobs:并行计算数。默认是None。
- random_state:控制bootstrap的随机性以及选择样本的随机性。
- verbose:在拟合和预测时控制详细程度。默认是0。
- warm_start:不常用
- class_weight:每个类的权重,可以用字典的形式传入{class_label: weight}。如果选择了“balanced”,则输入的权重为n_samples / (n_classes * np.bincount(y))。
- ccp_alpha:将选择成本复杂度最大且小于ccp_alpha的子树。默认情况下,不执行修剪。
- max_samples:如果bootstrap为True,则从X抽取以训练每个基本分类器的样本数。如果为None(默认),则抽取X.shape [0]样本。如果为int,则抽取max_samples样本。如果为float,则抽取max_samples * X.shape [0]个样本。因此,max_samples应该在(0,1)中。是0.22版中的新功能。
最主要的两个参数是n_estimators和max_features,n_estimators理论上是越大越好,但是计算时间也相应增长。所以,并不是取得越大就会越好,预测效果最好的将会出现在合理的树个数;max_features每个决策树在随机选择的这max_features特征里找到某个“最佳”特征,使得模型在该特征的某个值上分裂之后得到的收益最大化。max_features越少,方差就会减少,但同时偏差就会增加。如果是回归问题,则max_features=n_features,如果是分类问题,则max_features=sqrt(n_features),其中,n_features 是输入特征数
属性:
base_estimator_:使用的基本分类器
estimators_:子分类器的集合。
classes_:类标签(单输出问题)或类标签数组的列表(多输出问题)。
n_classes_:类数(用于单输出问题),或包含每个输出的类数的列表(用于多输出问题)。
n_features_:执行拟合(fit)时的特征数量。
n_outputs_:执行拟合 (fit) 时的输出数量。
oob_score_:使用袋外估计获得的训练数据集的分数。仅当oob_score为True时,此属性才存在。
oob_decision_function_:使用训练集上的实际估计值计算的决策函数。如果n_estimators小,则有可能在引导过程中从未遗漏任何数据点。在这种情况下,oob_decision_function_可能包含NaN。仅当oob_score为True时,此属性才存在。
方法:
apply(X)将森林中的树木应用于X,返回叶子索引。
decision_path(X)返回林中的决策路径。
fit(X,y [,sample_weight])根据训练集(X,y)建立一个森林树木。
get_params([深])获取此估计量的参数。
predict(X)预测X的类。
predict_log_proba(X)预测X的类对数概率。
predict_proba(X)预测X的类概率。
score(X,y [,sample_weight])返回给定测试数据和标签上的平均准确度。
set_params(**参数)设置此估算器的参数。
fit(x,y)时,x需要是数组或者是系数矩阵,也可以是df 形式
例子:
使用的是泰坦尼克号存活的数据,使用单个决策树和随机深林比较效果
import pandas as pd import seaborn as sns #展示一下两种路径的写法 titanic= pd.read_csv("D:\\Users\\Downloads\\《泰坦尼克号数据分析项目数据》\\train.csv", index_col=0) #删除无关列 titanic.drop(['Ticket','Cabin','Name'],axis=1,inplace=True) #补全年龄缺失值 fillna_titanic=[] for i in titanic.Sex.unique(): update=titanic.loc[titanic.Sex==i].fillna(value={'Age':titanic.Age[titanic.Sex==i].mean()}) fillna_titanic.append(update) titanic=pd.concat(fillna_titanic) #补全登船信息 titanic.fillna(value={'Embarked':titanic.Embarked.mode()[0]},inplace=True) #数值pclass转化成类型 titanic.Pclass=titanic.Pclass.astype('category') #哑变量处理 dummy=pd.get_dummies(titanic[['Sex','Embarked','Pclass']]) #水平合并titanic和哑变量数据集 titanic=pd.concat([titanic,dummy],axis=1) titanic.drop(['Sex','Embarked','Pclass'],axis=1,inplace=True) #训练集和测试集的搭建 from sklearn import model_selection #取出所有自变量名称 predictors=titanic.columns[1:] #将数据拆分为训练集和测试集,测试集的比例为25% X_train,X_test,y_train,y_test=model_selection.train_test_split(titanic[predictors],titanic.Survived, test_size=0.25,random_state=1234) #使用网格法找出最优越模型参数 from sklearn.model_selection import GridSearchCV from sklearn import tree #预设各参数的不同选项值 max_depth=[2,3,4,5,6] min_samples_split=[2,4,6,8] min_samples_leaf=[2,4,8,10,12] #将各参数的值以字典的形式组织起来 parameters={'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf} #网格搜索法,测试不同的参数值,网格搜索用于找到比较适当的参数 grid_dtcateg=GridSearchCV(estimator=tree.DecisionTreeClassifier(),param_grid=parameters,cv=10) #模型拟合 grid_dtcateg.fit(X_train,y_train) #返回最佳组合的参数值 print(grid_dtcateg.best_params_) #单棵决策树建模 from sklearn import metrics #构建分类决策树(上面已经找到了最适当的参数,将这参数填写进去即可) CART_Class=tree.DecisionTreeClassifier(max_depth=3,min_samples_leaf=4,min_samples_split=2) #模型拟合 decision_tree=CART_Class.fit(X_train,y_train) #模型在测试集上的预测 pred=CART_Class.predict(X_test) #模型的准确率 print('模型在测试集的预测准确率为:',metrics.accuracy_score(y_test,pred)) import matplotlib.pyplot as plt y_score=CART_Class.predict_proba(X_test)[:,1] fpr,tpr,threshold=metrics.roc_curve(y_test,y_score) #计算AUC的值 roc_auc=metrics.auc(fpr,tpr) #绘制面积图 plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black') #添加边际线 plt.plot(fpr,tpr,color='black',lw=1) #添加对角线 plt.plot([0,1],[0,1],color='red',linestyle='-') #添加文本信息 plt.text(0.5,0.3,'ROC curve(area=%0.2f)'%roc_auc) #添加x轴与y轴标签 plt.xlabel('1-Specificity') plt.ylabel('Sensitivity') #显示图形 plt.show() #构建随机森林,随机森林可以提高单棵决策树的预测准确度 from sklearn import ensemble RF_class=ensemble.RandomForestClassifier(n_estimators=200,random_state=1234) #随机森林的拟合 RF_class.fit(X_train,y_train) #模型在测试集上的预测 RFclass_pred=RF_class.predict(X_test) #模型的准确率 print('模型在测试集的预测准确率为:',metrics.accuracy_score(y_test,RFclass_pred)) #计算绘图数据 y_score=RF_class.predict_proba(X_test)[:,1] fpr,tpr,threshold=metrics.roc_curve(y_test,y_score) #计算AUC的值 roc_auc=metrics.auc(fpr,tpr) #绘制面积图 plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black') #添加边际线 plt.plot(fpr,tpr,color='black',lw=1) #添加对角线 plt.plot([0,1],[0,1],color='red',linestyle='-') #添加文本信息 plt.text(0.5,0.3,'ROC curve(area=%0.2f)'%roc_auc) #添加x轴与y轴标签 plt.xlabel('1-Specificity') plt.ylabel('Sensitivity') #显示图形 plt.show()
{'max_depth': 3, 'min_samples_leaf': 4, 'min_samples_split': 2} 模型在测试集的预测准确率为: 0.8295964125560538
模型在测试集的预测准确率为: 0.852017937219731
哪些因素决定着泰坦尼克号上的获救率呢:
#自变量的重要性程度 importance=RF_class.feature_importances_ #构建序列用于绘图 Impt_Series=pd.Series(importance,index=X_train.columns) #对序列排序绘图 Impt_Series.sort_values(ascending=True).plot(kind='barh') plt.show()