必备前置知识ML-5-决策树

我们把决策树随机组合在一起就是随机森林,它比单个的决策树更有效

序:团结的力量

大数定理

假设我们有一枚不均匀的硬币,投掷它有51%的概率为正面,49%的概率为背面,那么当投掷1000次时,“大多数为正面”这件事的概率为75%。投掷10000次时,“大多数为正面”这件事的概率为97%。这就是大数定理,它体现的是群体智慧。_质量不够,数量来凑_。

集成学习

对于训练数据集,我们训练一系列「个体学习器」,再通过「结合策略」将它们集成起来,形成一个更强的学习器,这就是「集成学习」在做的事情,内核思想类似「三个臭皮匠,顶个诸葛亮」。

Bagging

Bootstrap Sampling

自助采样法

给定包含 $\ m$ 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中。

Bagging核心

Boostrap Sampling的采样过程我们可以重复 $\ T$ 次,采样出 $\ T$ 个含 $\ m$ 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,然后将这些基学习器进行结合。

随机森林(RF)算法

算法介绍

  • 输入为样本集 $D=\{(x,y_{1})\,,(x_{2},y_{2})\,,\cdot\cdot\cdot,(x_{m},y_{m})\}$
  • 对于$t=1,2,\cdot\cdot\cdot,T$
    • 对训练集进行第 $\ t$ 次随机采样,共采集 $\ m$ 次,得到包含 $\ m$ 个样本的采样集 $D_T$
    • 用采样集 $D_T$ 训练第 $\ T$ 个决策树模型 $G_T(x)$
      • 在训练决策树模型的节点的时候,在节点上所有的样本特征中选择一部分样本特征,在这些随机选择的部分样本特征中选择一个最优的特征来做决策树的左右子树划分。
    • 分类场景,则 $\ T$ 个基模型(决策树)投出最多票数的类别为最终类别。

特点

  • 随机
    • 样本扰动:数据具有差异化(๑•̀ㅂ•́)و✧
    • 属性扰动:对基决策树的每个结点,先在该结点的特征属性集合中随机选择 $\ k$ 个属性,再选择一个最优属性进行划分。这一重随机性也会带来基模型的差异性。
  • 集成:根据多个(差异化)采样集,训练得到多个(差异化)决策树,采用简单投票或者平均法来提高模型稳定性和泛化能力。
  • 随着随机森林中决策树数量的增多,模型的泛化能力逐渐增强,决策边界越来越趋于平滑 (受到噪声点的影响越来越小)

参数与调优

(1)生成单颗决策树时的特征数 max_features

  • 增加 max_features 提高单个决策树模型的性能,但降低了树和树之间的差异性,且可能降低算法的速度。
  • 太小的 max_features 会影响单颗树的性能,进而影响整体的集成效果。

(2)决策树的棵树 n_estimators

  • 较多的子树可以让模型有更好的稳定性和泛化能力,但同时让模型的学习速度变慢。
  • 我们会在计算资源能支撑的情况下,选择稍大的子树棵树。

(3)树深 max_depth

  • 太大的树深,因为每颗子树都过度学习,可能会有过拟合问题。
  • 如果模型样本量多特征多,我们会限制最大树深,提高模型的泛化能力。

代码实践

背景

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("https://blog.caiyongji.com/assets/penguins_size.csv")
df = df.dropna()
df.head()
species island culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g sex
Adelie Torgersen 39.1 18.7 181 3750 MALE
Adelie Torgersen 39.5 17.4 186 3800 FEMALE
Adelie Torgersen 40.3 18 195 3250 FEMALE
Adelie Torgersen 36.7 19.3 193 3450 FEMALE
Adelie Torgersen 39.3 20.6 190 3650 MALE

企鹅数据集包含特征和标签如下:

  • 特征:所在岛屿island、鸟喙长度culmen_length_mm、鸟喙深度culmen_depth_mm、脚蹼长度flipper_length_mm、体重(g)、性别
  • 标签:物种species:Chinstrap, Adélie, or Gentoo

关系

预处理

这段代码使用 pandas 库的 get_dummies 函数将 DataFrame df 中除了 species 列以外的所有列进行独热编码,并设置 drop_first=True 参数以删除每个特征的第一个类别。

这是一种独热编码的关系,比如sex_FEMALE与sex_MALE属性独立,在空间内没有向量关系。

1
2
3
4
X = pd.get_dummies(df.drop('species',axis=1),drop_first=True)
y = df['species']
X.head()

训练

1
2
3
4
5
6
7
8
9
10
11
#训练
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)
model = RandomForestClassifier(n_estimators=10,max_features='auto',random_state=101)
model.fit(X_train,y_train)

#预测
from sklearn.metrics import accuracy_score
preds = model.predict(X_test)
accuracy_score(y_test,preds)

使用随机森林分类器RandomForestClassifier训练,得到模型精度为97%。