一、回归树的缺点
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):
Bagging可以降低模型方差,其弱学习器基本的算法模型为ID3,C4.5、CART。
三、随机森林(Random Forest)
由于只是训练数据有一些不同,对回归树算法进行Bagging得到的多棵树高度相关,因此带来的方差减少有限。随机森林通过:随机选择一部分特征、随机选择一部分样本来降低树的相关性。
随机森林在很多应用案例上被证明有效,但牺牲了可解释性,其中森林表示多棵树,随机表示对样本和特征进行随机抽取。
个体学习器之间不存在 强依赖关系(有差异),一系列个体学习器可以并行 生成,然后使用组合策略,得到最终的集成模型,这就是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_))
五、代码实现随机森林回归底层
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))#基学习器的均方误差
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()