作者名片
🤵♂️ 个人主页:@抱抱宝
😄微信公众号:宝宝数模AI(见文末)
✍🏻作者简介:阿里云专家博主 | 持续分享机器学习、数学建模、数据分析、AI人工智能领域相关知识,和大家一起进步!
🐋 如果文章对你有帮助的话,
欢迎👍🏻点赞📂收藏 +关注
一、算法介绍
AdaBoost(Adaptive Boosting) 是一种集成学习方法,它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高模型的性能。AdaBoost的核心思想是每次迭代中赋予错误分类样本更高的权重,从而使得后续的弱分类器更加关注这些难分类的样本。AdaBoost可以应用于分类问题,尤其是二分类问题。
二、算法原理
2.1 基本概念
AdaBoost通过迭代地训练多个弱分类器(通常是决策树),并根据每个分类器的性能为其分配权重。最终的强分类器是所有弱分类器的加权投票结果。
2.2 权重更新
在每一轮迭代中,假设我们有一个弱分类器
h
t
(
x
)
h_t(x)
ht(x),其分类误差为
ϵ
t
\epsilon_t
ϵt。则该分类器的权重
α
t
\alpha_t
αt可以通过以下公式计算:
α
t
=
1
2
ln
(
1
−
ϵ
t
ϵ
t
)
\alpha_t = \frac{1}{2} \ln \left( \frac{1 - \epsilon_t}{\epsilon_t} \right)
αt=21ln(ϵt1−ϵt)
样本权重
w
i
w_i
wi也会根据分类结果进行更新:
w
i
(
t
+
1
)
=
w
i
(
t
)
exp
(
α
t
⋅
I
(
y
i
≠
h
t
(
x
i
)
)
)
w_i^{(t+1)} = w_i^{(t)} \exp(\alpha_t \cdot I(y_i \neq h_t(x_i)))
wi(t+1)=wi(t)exp(αt⋅I(yi=ht(xi)))
其中
I
(
y
i
≠
h
t
(
x
i
)
)
I(y_i \neq h_t(x_i))
I(yi=ht(xi))是一个指示函数,如果样本
i
i
i被正确分类,则值为0,否则为1。
2.3 最终模型
最终的强分类器
H
(
x
)
H(x)
H(x)是所有弱分类器的加权和:
H
(
x
)
=
sign
(
∑
t
=
1
T
α
t
h
t
(
x
)
)
H(x) = \text{sign} \left( \sum_{t=1}^T \alpha_t h_t(x) \right)
H(x)=sign(t=1∑Tαtht(x))
数据集介绍
本次案例分析使用的数据集包含了一系列工业机器的运行状态记录,包括机器编号、质量等级、工厂温度、机器温度、转速、扭矩、使用时长等特征,以及是否发生故障的标签。我们的任务是基于这些特征预测机器是否会故障。
三、案例分析
3.1数据集介绍
本次案例分析使用的数据集包含了一系列工业机器的运行状态记录,包括机器编号、质量等级、工厂温度、机器温度、转速、扭矩、使用时长等特征,以及是否发生故障的标签。我们的任务是基于这些特征预测机器是否会故障。
3.2数据预处理与模型建立
import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve, precision_recall_curve, auc
import seaborn as sns
import matplotlib.pyplot as plt
# 加载数据
data = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 数据清洗
data.drop_duplicates(inplace=True)
X = data.drop(columns=['机器编号', '是否发生故障', '具体故障类别'])
y = data['是否发生故障']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建并训练模型
ada_model = AdaBoostClassifier(n_estimators=100, learning_rate=1.0, random_state=42)
ada_model.fit(X_train, y_train)
# 预测
y_pred = ada_model.predict(X_test)
y_pred_proba = ada_model.predict_proba(X_test)[:, 1] # 获取正类的概率
# 评估模型
print(classification_report(y_test, y_pred))
# 绘制混淆矩阵
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt="d", cmap="viridis", cbar=False,
xticklabels=['No Failure', 'Failure'],
yticklabels=['No Failure', 'Failure'])
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()
# 计算ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = roc_auc_score(y_test, y_pred_proba)
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc="lower right")
plt.show()
# 计算PR曲线
precision, recall, _ = precision_recall_curve(y_test, y_pred_proba)
pr_auc = auc(recall, precision)
# 绘制PR曲线
plt.figure(figsize=(8, 6))
plt.plot(recall, precision, color='blue', lw=2, label=f'PR curve (area = {pr_auc:.2f})')
plt.plot([0, 1], [1, 0], color='red', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc="lower left")
plt.show()
3.3 结果分析
通过上述代码,我们得到了模型在测试集上的性能报告,其中包括精确度(Precision)、召回率(Recall)以及F1分数(F1-score)。
precision recall f1-score support
0 0.98 0.99 0.99 1753
1 0.52 0.36 0.42 47
accuracy 0.97 1800
macro avg 0.75 0.68 0.71 1800
weighted avg 0.97 0.97 0.97 1800
- 准确率 (Accuracy):表示模型正确预测的比例。
- 精确度 (Precision):表示被模型预测为正类的样本中实际为正类的比例。
- 召回率 (Recall):表示所有实际为正类的样本中,被模型正确识别出来的比例。
- F1分数 (F1-score):是精确度和召回率的调和平均数,用于综合评价模型的性能。

混淆矩阵展示了模型在不同类别上的预测结果,帮助我们理解哪些类别容易被误判。

ROC曲线显示了模型在不同阈值下的表现,AUC(Area Under the Curve)值反映了模型的整体区分能力。一个接近1.0的AUC值表明模型具有很好的区分能力。

PR曲线显示了模型在不同召回率下的精确度,PRAUC(Area Under the Precision-Recall Curve)值反映了模型在不同召回率下的平均精确度。对于不平衡数据集,PR曲线通常比ROC曲线更能反映模型的性能。
如果发现某些类别的性能不佳或AUC值较低,可以考虑以下改进措施:
- 调整模型参数,如基分类器的深度、学习率等。
- 增加更多的特征或尝试不同的特征工程方法。
- 使用更复杂的基分类器,比如增加更多的树或尝试其他类型的弱分类器。
- 对于不平衡的数据集,可以采用过采样或欠采样的方法来平衡类别分布。
四、结语
通过本文的介绍,我们深入了解了AdaBoost算法的基本概念、工作原理以及如何在实际数据集上应用该算法。AdaBoost以其简单而强大的特性,在许多机器学习任务中表现出色,特别是在处理不平衡数据集时。通过案例分析,我们不仅评估了模型的性能,还通过可视化工具如混淆矩阵、ROC曲线和PR曲线来更直观地理解模型的表现。
2万+

被折叠的 条评论
为什么被折叠?



