集成学习——AdaBoost(自适应增强)
0. 原理
朴素的思想:将学习的重点放在出错的地方。
学习步骤:首先准备一份训练集X,对训练集进行有放回的随机抽样,用于训练。Adaboost会有序地构建一系列弱分类器:首先抽取一份训练数据,用作分类,构建第一个弱分类器,同时根据分类结果修改训练集X(某条数据分类错误时,提高该条数据在X中的份量,即提高抽取到该条数据概率,加强下次新的弱分类器针对错误情况的训练;相对的,分类正确的数据在X的份量就被降低了)。然后,再次抽取数据训练,构建第二个弱分类器,修改训练集X。后续弱分类器的构建,依此类推。最终,决定类别时,使用每个弱分类器的各分类一次,根据每个弱分类器已有的准确度属性衡量每个弱分类器在决定最终类别时的贡献(准确度高的贡献更高),从而决定最终类别。
1. 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
2. 原始数据
# 使用datasets生成数据
x1, y1 = datasets.make_gaussian_quantiles(mean=(3, 6),n_samples=1000, n_features=2, n_classes=2)
x2, y2 = datasets.make_gaussian_quantiles(mean=(6, 3), n_samples=1000, n_features=2, n_classes=2)
X = np.concatenate((x1, x2))
y = np.concatenate((y1, y2))
# 作图
plt.scatter(X[:, 0], X[:, 1], c=y_data)
plt.show()
3. 数据预处理
# 训练集、测试集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
4. 参照模型(决策树)
- 构建决策树模型
model = DecisionTreeClassifier(max_depth=5)
model.fit(X_train, y_train)
- 结果预测与评分
# 评分
print(model.score(X_test, y_test))
# 结果预测
y_predict = model.predict(X_test)
print(y_predict[0:10])
# 打印分类结果统计信息
print(classification_report(y_test, y_predict))
- 结果打印
0.728
[0 1 1 0 0 0 0 0 0 0]
precision recall f1-score support
0 0.64 0.99 0.77 235
1 0.98 0.50 0.66 265
micro avg 0.73 0.73 0.73 500
macro avg 0.81 0.74 0.72 500
weighted avg 0.82 0.73 0.71 500
5. 使用Adaboost 提升评分
- Adaboost模型构建
# Adaboost
model = AdaBoostClassifier(DecisionTreeClassifier(max_depth=5), n_estimators=100)
model.fit(X_train, y_train)
- 结果预测与评分
# 评分
print(model.score(X_test, y_test))
# 结果预测
y_predict = model.predict(X_test)
print(y_predict[0:10])
# 打印分类结果统计信息
print(classification_report(y_test, y_predict))
- 结果打印
0.972
[1 1 1 0 0 0 0 0 0 0]
precision recall f1-score support
0 0.95 0.99 0.97 235
1 0.99 0.96 0.97 265
micro avg 0.97 0.97 0.97 500
macro avg 0.97 0.97 0.97 500
weighted avg 0.97 0.97 0.97 500