
二叉树(树)与森林的相互转换
Adaboost 分类器
1 | # 加载库 |
最重要的参数是base_estimator,n_estimators和learning_rate。
base_estimator是用于训练弱模型的学习算法。 这几乎总是不需要改变,因为到目前为止,与 AdaBoost 一起使用的最常见的学习者是决策树 - 这个参数的默认参数。n_estimators是迭代式训练的模型数。learning_rate是每个模型对权重的贡献,默认为1。 降低学习率将意味着权重将增加或减少到很小的程度,迫使模型训练更慢(但有时会产生更好的表现得分)。loss是AdaBoostRegressor独有的,它设置了更新权重时使用的损失函数。 这默认为线性损失函数,但可以更改为square或exponential。
1 | # 创建 adaboost 决策树分类器对象 |
决策树分类器
1 | # 加载库 |
决策树回归
1 | # 加载库 |
决策树回归的工作方式类似于决策树分类,但不是减少基尼杂质或熵,而是测量潜在的分割点,它们减少均方误差(MSE)的程度:
其中 

1 | # 创建决策树回归器对象 |
特征的重要性
1 | # 加载库 |
使用随机森林的特征选择
通常在数据科学中,我们有数百甚至数百万个特征,我们想要一种方法来创建仅包含最重要特征的模型。 这有三个好处。 首先,我们使模型更易于解释。 其次,我们可以减少模型的方差,从而避免过拟合。 最后,我们可以减少训练模型的计算开销(和时间)。 仅识别最相关特征的过程称为“特征选择”。
数据科学工作流程中,随机森林通常用于特征选择。 原因是,随机森林使用的基于树的策略,自然按照它们如何改善节点的纯度来排序。 这意味着所有树的不纯度的减少(称为基尼不纯度)。 不纯度减少最多的节点出现在树的开始处,而不纯度减少最少的节点出现在树的末端。 因此,通过在特定节点下修剪树,我们可以创建最重要特征的子集。
在这个教程中,我们将要:
- 准备数据集
- 训练随机森林分类器
- 识别最重要的特征
- 创建新的“有限特征的”数据集,仅仅包含那些特征
- 在新数据集上训练第二个分类器
- 将“全部特征的”分类器的准确率,和“有限特征的”分类器比较
注:还有其他重要定义,但在本教程中,我们将讨论限制为基尼重要性。
1 | import numpy as np |
本教程中使用的数据集是着名的鸢尾花数据集鸢尾花数据包含来自三种鸢尾y和四个特征变量X的 50 个样本。
1 | # 加载鸢尾花数据集 |
上面的得分是每个变量的重要性得分。 有两点需要注意。 首先,所有重要性得分加起来为 100%。 其次,“花瓣长度”和“花瓣宽度”远比其他两个特征重要。结合起来,“花瓣长度”和“花瓣宽度”的重要性约为 0.86!显然,这些是最重要的特征。
1 | # 创建一个选择器对象, |
从准确率得分可以看出,包含所有四个特征的原始模型准确率为 93.3%,而仅包含两个特征的“有限”模型准确率为 88.3%。 因此,为了精确率的低成本,我们将模型中的特征数量减半。
在随机森林中处理不平衡类别
1 | # 加载库 |
当使用RandomForestClassifier时,有用的设置是class_weight = balanced,其中类自动加权,与它们在数据中出现的频率成反比。具体来说:
其中 





