多層感知機(MLP)解決二分類任務

互聯架構唠唠嗑 2024-06-27 17:57:10
目標:

分類任務: 開發一個神經網絡,預測一氧化碳 (CO) 濃度是否超過某一阈值(CO(GT) 值的平均值)。這項任務涉及二元分類,即您的模型學會將實例分爲兩類:高于或低于阈值。阈值。要確定阈值,您必須首先計算CO(GT) 的平均值,其中不包括未知數據(缺失值)。然後,使用該阈值來預測網絡預測的值是高于還是低于該阈值。但是您的網絡應該能夠處理缺失值。

原始表部分數據截圖

數據處理

1. 根據原始表輸出時間序列圖,以日期爲橫坐標,value爲縱坐標

可以看到當平均濃度=-200時,CO(GT), NMHC(GT), G6H5(GT)等多張圖都表現爲數值突增或突降,我們可以初步判斷平均濃度=-200爲異常值。接下來我們再生出數據分布圖來進一步驗證。

2. 數據分布圖

我們可以進一步得出平均濃度=-200爲異常值,同時我們還可以使用df.describe() 方法可以生成數據框架的描述性統計信息,從而幫助分析數據是否異常。

補充一下數據分布圖的作用(來自偉大的G老師):

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 生成示例數據np.random.seed(0)data = np.random.normal(loc=0, scale=1, size=1000)df = pd.DataFrame(data, columns=['Value'])# 直方圖plt.figure(figsize=(10, 5))plt.hist(df['Value'], bins=30, edgecolor='k', alpha=0.7)plt.title('Histogram')plt.xlabel('Value')plt.ylabel('Frequency')plt.show()# 密度圖plt.figure(figsize=(10, 5))sns.kdeplot(df['Value'], shade=True)plt.title('Density Plot')plt.xlabel('Value')plt.ylabel('Density')plt.show()# 箱線圖plt.figure(figsize=(10, 5))sns.boxplot(df['Value'])plt.title('Box Plot')plt.xlabel('Value')plt.show()# 小提琴圖plt.figure(figsize=(10, 5))sns.violinplot(df['Value'])plt.title('Violin Plot')plt.xlabel('Value')plt.show()

3. 處理異常值

我們通過前面兩步已經找到了異常值(氣體濃度爲-200),接下來我們進行處理,有幾種常見的處理方法,比如直接刪除,數據替換(使用中位數:中位數受異常值的影響較小,是一個穩健的統計量;插值:對于時間序列數據,可以使用前後相鄰值的均值或插值法替換異常值),標記異常等。本文使用的是插值,原因如上對于時間序列數據,可以使用前後相鄰值的均值或插值法替換異常值。看一下處理異常值後的時間序列圖:

df_linear_interpolation = df[columns_to_plot].interpolate(method='linear', inplace=False)

這裏解釋一下插值方法的選取: 首先本文選取的是線性插值的方法。如圖可知,本次數據呈線性關系,並且缺失值附近有效值較多,因此采用線性的方式處理,簡單效率高。那麽如何分析選用哪種插值方法呢?

分析數據特性:數據是線性(linear)的還是非線性的(spline)?數據的變化趨勢是平滑的還是有較大波動(nearest)?數據是時間序列數據嗎(time)?嘗試不同方法:可以嘗試多種插值方法,並比較其結果。例如,使用 linear、spline、polynomial 等方法進行插值,並繪制插值前後的數據曲線。評估插值效果:檢查插值後的數據是否符合預期:插值後的曲線看起來合理且平滑,且不會有明顯的異常點或過擬合情況,說明插值結果符合預期。計算插值前後的誤差(如均方誤差,RMSE)來評估插值方法的效果。數據是否保持一致,如果是時間序列,檢查插值後的時間點和值是否合理。

二分類任務

1. 計算阈值:題目裏設定阈值爲CO(GT) 的平均值,將數據分類爲平均值以上及平均值以下

threshold = df_linear_interpolation['CO(GT)'].mean()df_linear_interpolation['CO_Target'] = (df_linear_interpolation['CO(GT)'] > threshold).astype(int)

2. 輸出相關矩陣:用于表示數據集中各特征(變量)之間相關關系的矩陣

correlation_matrix = df_linear_interpolation[columns_to_plot].corr()

爲什麽要分析相關性:

首先相關矩陣展示了數據集中每一對特征之間的相關性。這對于理解特征之間的線性關系非常有用。相關系數的值在-1到1之間:

