一个强大的集成学习算法:随机森林
一、算法介绍
随机森林属于集成学习(Ensemble Learning)中的一种,它是通过构建多个决策树,并综合这些决策树的预测结果来进行最终的预测。就好比一群经验丰富的专家(各个决策树)共同商讨一件事,然后汇总大家的意见(预测结果)得出最终结论,往往这样综合考量后的结果会更加准确可靠。
随机森林可以用于解决分类问题,比如判断一封邮件是垃圾邮件还是正常邮件;也能处理回归问题,例如预测某地区的房价走势等。它具有以下优点:
- 准确性高:通过集成多个决策树,减少了单个模型的偏差和方差,通常能获得比单一决策树更好的预测性能。
- 鲁棒性强:对数据中的噪声和异常值有较好的容忍度,不太容易因为个别“捣乱”的数据而导致整体预测结果偏差过大。
- 可处理高维数据:在面对具有众多特征的数据时,依然能够较好地发挥作用,筛选出重要特征并进行有效预测。
二、算法原理
1. 决策树基础
随机森林的基本组成单元是决策树。决策树是一种基于树结构进行决策的模型,它通过对数据集特征的不断划分来构建树形结构。
例如,我们有一个简单的数据集,特征包括天气(晴天、多云、下雨)、温度(高、中、低),要预测是否适合外出活动。决策树可能会先根据天气特征进行划分,如果是晴天,再看温度情况等,逐步构建出一个类似树状的决策流程,最终每个叶子节点对应一个预测结果(适合外出或者不适合外出)。
2. 随机森林的构建
随机森林在构建决策树时有两个关键的随机化步骤:
当构建好众多的决策树(假设构建了T棵决策树)后,对于分类问题,随机森林的预测结果通常采用投票法,即统计每棵树预测的类别,选择出现次数最多的类别作为最终预测类别;对于回归问题,则是将每棵树的预测值进行平均,得到最终的预测值。
三、案例分析——基于随机森林的机器故障预测
1. 数据集介绍
- 该数据集包含了机器运行的相关信息,共有8998条记录,10个字段。其中主要字段包括:
机器编号:用于唯一标识每台机器。
统一规范代码:可能与机器的类型或规格相关。
机器质量等级:反映机器的质量层次,可能影响其运行稳定性和故障概率。
工厂温度:机器运行环境的温度情况。
机器温度:机器自身运行时的温度。
转速(rpm):机器运行的转速。
扭矩(Nm):机器工作时产生的扭矩。
使用时长(min):机器已经运行的累计时长。
是否发生故障:目标变量,表示机器是否出现故障,1表示发生故障,0表示未发生故障。
具体故障类别:进一步细分故障的类型。
2. 完整代码
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import roc_curve, auc
# 定义excel文件路径
file_path = '/mnt/data.xlsx'
# 加载数据
data = pd.read_excel(file_path)
# 定义特征列名列表
feature_cols = ['机器质量等级', '工厂温度', '机器温度', '转速(rpm)', '扭矩(Nm)', '使用时长(min)']
# 选取特征列作为特征变量X
X = data.loc[:, feature_cols]
# 选取目标列作为目标变量y
y = data['是否发生故障']
# 划分训练集和测试集,测试集大小为30%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建随机森林分类器,设置决策树数量为100
rf = RandomForestClassifier(n_estimators=100, random_state=42)
# 使用训练集训练模型
rf.fit(X_train, y_train)
# 使用训练好的模型对测试集进行预测
y_pred = rf.predict(X_test)
# 输出分类报告
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='Blues')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
# 计算ROC曲线相关数据
y_pred_proba = rf.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
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')
plt.legend(loc="lower right")
plt.show()
3. 结果分析
- 分类报告:
precision recall f1-score support
0 0.99 1.00 0.99 2624
1 0.88 0.58 0.70 76
accuracy 0.99 2700
macro avg 0.93 0.79 0.85 2700
weighted avg 0.98 0.99 0.98 2700
其中,精确率表示预测为正例的样本中真正为正例的比例;召回率表示实际为正例的样本中被正确预测为正例的比例;F1 值是精确率和召回率的调和平均数,综合反映模型的性能;支持度表示每个类别的样本数量。
- 混淆矩阵热力图:
混淆矩阵中,对角线元素表示正确分类的样本数量,非对角线元素表示错误分类的样本数量。
- ROC曲线:
四、结论
随机森林模型在这个机器故障预测任务中表现优秀,能够有效地根据机器的运行参数预测是否会发生故障,可用于实际生产中的机器故障预警和维护决策等场景。
本文转载自 宝宝数模AI,作者: BBSM