1. Bagging

Bootstrap:一种有放回的抽样方法。

Bagging( bootstrap aggregation)的策略:从样本集中进行有放回地选出n个样本;在样本的所有特征上,对这n个样本建立分类器;重复上述两步m次,获得m个样本分类器;最后将测试数据都放在这m个样本分类器上,最终得到m个分类结果,再从这m个分类结果中决定数据属于哪一类(多数投票制)。

随机森林采用了Bagging策略,且在其基础上进行了一些修改,采用了两个随机:

  1. 从训练样本集中使用Bootstrap采样(随机有放回)选出n个样本。

  2. 设样本共有b个特征,从这b个特征中只随机选择k个特征来分割样本,通过计算选择最优划分特征作为节点来划分样本集合来建立决策树。(与Bagging的不同之处:没有使用全部的特征,这样可以避免一些过拟合的特征,不再对决策树进行任何剪枝)

  3. 重复以上两步m次,可建立m棵决策树 

  4. 这m棵决策树形成了森林,可通过简单多数投票法(或其他投票机制)来决定森林的输出,决定属于哪一类型。(针对解决回归问题,可以采用单棵树输出结果总和的平均值)

随机森林在一定程序上提高了泛化能力,而且可以并行地生成单棵树。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor


if __name__ == "__main__":
    n = 500
    x = np.random.rand(n) * 8 - 3
    x.sort()
    y = np.cos(x) + np.sin(x) + np.random.randn(n) * 0.4
    x = x.reshape(-1, 1)

    reg = DecisionTreeRegressor(criterion='mse')
    # reg1 = RandomForestRegressor(criterion='mse')
    dt = reg.fit(x, y)
    # dt1 = reg1.fit(x, y)
    x_test = np.linspace(-3, 5, 100).reshape(-1, 1)
    y_hat = dt.predict(x_test)
    plt.figure(facecolor="w")
    plt.plot(x, y, 'ro', label="actual")
    plt.plot(x_test, y_hat, 'k*', label="predict")
    plt.legend(loc="best")
    plt.title(u'Decision Tree', fontsize=17)
    plt.tight_layout()
    plt.grid()
    plt.show()