隨著物聯網的發展,越來越多的裝置產生大量的資料,這些資料可以用於預測裝置的健康狀況和剩餘使用壽命,從而實現預測性維護。本文將探討如何利用機器學習技術,特別是 LSTM 和隨機森林模型,來預測裝置的剩餘使用壽命。首先,我們會介紹資料預處理和特徵工程的步驟,例如使用 Featuretools 自動生成特徵。接著,我們會分別訓練 LSTM 和隨機森林模型,並使用平均絕對誤差(MAE)等指標評估模型的效能。為了提高模型的泛化能力和避免過擬合,我們會探討如何使用高斯噪聲層等正則化技術。最後,我們會分析模型訓練結果,並提出未來研究方向,例如資料增強和模型架構最佳化。
實現預測性維護的步驟
- 資料收集:收集裝置的執行資料,包括感測器資料、日誌資料等。
- 資料預處理:對收集到的資料進行預處理,包括資料清洗、資料轉換等。
- 特徵工程:使用特徵工程技術從資料中提取有用的特徵,例如使用
ft.EntitySet
和ft.dfs
函式來生成特徵。 - 模型訓練:使用機器學習演算法來訓練模型,例如使用 RandomForestRegressor 和 LSTM 網路。
- 模型評估:評估模型的效能,選擇最佳的模型。
使用 Featuretools 生成特徵
Featuretools 是一個開源的 Python 函式庫,用於自動生成特徵。以下是使用 Featuretools 生成特徵的示例:
import featuretools as ft
# 建立實體集
es = ft.EntitySet('Dataset')
# 新增實體
es.entity_from_dataframe(dataframe=data, entity_id='recordings', index='index', time_index='time')
# 正規化實體
es.normalize_entity(base_entity_id='recordings', new_entity_id='engines', index='engine_no')
es.normalize_entity(base_entity_id='recordings', new_entity_id='cycles', index='time_in_cycles')
# 生成特徵
fm, features = ft.dfs(entityset=es, target_entity='engines', agg_primitives=['last', 'max', 'min'], trans_primitives=[], cutoff_time=cutoff_times, max_depth=3, verbose=True)
使用機器學習演算法訓練模型
以下是使用 RandomForestRegressor 和 LSTM 網路訓練模型的示例:
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import LSTM, Dense
# 切分資料
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 訓練 RandomForestRegressor 模型
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 訓練 LSTM 網路模型
lstm_model = Sequential()
lstm_model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
lstm_model.add(Dense(1))
lstm_model.compile(loss='mean_squared_error', optimizer='adam')
lstm_model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=2)
模型評估
以下是評估模型效能的示例:
from sklearn.metrics import mean_squared_error
# 評估 RandomForestRegressor 模型
y_pred_rf = rf_model.predict(X_test)
mse_rf = mean_squared_error(y_test, y_pred_rf)
print(f'RandomForestRegressor 模型的 MSE:{mse_rf}')
# 評估 LSTM 網路模型
y_pred_lstm = lstm_model.predict(X_test)
mse_lstm = mean_squared_error(y_test, y_pred_lstm)
print(f'LSTM 網路模型的 MSE:{mse_lstm}')
隨機森林與預測維護
隨機森林是一種整合學習方法,透過多個決策樹的組合來進行預測。這種方法的優點在於可以處理高維度的資料,並且能夠避免過度擬合的問題。隨機森林的工作原理是透過多個決策樹,每個樹都會根據隨機選取的特徵進行預測,然後將所有樹的預測結果進行組合,得到最終的預測結果。
資料前處理
首先,我們需要將資料讀入並進行前處理。假設我們有一個名為 FM.csv
的檔案,包含了發動機的感知器資料和剩餘使用壽命(RUL)等資訊。以下是資料前處理的程式碼:
import pandas as pd
from sklearn.model_selection import train_test_split
# 讀入資料
fm = pd.read_csv('FM.csv', index_col='engine_no')
# 分割資料為特徵和標籤
y = fm.pop('RUL')
X_train, X_test, y_train, y_test = train_test_split(fm, y, test_size=0.2, random_state=42)
基線模型
接下來,我們需要建立基線模型,以便於比較隨機森林模型的效能。基線模型可以是簡單的預測模型,例如預測所有樣本的中位數。以下是基線模型的程式碼:
from sklearn.metrics import mean_absolute_error
import numpy as np
# 預測所有樣本的中位數
yhat_median_predict = [np.median(y_train) for _ in y_test]
# 計算基線模型的MAE
print('基線模型 MAE = {:.2f}'.format(mean_absolute_error(yhat_median_predict, y_test)))
隨機森林模型
現在,我們可以建立隨機森林模型了。以下是隨機森林模型的程式碼:
from sklearn.ensemble import RandomForestRegressor
# 建立隨機森林模型
rf = RandomForestRegressor(n_estimators=100, random_state=42)
# 訓練模型
rf.fit(X_train, y_train)
# 預測測試資料
yhat_rf_predict = rf.predict(X_test)
# 計算隨機森林模型的MAE
print('隨機森林模型 MAE = {:.2f}'.format(mean_absolute_error(yhat_rf_predict, y_test)))
結果比較
最後,我們可以比較基線模型和隨機森林模型的效能。以下是結果比較的程式碼:
# 比較基線模型和隨機森林模型的MAE
print('基線模型 MAE = {:.2f}'.format(mean_absolute_error(yhat_median_predict, y_test)))
print('隨機森林模型 MAE = {:.2f}'.format(mean_absolute_error(yhat_rf_predict, y_test)))
圖表翻譯:
graph LR A[資料前處理] --> B[基線模型] B --> C[隨機森林模型] C --> D[結果比較]
這個圖表顯示了資料前處理、基線模型、隨機森林模型和結果比較的流程。
預測維護模型的建立和評估
在預測維護的領域中,建立一個能夠準確預測裝置剩餘使用壽命(RUL)的模型是非常重要的。這個過程涉及到特徵工程、模型選擇和模型評估。在這個章節中,我們將使用隨機森林回歸模型(RandomForestRegressor)來建立預測模型,並評估其效能。
特徵工程
特徵工程是預測模型中非常重要的一步。它涉及到從原始資料中提取有用的特徵,以提高模型的預測準確度。在這個例子中,我們使用了多個感測器的測量值,包括sensor_measurement_4
、sensor_measurement_11
、sensor_measurement_12
等。這些特徵被用來建立預測模型。
# 載入必要的庫
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
import pandas as pd
import numpy as np
# 建立隨機森林回歸模型
rf = RandomForestRegressor()
# 載入訓練資料
X_train, y_train = ... # 訓練資料
# 訓練模型
rf.fit(X_train, y_train)
# 預測測試資料
X_test = ... # 測試資料
preds = rf.predict(X_test)
# 評估模型效能
scores = mean_absolute_error(preds, y_test)
print('Mean Abs Error: {:.2f}'.format(scores))
模型評估
模型評估是預測模型中非常重要的一步。它涉及到評估模型的預測準確度。在這個例子中,我們使用了均絕對誤差(MAE)來評估模型的效能。MAE是預測值和實際值之間的絕對差值的平均值。
# 評估模型效能
y_test = ... # 實際值
preds = rf.predict(X_test)
scores = mean_absolute_error(preds, y_test)
print('Mean Abs Error: {:.2f}'.format(scores))
特徵重要性
特徵重要性是預測模型中非常重要的一步。它涉及到評估每個特徵對模型預測準確度的貢獻。在這個例子中,我們使用了隨機森林回歸模型的特徵重要性來評估每個特徵的重要性。
# 評估特徵重要性
feature_importances = rf.feature_importances_
print(feature_importances)
預測結果
預測結果是預測模型中非常重要的一步。它涉及到使用模型預測新的資料。在這個例子中,我們使用了隨機森林回歸模型預測新的資料。
# 預測新的資料
new_data = ... # 新的資料
new_preds = rf.predict(new_data)
print(new_preds)
使用LSTM網路預測剩餘使用壽命(RUL)
在預測剩餘使用壽命(RUL)時,使用長短期記憶(LSTM)網路可以是一種有效的方法。首先,我們需要將資料轉換成LSTM網路可以接受的三維格式。
資料準備
import numpy as np
from sklearn.model_selection import train_test_split
def prepare_data(X, y):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train = X_train.values
X_test = X_test.values
y_train = y_train.values
y_test = y_test.values
# 將資料轉換成三維格式
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
return X_train, X_test, y_train, y_test
建立LSTM模型
from keras.models import Sequential
from keras.layers import LSTM, Dense
def create_lstm_model(input_shape):
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=input_shape))
model.add(LSTM(units=50))
model.add(Dense(1))
model.compile(loss='mean_absolute_error', optimizer='adam')
return model
訓練LSTM模型
def train_lstm_model(X_train, y_train, model):
model.fit(X_train, y_train, epochs=50, batch_size=32, verbose=2)
return model
評估LSTM模型
from sklearn.metrics import mean_absolute_error
def evaluate_lstm_model(X_test, y_test, model):
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
return mae
範例使用
X = ... # 資料特徵
y = ... # 資料標籤
X_train, X_test, y_train, y_test = prepare_data(X, y)
input_shape = (X_train.shape[1], 1)
model = create_lstm_model(input_shape)
model = train_lstm_model(X_train, y_train, model)
mae = evaluate_lstm_model(X_test, y_test, model)
print('LSTM模型的MAE:{:.2f}'.format(mae))
圖表翻譯:
flowchart TD A[資料準備] --> B[建立LSTM模型] B --> C[訓練LSTM模型] C --> D[評估LSTM模型] D --> E[輸出MAE]
此圖表展示了使用LSTM網路預測剩餘使用壽命(RUL)的流程。首先,需要準備資料,然後建立LSTM模型,接著訓練模型,最後評估模型的效能並輸出MAE值。
建立LSTM模型
在上一步驟中,我們已經準備好了適合LSTM模型的資料。現在,我們可以開始構建LSTM網路。為了達到這個目標,我們將使用一個簡單的LSTM模型,該模型包含一個LSTM層,後面跟著一個dropout層,以便更好地進行正則化。然後,我們將新增另一個密集層,並使用線性啟用函式將輸出投影到啟用層,以輸出實值輸出。最後,我們使用RMSProp最佳化器,該最佳化器嘗試最小化均方誤差(MSE)。
# 匯入必要的模組
from keras.models import Sequential
from keras.layers.recurrent import LSTM
from keras.layers import Dropout
from keras.layers import Dense
# 定義LSTM模型
def create_lstm_model(X_train, hidden_neurons):
model = Sequential()
model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.7))
model.add(Dense(hidden_neurons))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
return model
訓練LSTM模型
現在,我們可以使用訓練集來訓練LSTM模型。
# 準備資料
X_train, X_test, y_train, y_test = prepare_data(X, y)
# 定義隱藏層神經元數
hidden_neurons = 128
# 建立LSTM模型
model = create_lstm_model(X_train, hidden_neurons)
# 訓練模型
history = model.fit(X_train, y_train, batch_size=32, epochs=5000, validation_split=0.20)
模型訓練過程
在模型訓練過程中,我們可以觀察到訓練和驗證損失隨著迭代的進行而減少。
flowchart TD A[模型初始化] --> B[資料準備] B --> C[模型定義] C --> D[模型編譯] D --> E[模型訓練] E --> F[模型評估]
圖表翻譯:
上述流程圖描述了模型訓練的過程。首先,模型被初始化,然後資料被準備好。接下來,模型被定義和編譯。然後,模型被訓練和評估。
內容解密:
在上述程式碼中,我們定義了一個LSTM模型,該模型包含一個LSTM層、一個dropout層和兩個密集層。模型使用RMSProp最佳化器和均方誤差作為損失函式。模型被訓練在訓練集上,批次大小為32,訓練5000個epoch,驗證集佔總資料的20%。
預測維護模型訓練結果分析
在上述訓練過程中,我們可以觀察到模型的訓練損失(loss)和驗證損失(val_loss)隨著訓練epoch的增加而變化。從輸出結果中,我們可以看到訓練損失和驗證損失的趨勢:在前幾個epoch中,損失迅速下降,隨後趨於穩定。
# plot history
import matplotlib.pyplot as plt
plt.plot(history.history['loss'], label='訓練損失')
plt.plot(history.history['val_loss'], label='驗證損失')
plt.legend()
plt.show()
這個圖表可以幫助我們瞭解模型的訓練過程和可能的過擬合(overfitting)情況。如果驗證損失低於訓練損失,可能表明模型過度擬合了訓練資料。
MAE 評估和過擬合分析
為了進一步評估模型的效能,我們計算了測試集上的平均絕對誤差(MAE)。
predicted = model.predict(X_test)
rmse = np.sqrt(((predicted - y_test) ** 2).mean(axis=0))
print('Mean Abs Error: {:.2f}'.format(mean_absolute_error(predicted, y_test)))
如果 MAE 較高,可能表明模型尚未充分學習資料的模式,或者資料本身存在噪聲或變異性較大。
改進模型:正則化技術和 Gaussian Noise 層
為了改善模型的效能和避免過擬合,我們可以採用正則化技術,例如新增高斯噪聲層(Gaussian Noise 層)。
def createLSTMModel(X_train, hidden_neurons):
model = Sequential()
model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(GaussianNoise(0.2))
model.add(Dense(hidden_neurons))
model.add(Dropout(0.7))
model.add(Dense(1))
這種方法可以透過引入隨機噪聲來增強模型的泛化能力,從而減少過擬合的風險。
未來工作和最佳化方向
根據上述結果和分析,未來的工作可以包括:
- 資料增強:嘗試使用不同的資料增強技術來增加訓練資料的多樣性和大小。
- 模型架構最佳化:探索不同的模型架構,例如變化 LSTM 的隱藏層數量或單元數量,或者使用其他型別的迴圈神經網路。
- 超引數調整:進行超引數搜尋以找到最佳的模型引數設定。
- 整合方法:考慮使用整合方法,例如 bagging 或 boosting,來結合多個模型的預測結果。
這些方向可以幫助進一步提高預測維護模型的效能和穩健性。
預測維護模型最佳化
在預測維護的應用中,模型的效能是關鍵因素。為了提高模型的準確度,通常會使用各種技術來最佳化模型的結構和引數。在本節中,我們將探討如何使用高斯噪聲層和無監督深度特徵合成來提高預測維護模型的效能。
高斯噪聲層
高斯噪聲層是一種常用的正則化技術,透過在模型的輸入或輸出中新增高斯噪聲來提高模型的泛化能力。這種技術可以用來防止模型過度擬合,從而提高模型在測試集上的效能。
model.add(GaussianNoise(0.5))
model.add(Activation("linear"))
在上面的程式碼中,我們添加了一個高斯噪聲層,標準差為0.5,然後是一個線性啟用函式。這個高斯噪聲層可以用來新增噪聲到模型的輸入或輸出中。
無監督深度特徵合成
無監督深度特徵合成是一種技術,透過使用無監督學習演算法來合成新的特徵。這種技術可以用來提高模型的效能,特別是在特徵質量不佳的情況下。
from sklearn.cluster import KMeans
nclusters = 50
def make_entityset(data, nclusters, kmeans=None):
X = data[['operational_setting_1', 'operational_setting_2',
'operational_setting_3']]
if kmeans:
kmeans=kmeans
else:
kmeans = KMeans(n_clusters=nclusters).fit(X)
在上面的程式碼中,我們使用KMeans聚類演算法來合成新的特徵。這個演算法可以用來將原始特徵分成不同的叢集,然後使用這些叢集來合成新的特徵。
結合高斯噪聲層和無監督深度特徵合成
透過結合高斯噪聲層和無監督深度特徵合成,可以提高預測維護模型的效能。這是因為高斯噪聲層可以用來新增噪聲到模型的輸入或輸出中,而無監督深度特徵合成可以用來合成新的特徵。
flowchart TD A[原始特徵] --> B[高斯噪聲層] B --> C[無監督深度特徵合成] C --> D[模型訓練] D --> E[模型評估]
在上面的流程圖中,我們可以看到原始特徵被新增到高斯噪聲層中,然後被合成新的特徵。這些新的特徵被用來訓練模型,然後評估模型的效能。
圖表翻譯:
上面的流程圖展示瞭如何結合高斯噪聲層和無監督深度特徵合成來提高預測維護模型的效能。透過新增噪聲到模型的輸入或輸出中,然後合成新的特徵,可以提高模型的泛化能力和準確度。這種技術可以用來提高預測維護模型的效能,特別是在特徵質量不佳的情況下。
實現預測性維護的IoT資料分析
在實現預測性維護的IoT資料分析中,建立一個能夠有效整合和分析資料的實體集(EntitySet)至關重要。以下是如何使用Featuretools建立一個實體集的步驟:
步驟1:匯入必要的庫和資料
首先,需要匯入必要的庫,包括Featuretools和pandas。然後,載入您的資料到一個pandas DataFrame中。
步驟2:建立實體集
使用Featuretools的EntitySet
類別建立一個新的實體集。然後,使用entity_from_dataframe
方法從您的DataFrame中建立一個實體。
es = ft.EntitySet('Dataset')
es.entity_from_dataframe(dataframe=data, entity_id='recordings', index='index', time_index='time')
步驟3:正規化實體
使用normalize_entity
方法正規化您的實體,以建立實體之間的關係。
es.normalize_entity(base_entity_id='recordings', new_entity_id='engines', index='engine_no')
es.normalize_entity(base_entity_id='recordings', new_entity_id='settings_clusters', index='settings_clusters')
步驟4:定義自定義聚合原始碼
使用make_agg_primitive
函式定義一個自定義的聚合原始碼,以計算時間序列的複雜度。
Complexity = make_agg_primitive(lambda x: cid_ce(x, False), input_types=[vtypes.Numeric], return_type=vtypes.Numeric, name="complexity")
步驟5:執行深度特徵合成
使用dfs
函式執行深度特徵合成,以生成新的特徵。
fm, features = ft.dfs(entityset=es, target_entity='engines', agg_primitives=['last', 'max', Complexity], trans_primitives=[], chunk_size=.26, cutoff_time=cutoff_time_list[0], max_depth=3, verbose=True)
結果
執行以上步驟後,您將得到一個新的實體集,包含了原始資料和生成的特徵。這些特徵可以用於建立預測模型,以實現預測性維護的IoT資料分析。
圖表翻譯:
graph LR A[資料載入] --> B[實體集建立] B --> C[實體正規化] C --> D[自定義聚合原始碼] D --> E[深度特徵合成] E --> F[預測模型建立]
此圖表展示了實現預測性維護的IoT資料分析的流程。從資料載入開始,到實體集建立、實體正規化、自定義聚合原始碼、深度特徵合成,最終到預測模型建立。
預測性維護正成為工業物聯網領域的關鍵技術。本文深入探討了實現預測性維護的關鍵步驟,涵蓋資料收集與預處理、特徵工程、模型訓練與評估等環節,並以隨機森林和 LSTM 網路為例,展示了模型構建的具體方法。透過 Featuretools 這樣的自動化特徵工程工具,可以有效提升模型開發效率。此外,文章也分析了高斯噪聲層和無監督深度特徵合成等技術在模型最佳化中的應用,以及如何透過調整模型架構、超引數和整合方法來提升預測準確度。目前,預測性維護模型的精度和泛化能力仍面臨挑戰,特別是在處理複雜的工業資料和裝置差異性方面。玄貓認為,未來研究應著重於領域知識的整合、資料增強技術的應用,以及更具解釋性的模型的開發,才能更有效地將預測性維護落地於實際工業場景,並最大化其商業價值。