AdaBoost 不仅可以用于分类问题,还可以用于回归分析。

这次我们的主要目标是使用 AdaBoost 预测房价,这是一个回归问题。

两个任务:

1、AdaBoost 工具的使用,包括使用 AdaBoost 进行分类,以及回归分析。

2、使用其他的回归工具,比如决策树回归,对比 AdaBoost 回归和决策树回归的结果。

如何使用 AdaBoost 工具

我们可以直接在 sklearn 中使用 AdaBoost。如果我们要用 AdaBoost 进行分类,需要在使用前引用代码:

from sklearn.ensemble import AdaBoostClassifier

我们之前讲到过,如果你看到了 Classifier 这个类,一般都会对应著 Regressor 类。AdaBoost 也不例外,回归工具包的引用代码如下:

from sklearn.ensemble import AdaBoostRegressor

我们先看下如何在 sklearn 中创建 AdaBoost 分类器。

我们需要使用 AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=』SAMME.R』, random_state=None) 这个函数,其中有几个比较主要的参数,我分别来讲解下:

那么如何创建 AdaBoost 回归呢?

你能看出来回归和分类的参数基本是一致的你能看出来回归和分类的参数基本是一致的,不同点在于回归演算法,不同点在于回归演算法

你能看出来回归和分类的参数基本是一致的,不同点在于回归演算法里没有 algorithm 这个参数,但多了一个 loss 参数。

loss 代表损失函数的设置,一共有 3 种选择,分别为 linear、square 和 exponential,它们的含义分别是线性、平方和指数。默认是线性。一般采用线性就可以得到不错的效果。

创建好 AdaBoost 分类器或回归器之后,我们就可以输入训练集对它进行训练。我们使用 fit 函数,传入训练集中的样本特征值 train_X 和结果 train_y,模型会自动拟合。使用 predict 函数进行预测,传入测试集中的样本特征值 test_X,然后就可以得到预测结果。

如何用 AdaBoost 对房价进行预测

了解了 AdaBoost 工具包之后,我们看下 sklearn 中自带的波士顿房价数据集。

这个数据集一共包括了 506 条房屋信息数据,每一条数据都包括了 13 个指标,以及一个房屋价位。

具体代码如下:

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_boston
from sklearn.ensemble import AdaBoostRegressor
# 载入数据
data=load_boston()
# 分割数据
train_x, test_x, train_y, test_y = train_test_split(data.data, data.target, test_size=0.25, random_state=33)
# 使用 AdaBoost 回归模型
regressor=AdaBoostRegressor()
regressor.fit(train_x,train_y)
pred_y = regressor.predict(test_x)
mse = mean_squared_error(test_y, pred_y)
print(" 房价预测结果 ", pred_y)
print(" 均方误差 = ",round(mse,2))

输出结果:

同样,我们可以使用不同的回归分析模型分析这个数据集,比如使用决策树回归和 KNN 回归。

编写代码如下:

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
# 使用决策树回归模型
dec_regressor=DecisionTreeRegressor()
dec_regressor.fit(train_x,train_y)
pred_y = dec_regressor.predict(test_x)
mse = mean_squared_error(test_y, pred_y)
print(" 决策树均方误差 = ",round(mse,2))
# 使用 KNN 回归模型
knn_regressor=KNeighborsRegressor()
knn_regressor.fit(train_x,train_y)
pred_y = knn_regressor.predict(test_x)
mse = mean_squared_error(test_y, pred_y)
print("KNN 均方误差 = ",round(mse,2))

你能看到相比之下,AdaBoost 的均方误差更小,也就是结果更优。虽然 AdaBoost 使用了弱分类器,但是通过 50 个甚至更多的弱分类器组合起来而形成的强分类器,在很多情况下结果都优于其他演算法。因此 AdaBoost 也是常用的分类和回归演算法之一。

AdaBoost 与决策树模型的比较

