Day 24 : 随机森林

原理

昨天有提到 Bagging 最有名的例子就是随机森林,它是集合多棵决策树来进行预测,很多树就成为了森林,称之为随机森林。每一棵树只能看见部分特徵,但透过多颗树来蒐集和统合资料,可以比决策树不容易过度拟合,并且让预测能力提升。

从训练集使用 Bootstrap 抽後放回,抽 n‘ 笔资料後随机选 m 个 特徵作为训练资料样本。重复 k 次之後可以产生 k 颗决策树,最後再用投票机制来进行预测。

特色

  • 多颗决策树可以弥平单一决策树会过度拟合的缺点
  • 每棵树的资料和特徵都是随机
  • 每棵树都是独立,因此可以平行化运算
  • 利用群众智慧提供预测准确率

实作程序码

一样套用上次的模板,我们将资料进行切割後喂给模型

from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators = 1000, criterion = 'entropy', random_state = 0 )
classifier.fit(X_train, y_train)

y_pred = classifier.predict(X_test)

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

print(cm)
>>> [[58  9]
     [ 6 27]]
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

视觉化

如果你拿前天的决策树对比之下,会发现随机森林的决策边界比较平滑(smooth)。也就是代表说,进行集成式学习可以将决策边界可以变得更适应资料的长相。

树状图

# 选择决策树数量和最大层数
t = 5
max_depth = 2
model = RandomForestClassifier(n_estimators=t, max_depth=max_depth)
model.fit(dx_train, dy_train)
predict = model.predict(dx_test)
test_score = model.score(dx_test, dy_test) * 100
print(f'Accuracy: {test_score:.1f}%')

# 走访和绘制随机森林的所有决策树
plt.figure(figsize=(128, 64))
for idx, dec_tree in enumerate(model.estimators_):
    plt.subplot(1, t, idx+1)
    tree.plot_tree(dec_tree, 
                   filled=True, rounded=True, proportion=True,
                   feature_names=feature_names,
                   class_names=class_names)
plt.savefig('forest.jpg')

可以放大仔细看看哦/images/emoticon/emoticon37.gif

github 程序码

更详细可以请参考连结


<<:  DAY24-资讯卡页面设计

>>:  Day 22 : Linux - 如何让解析度随着视窗大小改变?又该如何让windows和Linux的复制贴上通用?

Day 16 建立资料库

我们现在有了基本的日志,但是每次输入完重整页面都会刷新,因为这些资料都只存在於浏览器,没有真正储存到...

(Day3) 执行绪与同步&非同步

单执行绪 JavaScript 是单执行绪的语言,而单执行绪的意思就是一次只做一件事情。 不过这样的...

Day15 - WooCommerce 金流串接实战

WordPress 的接案者主要区分为两种类型:懂得运用各种外挂、布景主题来满足客户需求的接案者,另...

勒瑰恩谈写作 (3) 饱满与跳脱

间接叙事 练习:迂回说故事 这一段的练习是探讨「如何在叙事过程中提供资讯」。例如说科幻小说,通常有一...

第10天 - PHP新增MySQL资料表内容

延续昨天的文章,今天来做PHP新增资料表的内容(不影响资料表结构)。 注意! 跟资料库有关的动作 都...