1、随机森林算法简介
随机森林算法(Random Forests)是LeoBreiman于2001年提出的,它是一种通过重采样办法从原始训练样本集中有放回地重复随机抽取若干个样本生成多个决策树,样本的最终预测值由这些决策树的结果投票决定的一种有监督集成学习模型。
其核心思想是通过随机的样本抽样和特征抽样生成众多决策树,形成一片“森林”,以多数的表决结果作为预测值。
随机森林作为一种bagging集成学习,在决策树算法中有着重要的地位。
2、随机森林算法基本原理
2.1 样本的选择
随机森林的样本采样选择可以看作是行采样。随机森林每棵在构建过程中,这棵树的样本从总样本中随机抽样生成。完成抽样后将样本放回,以便下一棵树的抽样。假设总样本有N个,随机森林每棵树的随机抽样样本数为n,一般可取n为N的平方根。
2.2 特征的选择
随机森林的特征采样可以看作是列采样。每棵树都是从总体M个特征中随机选择m特征进行树的生成。列采样有两种形式,一种是全局列采样,即同一棵树的生成过程中均采用同一批特征;另一种是局部列采样,即每一次节点分裂的时候都单独随机挑选m个特征进行分裂。
2.3 分裂准则
在树的生成过程中,采用的分裂准则。在随机森林算法中,可以有多种分裂准则。在随机森林的分类算法中,比较常见的有信息增益、基尼不纯度;在随机森林的回归算法中,比较常见的有均方误差。
3、随机森林算法步骤
3.1 输入输出
(1)输入:给定训练样本;参数设置:森林里树的数量、分裂的准则、分裂终止条件等。
(2)输出:样本的分类或回归值。
3.2 算法步骤
(1)从训练样本N个中随机有放回地选择n个;
(2)从特征中随机不放回地选择k个特征;
(3)根据指定的分裂准则进行分裂,生成一棵决策树;叶子节点的输出值:当为分类问题时,叶子的取值为分类最多的值;当为回归问题时,叶子节点的取值为该节点所有样本的平均值;
(4)当森林中树的数量小于指定值时,继续步骤(1)到(3),最终成生指定数量的决策树;
(5)预测时,样本在每棵决策树下会有一个对应叶子的值。当为分类问题时,最终取值为所有树下该叶子值的数量最多的值(分类);当为回归问题时,最终取值为所有树下叶子值的平均值。
4、随机森林算法实例
这里以用scikit-learn自带的数据集进行演示。
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#加载数据集
X, y = make_classification(n_samples=1000, n_features=4,n_informative=2, n_redundant=0,
random_state=0, shuffle=False)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#模型训练
clf = RandomForestClassifier(max_depth=2, random_state=0)
clf.fit(X_train,y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Model accuracy: %.2f"%accuracy)
5、随机森林算法总结
(1)随机森林算法具有很高的准确性和鲁棒性。随机森林算法由众多决策树共同投票决策,其结果具有较好的准确性和鲁棒性。
(2)随机森林算法可以很好地防止过拟合。随机森林每棵树的训练都是在小部分样本及特征上训练而成,可以很好地防止过拟合。
(3)随机森林算法可以并行构建决策树,提高运算效率。
(4)随机森林算法可以很好地处理高维度数据。
(5)随机森林算法在小样本上的表现可能会不佳。