機器學習:預測液壓破損-分類任務和模型性能的解釋

機器學習:預測液壓破損-分類任務和模型性能的解釋

現代工業世界,大規模的製造和自動化在汽車工業,配送中心,包裝工業已經幾乎無處不在。與人類勞動相比,機器在精確度和重複性方面都很好,但機器也容易出現故障。對於釀酒公司來說,一旦一個液壓蓄能器壞了,就會導致啤酒的味道大不相同,從而造成不可逾越的成本。

由於數據科學是一門專注於數據的科學,我們有信息可以研究設備的傳感器,為什麼我們不能利用它,並在預測洩漏何時發生方面取得一些小小的進展

數據

我們獲得的數據是通過UCI機器學習庫 - 一個液壓試驗檯。(https://archive.ics.uci.edu/ml/datasets/Condition+monitoring+of+hydraulic+systems)

該系統有17個傳感器,可以跟蹤每一個循環。在項目中,我們的工作是從數據中提取有價值的信息,建立機學習預測模型,幫助我們預測具體的目標變量——內部泵洩漏。本項目的目的是為了更好的預測泵內洩漏,這樣我們就可以更好的判斷何時更換泵。從長遠來看,它還將幫助我們節省資金,因為我們只是更換泵在預測洩漏發生之前。

數據清理

每個傳感器都有自己的數據文件(通過txt文件存儲),傳感器包括壓力、溫度、體積流量等。對於不同的傳感器,用於記錄的頻率(Hz)是每秒鐘1,10或100次,這意味著每個傳感器將創建60,600或6000條記錄。

#calculate mean of every sensors during each instances

eps1_new = eps1.mean(axis = 1)

fs1_new = fs1.mean(axis = 1)

fs2_new = fs2.mean(axis = 1)

ps1_new = ps1.mean(axis = 1)

ps2_new = ps2.mean(axis = 1)

ps3_new = ps3.mean(axis = 1)

ps4_new = ps4.mean(axis = 1)

ps5_new = ps5.mean(axis = 1)

ps6_new = ps6.mean(axis = 1)

se_new = se.mean(axis = 1)

ts1_new = ts1.mean(axis = 1)

ts2_new = ts2.mean(axis = 1)

ts3_new = ts3.mean(axis = 1)

ts4_new = ts4.mean(axis = 1)

vs1_new = vs1.mean(axis = 1)

ce_new = ce.mean(axis = 1)

cp_new = cp.mean(axis = 1)

所以最後數據看起來是18列,其中17列是特性,而1列是標籤。

機器學習:預測液壓破損-分類任務和模型性能的解釋

清理後的數據

在我們進入EDA之前,首先我想看看目標變量的平衡性。

機器學習:預測液壓破損-分類任務和模型性能的解釋

雖然不是完全平衡的,但它仍然是相當平衡的,所以我們不需要在這一步採取任何行動。

檢查缺失值

如果我們有太多的缺失值對我們的預測不利。但是如果只有某些部分,我們可以使用插補方法用某些方法替換所有缺失值,例如用中位數替換,或者我們可以使min-max。對於替換缺失值的函數,Python代碼如下:

def miss_value_table(df):

mis_val=df.isnull().sum()

mis_val_perc = 100 * df.isnull().sum()/len(df)

#make a table:

mis_val_table = pd.concat([mis_val,mis_val_perc],axis = 1)

#rename colums:

mis_val_rename = mis_val_table.rename(

columns = {0: "Missing Value",1: "Percentage"})

#sort the value by descending order:

mis_val_rename = mis_val_rename[

mis_val_rename.iloc[:,1] != 0].sort_values(

'Percentage', ascending=False).round(1)

return mis_val_rename

最後,我發現沒有任何缺失值的功能完全有意義,因為我實際上是通過取每個傳感器的平均值來創建數據集。

EDA(探索性數據分析)

對於分類任務,像boxplot、correlation heatmap這樣的圖可以幫助我們更好的理解目標與feature之間的關係以及feature內部的關係。具體來說,為了預測內部泵洩漏,如果我們能找到高度相關的特徵,我們可以使用特徵工程方法來設計新的變量,從而更精確地捕捉目標變量的變化。Python代碼如下:

plt.figure(figsize=(15,8))

# calculate the correlation matrix

corr = data.corr()

mask = np.zeros_like(corr)

mask[np.triu_indices_from(mask)] = True

with sns.axes_style("white"):

x = sns.heatmap(corr, mask=mask, vmax=.3, square=True,xticklabels=corr.columns,yticklabels=corr.columns)

機器學習:預測液壓破損-分類任務和模型性能的解釋

上面的heatmap圖顯示了數據集中每一列之間的相關性,每個方框越黑,說明兩列之間的相關性越強。例如,我們可以看到內部泵洩漏柱,它與SE和PS3的相關性比較大,與其他列的相關性比較小。

Train-Test拆分

在機器學習中,我們需要將我們的數據分割成訓練和測試集:

  • 訓練集:對我們的模型進行訓練,可以瞭解特徵和目標之間的關係。
  • 測試集:我們不使用它來訓練我們的模型,只用於測試模型性能。因此,通過對比測試集的結果,我們可以知道哪個模型可以更好地應用於現實世界的例子。

在sklearn中,訓練測試分離可以很容易地應用,隨機狀態可以給出一致的結果。Python代碼如下:

label = data['Internal pump leakage']

data = data.drop(columns = 'Internal pump leakage')

#split the data into train and test sets

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(data,label, test_size=0.2, random_state= 42)特徵

特徵縮放

在構建模型之前要做的最後一步是特徵縮放。這是必要的,因為特徵在不同的單位中,我們想歸一化特徵,這樣單位不會影響算法。線性迴歸和隨機森林不需要特徵縮放,但是其他方法,如支持向量機和k最近鄰,確實需要它,因為它們考慮了觀察之間的歐氏距離。因此,當我們比較多個算法時,特徵縮放是一個最佳實踐。

在SK-learn的優秀包裝中,我們可以導入pipeline ,為我們提供一步到位的簡單易用模塊,使整個過程自動化。Python代碼如下:

#build a pipeline to scale data

from sklearn.pipeline import Pipeline

from sklearn.preprocessing import MinMaxScaler

p = Pipeline([('scaler', MinMaxScaler(feature_range = (0, 1)))])

#features transformation

features = p.fit_transform(X_train)

test_features = p.transform(X_test)

模型

基本模型

我們將使用sklearn庫比較三種不同的模型:

  • 邏輯迴歸
  • k -最近鄰分類
  • 梯度提升機

為了比較模型的性能,我們將使用sklearn默認設置。通常情況下,這些設置會很好地執行,但是為了獲得更好的結果,需要進行超參數優化。這就是為什麼我將首先使用默認設置來了解哪些algoris表現更好,稍後我將嘗試通過優化來調整模型。

邏輯迴歸

邏輯迴歸是建立在迴歸理論的基礎上的,每個特徵都被賦予一個像線性迴歸模型一樣的係數。Logistic迴歸模型很容易解釋,因為係數可以反映出特徵對目標的變化,但Logistic迴歸有時會給你比其他模型更低的準確性。Python實現代碼如下:

from sklearn.metrics import accuracy_score as acc

#logistic regression

from sklearn.linear_model import LogisticRegression

logic = LogisticRegression()

logic.fit(features,y_train)

y_test_logic = logic.predict(test_features)

print('The Accuracy of Logistic regression is: ',acc(y_test,y_test_logic))

The Accuracy of Logistic regression is: 0.7210884353741497

k -最近鄰

最近鄰分類方法是機器學習中最常見的方法之一。本質上是分類,通過在訓練數據中找到最相似的數據點,根據它們的分類進行有根據的猜測。Python實現如下:

#KNN methods

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier()

knn.fit(features,y_train)

y_pred_knn = knn.predict(test_features)

print('The Accuracy of KNN method is: ',acc(y_test,y_pred_knn))

The Accuracy of KNN method is: 0.9886621315192744

梯度提升機

梯度提升機是一種基於決策樹模型的非線性模型。與隨機森林(Randomforest)中儘可能多地構建樹不同,gbm側重於通過對殘差進行擬合來調整現有樹。Python代碼如下:

#gbm methods

from sklearn.ensemble import GradientBoostingClassifier

gbm = GradientBoostingClassifier(random_state= 42)

gbm.fit(features,y_train)

y_pred_gbm = gbm.predict(test_features)

print('The Accuracy of GBM method is: ',acc(y_test,y_pred_gbm))

The Accuracy of GBM method is: 0.9863945578231292

模型比較

Python代碼如下:

#model result comparison

acc_train = [acc(y_train,logic.predict(features)),

acc(y_train,knn.predict(features)),

acc(y_train,gbm.predict(features))]

acc_test = [acc(y_test,logic.predict(test_features)),

acc(y_test,knn.predict(test_features)),

acc(y_test,gbm.predict(test_features))]

figsize(6,8)

plt.style.use('fivethirtyeight')

#dataframe to hold the results

model_comparison = pd.DataFrame({0:['Logistic Regression', 'K-Nearest Neighbors',

'Gradient Boosted Machine'],

1:acc_train,

2:acc_test})

model_comparison = model_comparison.rename({0:"Method",

1: "Train Accuracy",

2: "Test Accuracy"},axis =1)

機器學習:預測液壓破損-分類任務和模型性能的解釋

model_comparison.sort_values(by = "Test Accuracy",ascending = False).plot(

x = 'Method', y = 'Test Accuracy',kind = 'barh',color = "red",edgecolor = 'black');

plt.ylabel('');plt.xlabel('Accuracy');

plt.xticks(size = 4);

plt.title("Model Comparison on Test Accuracy",size =30)

機器學習:預測液壓破損-分類任務和模型性能的解釋

根據結果,KNN方法在三種模型中都是最好的。Logistic迴歸的效果最差,而gbm模型在這種情況下過度擬合。一般來說,gbm工作得更好,但在這裡,因為一個更簡單的模型- KNN工作得更好,所以在下面我將調整參數(s)的KNN模型,以便我們可以獲得更好的結果。

模型優化

在機器學習中,優化模型意味著為特定問題找到最佳的超參數集。與模型參數相反,超參數被認為是機器學習算法的最佳設置,在訓練前由數據科學家進行調整。例如隨機森林中的樹數,或者K最近鄰中的K。

在尋找最佳參數的方法中,網格搜索、隨機搜索和貝葉斯優化是常用的方法。在我們的具體應用案例中,我們將嘗試找到最佳的k來調優我們的模型。在這一部分中,我們將首先使用隨機搜索,然後應用網格搜索找到最好的k。

我們將通過隨機搜索和交叉驗證找到最好的超參數。

  • 隨機serach:這將給你一組選項,每次隨機選擇超參數的組合。
  • 網格serach:與隨機搜索相比,這將挑選每一個超參數組合來嘗試它,當然這將給最好的訓練模型,但有時它的時間消耗和將導致過度擬合。
機器學習:預測液壓破損-分類任務和模型性能的解釋

結論

我們在機器學習任務中的幾個步驟:

  • 清理數據:這部分很常見,即使沒有機器學習模型,數據分析師也不斷需要在進行任何分析之前清理他們的數據。
  • EDA:探索性數據分析將為我們提供有價值的信息,並直觀地呈現這些信息以供進一步使用。
  • 機器學習模型應用:Sk-learn庫使得幾乎每種機器學習方法都能輕鬆,簡單地應用,在這個項目中我們嘗試了Logistic,KNN,Gradient Boosting Machine。
  • 模型優化:此步驟是關於微調參數以獲得更好的結果,對於大型數據集,這對於提供更好的預測能力非常重要。

選擇的三種機器學習模型比較:

  • Logistic迴歸:結果顯示邏輯迴歸在我們的案例中表現最差。關於邏輯迴歸的假設,一個是迴歸要求自變量之間很少或沒有多重共線性。這意味著自變量之間的相關性不應過高。然而,根據熱圖,我們清楚地看到一些變量,如壓力傳感器彼此高度相關。
  • KNN:它沒有嚴格的數據假設,但是由於維度問題,KNN傾向於使用較小維度的小數據集。對於更高維度,KNN方法屬於一個常見的機器學習問題,稱為“維數的詛咒”。
  • GBM:它以階段方式構建模型,並不斷提高弱樹的性能。GBM方法在大型數據集上運行良好。缺點是需要對整組超參數進行微調,有時候訓練時間需要花費一些時間。

結果表明,機器學習適用於我們的問題,最終模型能夠預測內部泵洩漏的精度為0.993197。

可以通過https://github.com/spotify2junkie/hydraulic_breakages_classfication找到完整的代碼


分享到:


相關文章: