集成学习导航:决策树与随机森林
【机器学习】使用scikitLearn进行决策树分类与回归:DecisionTreeClassifier及DecisionTreeRegressor
【机器学习】集成学习:使用scikitLearn中的VotingClassifier综合多个不同模型进行软硬投票
【机器学习】集成学习:使用scikitLearn中的BaggingClassifier实现bagging和pasting策略
【机器学习】集成学习:scikitLearn实现AdaBoost及梯度提升GradientBoosting,及XGBT库
在scikitLearn中,随机森林有两种实现方法,
(1)组合BaggingClassifier以及DecisionTreeClassifier,通过bagging及pasting方法建立综合预测模型。
代码如下:
bag_clf = BaggingClassifier(
DecisionTreeClassifier(max_features="sqrt", max_leaf_nodes=16),
n_estimators=500, random_state=42)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)
(2)使用RandomForestClassifier类,对于回归则有RandomForestRegressor。
第一种方法已经介绍过,第二种方法的示例代码如下:
from sklearn.ensemble import RandomForestClassifier
rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, random_state=42)
rnd_clf.fit(X_train, y_train)
y_pred_rf = rnd_clf.predict(X_test)
RandomForestClassifier类在某个特征子集里寻找最优特征,相当于施加了某种正则化,以单个预测模型更高的偏差,换取整体更低的方差。
进一步,如果对特征使用随机阈值,而不是搜寻到的最优阈值,可以进一步使随机森林随机化。这种产生决策树的方式为Extra-Trees,极端树。
其代码如下:
from sklearn.ensemble import ExtraTreesClassifier
# 5棵树、2个特征、评判指标是熵
extra_tree_forest = ExtraTreesClassifier(n_estimators=5,
criterion='entropy', max_features=2)
extra_tree_forest.feature_importances_
使用feature_importances_变量可以反映每个特征的重要程度
下面使用minist数据集,将手写数字图片用随机森林进行预测,并可视化每个像素的重要程度,代码如下:
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
mnist.target = mnist.target.astype(np.uint8)
rnd_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rnd_clf.fit(mnist["data"], mnist["target"])
#绘图用,将重要性结果转为与原图相同大小的图片
def plot_digit(data):
image = data.reshape(28, 28)
plt.imshow(image, cmap = mpl.cm.hot,
interpolation="nearest")
plt.axis("off")
#绘图feature_importances_对应的数组和为1
plot_digit(rnd_clf.feature_importances_)
cbar = plt.colorbar(ticks=[rnd_clf.feature_importances_.min(), rnd_clf.feature_importances_.max()])
cbar.ax.set_yticklabels(['Not important', 'Very important'])
plt.show()
最终输出为: