9.2 集成学习 boosting

1.集成学习原理

image.png

Bagging思想,把强变弱,一起出主意,投票或平均。
Boosting思想,通过线性组合把弱变强。

2. Boosting实现

2.1 导入数据,KNN建模

from sklearn.ensemble import AdaBoostRegressor, GradientBoostingRegressor

波士顿房价数据,获取X,y并用KNN建模
from sklearn.datasets import load_boston
from sklearn.neighbors import KNeighborsRegressor
boston = load_boston() # 下载数据
data = boston.data
target = boston.target
feature_names = boston.feature_names

KNN建模
knn = KNeighborsRegressor() # 构建算法对象
from sklearn.model_selection import train_test_split # 导入拆分函数
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=1)# 获取测试集和训练集,拆分比为2:8,随机种子1
import pandas as pd
X_train = pd.DataFrame(data=X_train, columns=feature_names)# 将数据转换成dataframe格式
X_train

查看分布
X_train.describe().T

image.png
image.png

由于数据量级不一样,最小值没有负值,用区间缩放

from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler()
data = mms.fit_transform(X_train)

X_train = pd.DataFrame(data=data, columns=feature_names)
X_test = pd.DataFrame(data=mms.transform(X_test), columns=feature_names)

KNN训练建模
knn.fit(X_train, y_train)

查看测试集和训练集的均方差
mean_squared_error(y_train, knn.predict(X_train)) # 15.028524752475246
mean_squared_error(y_test, knn.predict(X_test)) # 21.561756862745096

2.2 观察AdaBoosting算法

ada = AdaBoostRegressor(base_estimator=KNeighborsRegressor(), n_estimators=100) # 构造集成算法模型
ada.fit(X_train, y_train) # 训练

查看均方误差
mean_squared_error(y_train, ada.predict(X_train)) # 4.868747524752476
mean_squared_error(y_test, ada.predict(X_test)) # 20.65990588235294

查看每一个基学习器在样本集上的预测结果
err_list = []
for i, y_ in enumerate(ada.staged_predict(X_test)):
err = mean_squared_error(y_test, y_)
err_list.append(err)
print("C{}:ERROR:{}".format(i, err))

**展示基学习器的误差变化
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

sns.set()
plt.plot(err_list)


image.png

获取每一个基学习器的权重
plt.plot(ada.estimator_errors_)

image.png

plt.plot(ada.estimator_weights_)


image.png

2.3 观察GBDT的表现

随机森林默认每棵树是完全生长的树


image.png

查看GBDT的表现
gbdt = GradientBoostingRegressor(n_estimators=100) # max_depth=3 每一个棵树是一个弱学习器

gbdt.fit(X_train, y_train) #训练模型
mean_squared_error(y_train, gbdt.predict(X_train)) #查看训练集均方误差 1.7840841714565248
mean_squared_error(y_test, gbdt.predict(X_test)) # 查看样本集均方误差 7.977395189330439

观察两种算法对波士顿房价的特征评估结果
ada.feature_importances_ # ada要有基于概率等的基学习器,原来的是KNN,没有,所以不能得到

图像展示
pd.Series(data=gbdt.feature_importances_, index=feature_names).plot(kind='bar')

image.png

你可能感兴趣的:(9.2 集成学习 boosting)