一個強大的集成學習算法:隨機森林
一、算法介紹
隨機森林屬于集成學習(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