1 | # 创建决策树分类器对象 |
随机森林分类器
1 | # 加载库 |
1 | array([1]) |
随机森林分类器示例
本教程基于 Yhat 2013 年的[ Python 中的随机森林]教程(http://blog.yhat.com/posts/random-forests-in-python.html)。 如果你想要随机森林的理论和用途的总结,我建议你查看他们的指南。 在下面的教程中,我对文章末尾提供的随机森林的简短代码示例进行了注释,更正和扩展。 具体来说,我(1)更新代码,使其在最新版本的 pandas 和 Python 中运行,(2)编写详细的注释,解释每个步骤中发生的事情,以及(3)以多种方式扩展代码。
让我们开始吧!
数据的注解
本教程的数据很有名。 被称为鸢尾花数据集,它包含四个变量,测量了三个鸢尾花物种的各个部分,然后是带有物种名称的第四个变量。 它在机器学习和统计社区中如此着名的原因是,数据需要很少的预处理(即没有缺失值,所有特征都是浮点数等)。
1 | # 加载鸢尾花数据集 |
| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | |
|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 |
1 | # 添加带有物种名称的新列,我们要尝试预测它 |
| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | species | |
|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
1 | # 创建一个新列,每列生成一个0到1之间的随机数, |
| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | species | is_train | |
|---|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | True |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | True |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | True |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | True |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | True |
1 | # 创建两个新的数据帧,一个包含训练行,另一个包含测试行 |
好哇! 我们做到了! 我们正式训练了我们的随机森林分类器! 现在让我们玩玩吧。 分类器模型本身存储在clf变量中。
如果你一直跟着,你会知道我们只在部分数据上训练了我们的分类器,留出了剩下的数据。 在我看来,这是机器学习中最重要的部分。 为什么? 因为省略了部分数据,我们有一组数据来测试我们模型的准确率!
让我们现在实现它。
1 | # 将我们训练的分类器应用于测试数据 |
你在上面看到什么? 请记住,我们将三种植物中的每一种编码为 0, 1 或 2。 以上数字列表显示,我们的模型基于萼片长度,萼片宽度,花瓣长度和花瓣宽度,预测每种植物的种类。 分类器对于每种植物有多自信? 我们也可以看到。
1 | # 查看前 10 个观测值的预测概率 |
有三种植物,因此[1, 0, 0]告诉我们分类器确定植物是第一类。 再举一个例子,[0.9, 0.1, 0]告诉我们,分类器给出植物属于第一类的概率为90%,植物属于第二类的概率为 10%。 因为 90 大于 10,分类器预测植物是第一类。
现在我们已经预测了测试数据中所有植物的种类,我们可以比较我们预测的物种与该植物的实际物种。
1 | # 为每个预测的植物类别 |
看起来很不错! 至少对于前五个观测。 现在让我们看看所有数据。
混淆矩阵可能令人混淆,但它实际上非常简单。 列是我们为测试数据预测的物种,行是测试数据的实际物种。 因此,如果我们选取最上面的行,我们可以完美地预测测试数据中的所有 13 个山鸢尾。 然而,在下一行中,我们正确地预测了 5 个杂色鸢尾,但错误地将两个杂色鸢尾预测为维吉尼亚鸢尾。
混淆矩阵的简短解释方式是:对角线上的任何东西都被正确分类,对角线之外的任何东西都被错误地分类。
1 | # 创建混淆矩阵 |
| Predicted Species | setosa | versicolor | virginica |
|---|---|---|---|
| Actual Species | |||
| setosa | 13 | 0 | 0 |
| versicolor | 0 | 5 | 2 |
| virginica | 0 | 0 | 12 |
虽然我们没有像 OLS 那样得到回归系数,但我们得到的分数告诉我们,每个特征在分类中的重要性。 这是随机森林中最强大的部分之一,因为我们可以清楚地看到,在分类中花瓣宽度比萼片宽度更重要。
1 | # 查看特征列表和它们的重要性得分 |
随机森林回归
1 | # 加载库 |
在随机森林中选择特征重要性
1 | # 加载库 |
数字越大,特征越重要(所有重要性得分总和为1)。 通过绘制这些值,我们可以为随机森林模型添加可解释性。
1 | # 创建选择重要性大于或等于阈值的特征的对象 |
泰坦尼克比赛和随机森林
1 | import pandas as pd |
你可以在 Kaggle 获取数据。
1 | # 加载数据 |
性别
在这里,我们将性别标签(male,female)转换为虚拟变量(1,0)。
1 | # 创建编码器 |
年龄
Age特征的许多值都缺失,并且会妨碍随机森林进行训练。 我们解决这个问题,我们将用年龄的平均值填充缺失值(一个实用的操作)。
1 | # 创建填充器对象 |
可视化决策树
1 | # 加载库 |
1 | # 创建 PDF |










