一、回归树的缺点

1、回归树算法的方差大

2、一种降低方差的方式是平均多个模型的预测:Bagging(Bootstrap Aggregating)

3、随机森林:Bagging多棵树

二、Bootstrap Aggregating

通过对原始数据D = {x1,x2,x3,...,xn}进行n次有放回采样n个数据集D,得到Bootstrap样本。(对原始数据进行有放回随机采样,抽取数量等于原始数据样本数,可能出现重复数据)

例:原始样本为:D{x1,x2,x3}

则bootstrap可能为:D1{x1,x2,x1} 、D2{x1,x2,x2}

对给定有N个样本的数据集D进行Bootstrap采样,得到D1,在D1上训练模型得到f1,重复这个过程B次,一共得到B个模型,则B个模型的平均为(aggregating):

随机森林回归 python 参数详解 随机森林 回归问题_随机森林

Bagging可以降低模型方差,其弱学习器基本的算法模型为ID3,C4.5、CART。

三、随机森林(Random Forest)

        由于只是训练数据有一些不同,对回归树算法进行Bagging得到的多棵树高度相关,因此带来的方差减少有限。随机森林通过:随机选择一部分特征、随机选择一部分样本来降低树的相关性。

        随机森林在很多应用案例上被证明有效,但牺牲了可解释性,其中森林表示多棵树,随机表示对样本和特征进行随机抽取。

随机森林回归 python 参数详解 随机森林 回归问题_数据_02


个体学习器之间不存在 强依赖关系(有差异),一系列个体学习器可以并行 生成,然后使用组合策略,得到最终的集成模型,这就是Bagging的思想。



优点



• 像决策树一样,RF可以处理类别特征与连续特征,能扩展到多类分类,不需要特征缩放 ,能捕



获非线性关系和特征间的影响



• 算法可以并行





四、代码实现随机森林分类底层

1、导库,构建数据。

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import f1_score
df = pd.DataFrame([
    [0,1],
    [1,1],
    [2,1],
    [3,-1],
    [4,-1],
    [5,-1],
    [6,1],
    [7,1],
    [8,1],
    [9,-1]
])
print(df)

2、弱分类器模型创建存储过程,使用分类决策树创建模型,每个模型深度为3,每个决策树只分析80%的数据。

M = [] #存储决策树模型的数组
n_trees = 10  #设置树的颗数
for i in range(n_trees):
    tmp = df.sample(frac=0.8)  #对样本进行采样,目的是建造不同的树
    X = tmp.iloc[:,:-1]  #构造X
    Y = tmp.iloc[:,-1:]  #构造Y
    model = DecisionTreeClassifier(max_depth=2).fit(X, Y)
    M.append(model)  #将决策树模型加入数组

3、强分类计算过程,计算每一个弱分类器的分类结果,将结果进行整合,通过投票计算最终结果。

X = df.iloc[:,:-1] #获取全部数据的X
Y = df.iloc[:,-1:]#获取全部数据的Y
res = np.zeros(df.shape[0]) #初始化全零向量
for j, i in enumerate(M): #遍历模型数组
    y_ = i.predict(X)
    res += y_ #将每个模型预测值叠加到res变量
    print(j, f1_score(Y, y_))
print('---最终结果---')
y_ = np.sign(res) #取平均输出最终对每个样本标签的预测值
print(f1_score(Y, y_))

随机森林回归 python 参数详解 随机森林 回归问题_数据_03

 


五、代码实现随机森林回归底层

1、导库,构建数据。

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
df = pd.DataFrame([
    [1,5.56],
    [2,5.7],
    [3,5.91],
    [4,6.4],
    [5,6.8],
    [6,7.05],
    [7,8.9],
    [8,8.7],
    [9,9],
    [10,9.05]
])
X = df.iloc[:,[0]]
Y = df.iloc[:,-1]

 

2、基学习器创建过程,创建20个决策树,使用0.9的样本进行拟合,达到弱学习效果,并使用列表将20个弱学习进行存储,准备后续使用。

M = [] #存储决策树模型(弱分类器)的列表
n_trees = 20  #创建20棵分类树(弱分类器)
for i in range(n_trees):
    tmp = df.sample(frac=0.9)  #对样本进行采样,目的是建造不同的树
    X = tmp.iloc[:,[0]]  #构造采样后不同的x
    Y = tmp.iloc[:,[-1]]  #构造采用后不同的y
    model = DecisionTreeRegressor(max_depth=2).fit(X,Y)#创建的模型都是弱分类器
    M.append(model)

 

3、随机森林运行过程,使用全部的数据,使用每个弱分类器进行结果预测,并将每个弱分类器结果进行存储,打印每个弱分类器性能,查看弱分类器性能。

X = df.iloc[:,[0]] #获取全部数据的X
Y = df.iloc[:,-1] #获取全部数据的Y
res = np.zeros(df.shape[0]) #初始化全零向量
for j,i in enumerate(M): #遍历模型数组
    res += i.predict(X) #将每个模型预测值叠加到res变量
    y_ = i.predict(X)#打印模型预测值
    mse = mean_squared_error(Y, y_)
    print('第%d个模型的均方误差为%.2f'%(j, mse))#基学习器的均方误差

随机森林回归 python 参数详解 随机森林 回归问题_随机森林回归 python 参数详解_04

 

4、强分类器处理,将每次若分类器的结果除以弱分类器个数,得到最后的预测结果。

#取平均输出最终对每个样本标签的预测值
y_ = res/n_trees 

#取平均输出最终对每个样本标签的预测值
print(mean_squared_error(Y, y_)) 
# 获取数据的数量
plt.rcParams['font.sans-serif'] = ['SimHei']
m = df.shape[0]
plt.plot(np.arange(m), Y, 'r-',  label='真实值')
plt.plot(np.arange(m), y_, 'b-', label='预测值')
plt.legend()
plt.grid()
plt.show()

随机森林回归 python 参数详解 随机森林 回归问题_随机森林回归 python 参数详解_05