bagging通过bootstrap构建集成分类器
程序员文章站
2022-07-14 13:58:34
...
集成学习是将不同分类器组合成为一个元分类器,元分类器与其包含的当个分类器相比,元分类器具有更好的泛化性能。
一、bagging集成分类器
bagging没有使用相同的训练集拟合集成分类器中的单个成员分类器,bagging集成分类器的训练集使用了bootstrap抽样(有放回的随机抽样)。bagging可以提高不稳定模型的准确率,并且可以降低过拟合的程度。
注:抽样后的子集T可以与其他的子集相同,因为是有放回的抽样。
二、对比bagging和决策树的性能
1、计算bagging在训练集和测试集的准确率
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
if __name__ == "__main__":
data = pd.read_csv("G:/dataset/wine.csv")
#选取两个类别
data = data[data["Wine"] != 1]
#选择数据的特征
X = data[["Alcohol","Hue"]].values
#将类标转为从0开始的整数
label_y = data["Wine"].values
label = LabelEncoder()
Y = label.fit_transform(label_y)
#将数据集分为测试集和训练集,测试集占40%
train_x,test_x,train_y,test_y = train_test_split(X,Y,test_size=0.4,random_state=1)
#创建决策树
tree = DecisionTreeClassifier(criterion="entropy",max_depth=None)
# 创建Bagging分类器,用bootstrap抽样拟合500颗决策树
bag = BaggingClassifier(base_estimator=tree,n_estimators=500,
max_samples=1.0,max_features=1.0,bootstrap=True,
bootstrap_features=False,n_jobs=-1,random_state=1)
#训练bagging
bag.fit(train_x,train_y)
#计算bagging的准确率
bag_train = accuracy_score(train_y, bag.predict(train_x))
bag_test = accuracy_score(test_y,bag.predict(test_x))
print("Bagging train/test accuracies : %.3f/%.3f"%(bag_train,bag_test))
#Bagging train/test accuracies : 1.000/0.896
2、计算未剪枝决策树在训练集和测试集的准确率
#训练决策树
tree.fit(train_x,train_y)
#计算决策树的准确率
tree_train = accuracy_score(tree.predict(train_x),train_y)
tree_test = accuracy_score(tree.predict(test_x),test_y)
print("Decision tree train/test accuracies: %.3f/%.3f"%(tree_train,tree_test))
#Decision tree train/test accuracies: 1.000/0.833
结论:通过对比bagging和未剪枝决策树在训练集和测试集上的准确率可以发现,两个模型在训练集上的准确率都为1,可以发现两个模型都有明显的过拟合现象。但是,bagging的过拟合相对于决策树而言要过拟合的程度要低一些。
三、绘制bagging和决策树的决策区域
#计算x和y的最大最小值
x_min = train_x[:,0].min() - 1
x_max = train_x[:,0].max() + 1
y_min = train_x[:,1].min() - 1
y_max = train_x[:,1].max() + 1
#绘制x和y的取值范围
xx,yy = np.meshgrid(np.arange(x_min,x_max,0.1),np.arange(y_min,y_max,0.1))
f,axarr = plt.subplots(nrows=1,ncols=2,sharex="col",sharey="row",figsize=(8,3))
for idx,clf,tt in zip([0,1],[tree,bag],["决策树","Bagging"]):
clf.fit(train_x,train_y)
Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
Z = Z.reshape(xx.shape)
axarr[idx].contourf(xx,yy,Z,alpha=0.3)
axarr[idx].scatter(train_x[train_y==0,0],train_x[train_y==0,1],c="blue",marker="^")
axarr[idx].scatter(train_x[train_y==1,0],train_x[train_y==1,1],c="red",marker="o")
axarr[idx].set_title(tt)
axarr[0].set_ylabel("酒精含量(Alcohol)",fontsize=12)
plt.text(10.2,-1.2,s="色度(Hue)",ha="center",va="center",fontsize=12)
plt.show()
总结:通过观察决策树和Bagging的决策边界可以发现,Bagging的决策边界相对于决策树来说来平滑一些。在实际任务中,分类的特征维度会更高,任务会更加复杂,使用单颗的决策树容易导致模型过拟合,Bagging就突出了其优势。Bagging是一种降低模型方差的有效方法。但是,Bagging在降低模型偏差方面作用不大,这也是选择未剪枝的决策树低偏差分类器作为集成算法分类器的原因。