《hands-on machine learning》 chapter 7 集成学习之随机森林笔记

一、Voting Classifiers 

当分类器尽可能相互独立时,集成的效果更好。

想得到不一样的分类器,方法1是用不同的算法,方法2是在不同的数据子集上训练模型,主要有bagging和pasting两种方法。

bagging (bootstrap aggregating ):用有放回抽样的方式生成新的数据集

pasting:无放回抽样生成数据集

 

每一个单独的predictor的效果不如在原始数据集上训练出来的结果,但是整合在一起,却可以得到比在原始数据集上方差更小的结果(偏差略低于直接在原始数据上建模)。

python Scikit-Learn 代码:(用决策树做基分类器)

 

from sklearn.ensemble import BaggingClassifier   #如果做回归任务用BaggingRegressor

from sklearn.tree import DecisionTreeClassifier

bag_clf = BaggingClassifier(

  DecisionTreeClassifier(), n_estimators = 500,

  max_samples = 100, bootstrap = True, n_jobs = -1

)

Note: 

1. n_jobs表示用多少个CPU cores, -1指用上所有可行的核。

2. 如果基分类器可以计算类概率,BaggingClassifier 自动用soft voting。

3. bootstrap = False时是pasting,由于bagging是无放回采样,得到的子样本之间差异更大,因此尽管偏差略微大于pasting,方差却更小,实际应用中人们更偏向于bagging。

 

二、Out-of-bag Evaluation

采用bagging方法时,每个subset里只包含63%的观测点,对每个基分类器而言,没有用于训练的37%叫作out-of-bag instances,这些观测点可以用于衡量该基分类器的效果,并且可以将所有predictor的结果平均,用于衡量该集成方法的效果。(就不用另外做交叉验证了)

 

在Scikit-Learn中,可以设定oob_score=True,自动获得这一结果。

bag_clf = BaggingClassifier(

  DecisionTreeClassifier(), n_estimators = 500,

  max_samples = 100, bootstrap = True, n_jobs = -1, oob_score=True

)

bag_clf.fit(X_train, Y_train)

bag_clf.oob_score_. #获得结果

可以验证以上方法所获得的accuracy score结果与方法应用于测试集上的结果是接近的:

from sklearn.metrics import accuracy_score

y_pred = bag_clf.predict(X_test)

accuracy_score(y_test, y_pred)

Note: 还可以获得每一个实例点的oob decision function,即综合所有基分类器的结果,预测的该点属于各类的概率。

bag_clf.oob_decision_function_

 

Random patches and Random Subspaces method

当处理高维数据时,可以用时对特征进行抽样,用更大的偏差换取方差的进一步减小。使用类似的超参数:max_features and bootstrap_features。

其中,同时对特征和观测点进行抽样是random patches,只对特征进行抽样是random sudspaces method。

 

三、Random Forests 

随机森林是决策树的集成,一般是用bagging方法,并且将max_samples设定为训练集的size,即通过重抽样获得和训练集同等大小的样本。

可以直接使用RandomForestClassifier类:

from sklearn.ensemble import RandomForestClassifier

rnd_clf = RandomForestClassifier(n_estimators = 500, max_leaf_nodes = 16, n_jobs = -1)

rnd_clf.fit(X_train,y_train)

y_pred_clf = rnd_clf.predict(X_test)

随机森林在建每棵树时用这样的方式引入更多的随机性:

在进一步划分一个根结点时,在随机的特征子集中搜寻最好的特征。

Extra-trees(Extremely Randomized Trees):进一步增加随机性,方法是对每个特征,使用随机的thresholds而不是选择最优的一个,这样做还可以节省training的时间。

Note:无法提前知道随机森林分类器/Extra-trees 哪一种效果更好,可以考虑用交叉验证的办法来比较(用grid search来做超参数的tuning)。

 

Feature importance

对于每棵树而言,越接近树根处的特征越可能是重要的特征,因此可以利用特征在森林里出现的平均深度,来得到特征重要性的估计。

以鸢尾花数据集为例:

from sklearn.datasets import load_iris

iris = load_iris()

rnd_clf = RandomForestClassifier(n_estimators = 500, n_jobs = -1)

rnd_clf.fit(iris['data'],iris['target'])

for name, score in zip(iris['feature_names'],rnd_clf.feature_importances_):

print(name,score)

 

注:zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

 

 

转载于:https://www.cnblogs.com/grace-luke/p/9960316.html

你可能感兴趣的:(《hands-on machine learning》 chapter 7 集成学习之随机森林笔记)