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 也是常用的分类和回归演算法之一。
在 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讲