在 sklearn 中 AdaBoost 默认采用的是决策树模型,我们可以随机生成一些数据,然后对比下 AdaBoost 中的弱分类器(也就是决策树弱分类器)、决策树分类器和 AdaBoost 模型在分类准确率上的表现。

如果想要随机生成数据,我们可以使用 sklearn 中的 make_hastie_10_2 函数生成二分类数据。假设我们生成 12000 个数据,取后 2000 个作为测试集,其余作为训练集。

有了数据和训练模型后,我们就可以编写代码。我设置了 AdaBoost 的迭代次数为 200,代表 AdaBoost 由 200 个弱分类器组成。针对训练集,我们用三种模型分别进行训练,然后用测试集进行预测,并将三个分类器的错误率进行可视化对比,可以看到这三者之间的区别:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.metrics import zero_one_loss
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
# 设置 AdaBoost 迭代次数
n_estimators=200
# 使用
X,y=datasets.make_hastie_10_2(n_samples=12000,random_state=1)
print(type(X))
# 从 12000 个数据中取后2000 行作为测试集,其余作为训练集
test_x, test_y = X[2000:],y[2000:]
train_x, train_y = X[:2000],y[:2000]
# 弱分类器
dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1)
dt_stump.fit(train_x, train_y)
dt_stump_err = 1.0-dt_stump.score(test_x, test_y)
# 决策树分类器
dt = DecisionTreeClassifier()
dt.fit(train_x, train_y)
dt_err = 1.0-dt.score(test_x, test_y)
# AdaBoost 分类器
ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=n_estimators)
ada.fit(train_x, train_y)
# 三个分类器的错误率可视化
fig = plt.figure()
# 设置 plt 正确显示中文
plt.rcParams[font.sans-serif] = [SimHei]
ax = fig.add_subplot(111)
ax.plot([1,n_estimators],[dt_stump_err]*2, k-, label=u决策树弱分类器 错误率)
ax.plot([1,n_estimators],[dt_err]*2,k--, label=u决策树模型 错误率)
ada_err = np.zeros((n_estimators,))
# 遍历每次迭代的结果 i 为迭代次数, pred_y 为预测结果
for i,pred_y in enumerate(ada.staged_predict(test_x)):
# 统计错误率
ada_err[i]=zero_one_loss(pred_y, test_y)
# 绘制每次迭代的 AdaBoost 错误率
ax.plot(np.arange(n_estimators)+1, ada_err, label=AdaBoost Test 错误率, color=orange)
ax.set_xlabel(迭代次数)
ax.set_ylabel(错误率)
leg=ax.legend(loc=upper right,fancybox=True)
plt.show()

从图中你能看出来,弱分类器的错误率最高,只比随机分类结果略好,准确率稍微大于 50%。决策树模型的错误率明显要低很多。而 AdaBoost 模型在迭代次数超过 25 次之后,错误率有了明显下降,经过 125 次迭代之后错误率的变化形势趋于平缓。

因此我们能看出,虽然单独的一个决策树弱分类器效果不好,但是多个决策树弱分类器组合起来形成的 AdaBoost 分类器,分类效果要好于决策树模型。

总结

1、回归分析的问题,我们直接使用 sklearn 中的 AdaBoostRegressor 即可,如果是分类,我们使用 AdaBoostClassifier。

2、AdaBoost 的优势在于框架本身,它通过一种迭代机制让原本性能不强的分类器组合起来,形成一个强分类器。

3、经过多个弱分类器组合形成的 AdaBoost 强分类器,准确率要明显高于决策树演算法。

4、IBM 伺服器追求的是单个伺服器性能的强大,比如打造超级伺服器。而 Google 在创建集群的时候,利用了很多 PC 级的伺服器,将它们组成集群,整体性能远比一个超级伺服器的性能强大。oracle高可用架构RAC,mysql高可用架构主从,都是同样的道理。在内存分配上,raid技术也是如此。都是集群资源大于部分之和。

参考文献:

数据分析实战45讲


推荐阅读:
相关文章