bagging集成当中、通常是并行建立多个弱评估器(通常是决策树),综合多个弱评估器的结果,按照少数服从多数的思想进行结果筛选。
import numpy as np
import pandas as pd
import sklearn
import matplotlib as mlp
import seaborn as sns
import re, pip, conda
版本 sklearn 1.0.1 matplotlib 3.4.3 numpy 1.20.3 pandas 1.3.4 seaborn 0.11.2 pip 21.3.1 conda 4.10.3
从提供的数据中随机抽样出不同的子集,用于建立多棵不同的决策树,并按照Bagging的规则对单棵决策树的结果进行集成(回归则平均,分类则少数服从多数)
随机森林回归树参数
class
sklearn.ensemble.RandomForestRegressor
(n_estimators=100, *, criterion='squared_error', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)随机森林分类树参数
class
sklearn.ensemble.RandomForestClassifier
(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)
#RandomForestRegressor的实现
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor as RFR #回归树
from sklearn.tree import DecisionTreeRegressor as DTR #决策树
from sklearn.model_selection import cross_validate, KFold #模型评估器
#导入波士顿房价数据
data = pd.read_csv(r"D:\Pythonwork\datasets\House Price\train_encode.csv",index_col=0)
#查看数据
data.head()
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
#模型训练
reg_f = RFR() #实例化随机森林
reg_t = DTR() #实例化决策树
cv = KFold(n_splits=5,shuffle=True,random_state=83) #实例化交叉验证方式
决策树
#构建机器学习流
result_t = cross_validate(reg_t #要进行交叉验证的评估器
,X,y #数据
,cv=cv #交叉验证模式
,scoring="neg_mean_squared_error" #评估指标
,return_train_score=True #是否返回训练分数
,verbose=True #是否打印进程
,n_jobs=-1 #线程数
)
随机森林
result_f = cross_validate(reg_f
,X,y
,cv=cv
,scoring="neg_mean_squared_error"
,return_train_score=True
,verbose=True
,n_jobs=-1)
画出决策树和随机森林在训练集和测试集的RMSE进行对比(5折交叉验证)
trainRMSE_f = abs(result_f["train_score"])**0.5
testRMSE_f = abs(result_f["test_score"])**0.5
trainRMSE_t = abs(result_t["train_score"])**0.5
testRMSE_t = abs(result_t["test_score"])**0.5
#默认值下随机森林的RMSE与标准差std
xaxis = range(1,6)
plt.figure(figsize=(8,6),dpi=80)
#RMSE
plt.plot(xaxis,trainRMSE_f,color="green",label = "RandomForestTrain")
plt.plot(xaxis,testRMSE_f,color="green",linestyle="--",label = "RandomForestTest")
plt.plot(xaxis,trainRMSE_t,color="orange",label = "DecisionTreeTrain")
plt.plot(xaxis,testRMSE_t,color="orange",linestyle="--",label = "DecisionTreeTest")
plt.xticks([1,2,3,4,5])
plt.xlabel("CVcounts",fontsize=16)
plt.ylabel("RMSE",fontsize=16)
plt.legend()
plt.show()
从图像来看,森林与决策树都处于过拟合状态,不过森林的过拟合程度较轻,决策树的过拟合程度较强。两个算法在训练集上的结果都比较优秀,决策树的可以完美学习训练集上的内容,达到RMSE=0的程度,而随机森林在训练集上的RMSE大约在1w上下徘徊,测试集上的结果则是随机森林更占优。