上篇内容整理了决策树的相关知识,此篇在决策树的基础上进行拓展,引入随机森林的概念
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基 本单元是决策树,而它的本质属于机器学习的一大分支——集成学习 (Ensemble Learning)方法。
其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对 的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。 而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定 为最终的输出,这就是一种最简单的 Bagging 思想。
Bagging也叫自举汇聚法(bootstrap aggregating),是一种在原始 数据集上通过有放回抽样重新选出k个新数据集来训练分类器的集成 技术。它使用训练出来的分类器的集合来对新样本进行分类,然后用 多数投票或者对输出求均值的方法统计所有分类器的分类结果,结果 最高的类别即为最终标签。
【自助法】它通过自助法(bootstrap)重采样技术,从训练集里面采集固定个 数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的 样本在放回后有可能继续被采集到。
【OOB】在Bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被 采样集采集中。对于这部分没采集到的数据,我们常常称之为袋外数据(Out Of Bag,简称OOB)。这些数据没有参与训练集模型的拟合,因此可以用来检 测模型的泛化能力。
【随机性】对于我们的Bagging算法,一般会对样本使用boostrap进行随机采集, 每棵树采集相同的样本数量,一般小于原始样本量。这样得到的采样集每次的 内容都不同,通过这样的自助法生成k个分类树组成随机森林,做到样本随机 性。
【输出】Bagging的集合策略也比较简单,对于分类问题,通常使用简单投票 法,得到最多票数的类别或者类别之一为最终的模型输出。对于回归问题,通 常使用简单平均法,对T个弱学习器得到的回归结果进行算术平均得到最终的 模型输出。
简单来说,随机森林中【随机】就是随机从数据集中有放回地抽取样本,森林是决策树的集合,每个决策树进行分析之后的结果汇总,森林返回的结果由投票决定,也就是返回最多的就是森林的结果
类比于考试,每个人做一套试卷都有不同的正确率,随机森林就是把整个班的试卷汇总起来,每套题选的人最多就作为这道题的答案,从而正确率总会高于个人
随机森林构建步骤:
应用方向:
应用举例:特征值筛选
思路:如果某个特征对决策树的分类产生了较大影响,就说明这个特征比较重要
例题:红酒的分类问题 Wine数据集(在代码中会自动获取)
例子2:红酒的分类问题 特征值重要程度分析:越是改变影响分类的,越是重要的属性。 例如:酒精含量对于酒来说不可或缺,但是对于所有的酒来说,都具 备酒精,因此,虽然酒精本身对于酒至关重要,但是对于“酒属于哪 种酒”来说就不是很重要。 特征值筛选主要筛选的就是变量的差异值,也就是——酒属于哪种酒。
python代码:
import pandas as pd
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df = pd.read_csv(url, header = None)
df.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline']
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
x, y = df.iloc[:, 1:].values, df.iloc[:, 0].values
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)
feat_labels = df.columns[1:]
forest = RandomForestClassifier(n_estimators=5, random_state=0, n_jobs=-1)
forest.fit(x_train, y_train)
importances = forest.feature_importances_
import numpy as np
np.unique(df['Class label'])
indices = np.argsort(importances)[::-1]
for f in range(x_train.shape[1]):
print("%2d) %-*s %f" % (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))
import matplotlib.pyplot as plt
plt.title('Feature Importance')
plt.bar(range(x_train.shape[1]), importances[indices], color='lightblue', align='center')
plt.xticks(range(x_train.shape[1]), feat_labels, rotation=90)
plt.xlim([-1, x_train.shape[1]])
plt.tight_layout()
plt.show()
结果:
(图和表不太一致,代码略有缺陷,以表为准待修改)