浏览本文须要的背景知识点:决策树学习算法、一丢丢编程常识
一、引言
后面一节咱们学习了一种简略高效的算法——决策树学习算法(Decision Tree Learning Algorithm),上面来介绍一种基于决策树的集成学习 1 算法——随机森林算法 2(Random Forest Algorithm)。
二、模型介绍
有一个成语叫集思广益,指的是集中大众的智慧,宽泛排汇无益的意见。在机器学习算法中也有相似的思维,被称为集成学习(Ensemble learning)。
集成学习
集成学习通过训练学习出多个预计器,当须要预测时通过联合器将多个预计器的后果整合起来当作最初的后果输入。
图 2 -1
图 2 - 1 展现了集成学习的根本流程。
集成学习的劣势是晋升了单个预计器的通用性与鲁棒性,比单个预计器领有更好的预测性能。集成学习的另一个特点是能不便的进行并行化操作。
Bagging 算法
Bagging 算法是一种集成学习算法,其具体步骤为:假如有一个大小为 N 的训练数据集,每次从该数据集中有放回的取选出大小为 M 的子数据集,一共选 K 次,依据这 K 个子数据集,训练学习出 K 个模型。当要预测的时候,应用这 K 个模型进行预测,再通过取平均值或者少数分类的形式,失去最初的预测后果。
图 2 -2
图 2 - 2 展现了 Bagging 算法取子数据集的办法。
随机森林算法
将多个决策树联合在一起,每次数据集是随机有放回的选出,同时随机选出局部特色作为输出,所以该算法被称为随机森林算法。能够看到随机森林算法是以决策树为预计器的 Bagging 算法。
图 2 -3
图 2 - 3 展现了随机森林算法的具体流程,其中联合器在分类问题中,抉择少数分类后果作为最初的后果,在回归问题中,对多个回归后果取平均值作为最初的后果。
应用 Bagging 算法能升高过拟合的状况,从而带来了更好的性能。单个决策树对训练集的噪声十分敏感,但通过 Bagging 算法升高了训练出的多颗决策树之间关联性,无效缓解了上述问题。
三、算法步骤
假如训练集 T 的大小为 N,特色数目为 M,随机森林的大小为 K,随机森林算法的具体步骤如下:
遍历随机森林的大小 K 次:
从训练集 T 中有放回抽样的形式,取样 N 次造成一个新子训练集 D
随机抉择 m 个特色,其中 m < M
应用新的训练集 D 和 m 个特色,学习出一个残缺的决策树
失去随机森林
下面算法中 m 的抉择:对于分类问题,能够在每次划分时应用根号 M 个特色,对于回归问题,抉择三分之 M 但不少于 5 个特色。
四、优缺点
随机森林算法的长处:
- 对于很多种材料,能够产生高准确度的分类器
- 能够解决大量的输出变量
- 能够在决定类别时,评估变量的重要性
- 在建造森林时,能够在外部对于一般化后的误差产生不偏差的预计
- 蕴含一个好办法能够预计失落的材料,并且如果有很大一部分的材料失落,仍能够维持准确度
- 对于不均衡的分类资料集来说,能够均衡误差
- 可被延长利用在未标记的材料上,这类材料通常是应用非监督式聚类,也可侦测偏离者和观看材料
- 学习过程很疾速
随机森林算法的毛病:
- 就义了决策树的可解释性
- 在某些乐音较大的分类或回归问题上会过拟合
- 在多个分类变量的问题中,随机森林可能无奈进步基学习器的准确性
五、代码实现
应用 Python 实现随机森林分类:
import numpy as np
from sklearn.tree import DecisionTreeClassifier
class rfc:
"""随机森林分类器"""
def __init__(self, n_estimators = 100, random_state = 0):
# 随机森林的大小
self.n_estimators = n_estimators
# 随机森林的随机种子
self.random_state = random_state
def fit(self, X, y):
"""随机森林分类器拟合"""
self.y_classes = np.unique(y)
# 决策树数组
dts = []
n = X.shape[0]
rs = np.random.RandomState(self.random_state)
for i in range(self.n_estimators):
# 创立决策树分类器
dt = DecisionTreeClassifier(random_state=rs.randint(np.iinfo(np.int32).max), max_features = "auto")
# 依据随机生成的权重,拟合数据集
dt.fit(X, y, sample_weight=np.bincount(rs.randint(0, n, n), minlength = n))
dts.append(dt)
self.trees = dts
def predict(self, X):
"""随机森林分类器预测"""
# 预测后果数组
probas = np.zeros((X.shape[0], len(self.y_classes)))
for i in range(self.n_estimators):
# 决策树分类器
dt = self.trees[i]
# 顺次预测后果可能性
probas += dt.predict_proba(X)
# 预测后果可能性取均匀
probas /= self.n_estimators
# 返回预测后果
return self.y_classes.take(np.argmax(probas, axis = 1), axis = 0)
应用 Python 实现随机森林回归:
import numpy as np
from sklearn.tree import DecisionTreeRegressor
class rfr:
"""随机森林回归器"""
def __init__(self, n_estimators = 100, random_state = 0):
# 随机森林的大小
self.n_estimators = n_estimators
# 随机森林的随机种子
self.random_state = random_state
def fit(self, X, y):
"""随机森林回归器拟合"""
# 决策树数组
dts = []
n = X.shape[0]
rs = np.random.RandomState(self.random_state)
for i in range(self.n_estimators):
# 创立决策树回归器
dt = DecisionTreeRegressor(random_state=rs.randint(np.iinfo(np.int32).max), max_features = "auto")
# 依据随机生成的权重,拟合数据集
dt.fit(X, y, sample_weight=np.bincount(rs.randint(0, n, n), minlength = n))
dts.append(dt)
self.trees = dts
def predict(self, X):
"""随机森林回归器预测"""
# 预测后果
ys = np.zeros(X.shape[0])
for i in range(self.n_estimators):
# 决策树回归器
dt = self.trees[i]
# 顺次预测后果
ys += dt.predict(X)
# 预测后果取均匀
ys /= self.n_estimators
return ys
六、第三方库实现
scikit-learn3 实现随机森林分类:
from sklearn.ensemble import RandomForestClassifier
# 随机森林分类器
clf = RandomForestClassifier(n_estimators = 100, random_state = 0)
# 拟合数据集
clf = clf.fit(X, y)
scikit-learn4 实现随机森林回归:
from sklearn.ensemble import RandomForestRegressor
# 随机森林回归器
clf = RandomForestRegressor(n_estimators = 100, random_state = 0)
# 拟合数据集
clf = clf.fit(X, y)
七、动画演示
图 7 -1、图 7 - 2 别离展现了应用随机森林算法进行分类与回归的后果,图 7 -3、图 7 - 4 别离展现了上一节中应用决策学习算法进行分类与回归的后果。能够看到比照上一节中独自未正则化的决策树,其预测的后果绝对更加安稳一些。
图 7 -1
图 7 -2
图 7 -3
图 7 -4
八、思维导图
图 8 -1
九、参考文献
- https://en.wikipedia.org/wiki…
- https://en.wikipedia.org/wiki…
- https://scikit-learn.org/stab…
- https://scikit-learn.org/stab…
残缺演示请点击这里
注:本文力求精确并通俗易懂,但因为笔者也是初学者,程度无限,如文中存在谬误或脱漏之处,恳请读者通过留言的形式批评指正
本文首发于——AI 导图 ,欢送关注