1:表示完全正相關0:表示無相關性-1:表示完全負相關特征選擇在進行特征選擇時,相關矩陣可以幫助我們識別高度相關的特征。如果兩個特征高度相關(相關系數接近1或-1),可能只需要保留一個特征,從而減少特征的冗余性。檢測多重共線性多重共線性是指在多元回歸模型中,一個特征可以被其他特征線性預測。高相關性的特征組合可能導致多重共線性問題,從而影響模型的穩定性和解釋性。相關矩陣可以幫助識別這種問題。

3. 數據預處理

分析數據相關性:在數據預處理階段,了解特征之間的相關性有助于做出數據轉換、標准化、歸一化等決策。根據熱圖選取與CO(GT)表現相關性較高的氣體,紅色顔色越深相關性越高

對數據進行標准化處理

標准化特征是機器學習和數據分析中常用的預處理步驟。 標准化的作用是將不同特征縮放到相同的尺度上,通常是均值爲0,標准差爲1。 我們可以看到上圖爲標准化之前,不同氣體的數據差(比如2004-03-10,PT08.S1(CO)和C6H6(GT))還是很大的。而這種數據差異較大可能會造成模型更傾向于差異大的數據,導致訓練結果准確度低,展開來講就是以下幾點:

模型收斂速度慢: 較大尺度的特征會主導梯度更新,導致在這些方向上步長過大,而在小尺度的特征方向上步長過小。這種不一致會使優化過程變得緩慢,模型需要更多的叠代才能收斂。優化問題:未標准化的數據可能會導致損失函數的形狀不對稱,形成一個拉長的橢圓形等高線圖。這種情況下,梯度下降法需要在較多方向上進行調整,增加了優化難度。權重更新不平衡:神經網絡的權重更新依賴于輸入特征的值。如果特征的尺度差異較大,模型會傾向于更多地關注數值較大的特征,而忽視數值較小的特征,導致不平衡的權重更新和次優的模型性能。模型穩定性問題:數據的尺度差異會導致模型輸出的激活值範圍差異過大,特別是在深度神經網絡中,這會導致梯度消失或梯度爆炸問題,從而影響模型訓練的穩定性。特征貢獻不平衡:當特征值差異較大時,特征的貢獻會不均衡。較大數值的特征可能在模型中占據主導地位,而較小數值的特征則可能被忽視。 這會影響模型的整體表現,特別是當每個特征對預測結果都有重要貢獻時。

4. 劃分數據集,訓練模型

劃分訓練集、驗證集、測試集:需要注意測試集只有在最後預測的時候才用,模型訓練階段只用訓練集和驗證集。

本文將訓練集、驗證集、測試集按照7:2:1的比例劃分,這個比例是比較常見的並不是硬性要求。我們可以根據數據集的大小來調整,比如數據集較大的時候,適量增加訓練集比例,提高模型學習能力;數據集較小的時候,適量增加驗證集,更好的評估模型的性能。

可以看我們本次訓練的表現還是不錯的,訓練集和驗證集的准確度重合較高。且根據混淆矩陣計算所得的准確度和精確度都較高。

總結

我從以下幾點分析本次訓練結果較好的原因:

對缺失或異常數據進行插值處理選擇相關性較高的數據進行訓練(根據相關性矩陣畫熱圖)對數據進行標准化處理使得模型收斂更快減少大差異數據導致模型忽略小差異數據,使得消失或爆炸提高模型的泛化能力將數據集劃分爲訓練集、驗證集和測試集。驗證集的作用:調優模型超參數:驗證集用于調整和選擇模型的超參數(例如學習率、正則化參數、樹的深度等)。通過在驗證集上評估模型,可以找到最優的超參數組合,從而提升模型的性能和泛化能力。如果沒有驗證集,直接使用測試集進行超參數調優,會導致測試集的信息泄露,無法真正評估模型的泛化性能。避免過擬合模型評估:在訓練集上,通過驗證集評估合適的訓練周期(epoch),也是需要根據驗證集的表現來反應訓練損失:通常會隨著 epoch 數量的增加而減少。驗證損失:在一開始會隨著 epoch 數量的增加而減少,但在過多的 epoch 後可能會開始增加,這表明模型開始過擬合。

作者:還想再吃一口鏈接:https://juejin.cn/post/7382640456109146147

0 阅读:0

互聯架構唠唠嗑

簡介:感謝大家的關注