在邊緣AI專案中,高品質的資料是模型成功的根本。資料處理流程包含多個步驟,從標註、清理、格式轉換到最終的模型訓練,每個環節都至關重要。本文將探討這些步驟的最佳實務,並提供程式碼範例與實務建議,以協助開發者構建更有效率且穩健的邊緣AI應用。特別是在異常檢測等場景下,如何處理資料不平衡和缺乏真實異常樣本等挑戰,更是本文的重點。此外,文章也將探討如何利用Edge Impulse等工具簡化資料標註流程,以及如何選擇合適的資料格式以提升模型訓練效率。
資料標註與格式處理
在人工智慧(AI)專案中,資料標註是決定模型品質的關鍵步驟之一。良好的資料標註能夠大幅提升模型的準確度,而不當的標註則可能導致模型表現不佳。因此,如何有效地進行資料標註以及選擇適當的資料格式,對於AI專案的成功至關重要。
輔助標註工具的使用
為了減少人工標註的工作量,各種輔助標註工具應運而生。以Edge Impulse為例,其提供了物件追蹤功能,能夠在連續的影格中自動追蹤已標註的物件,如圖7-8所示。
圖7-8:Edge Impulse中的物件追蹤功能
此圖示顯示了在Edge Impulse中如何利用物件追蹤功能來標註資料。 圖表翻譯: 圖7-8展示了Edge Impulse如何利用物件追蹤技術,在連續影格中自動識別並標註相同的物件,從而簡化了資料標註的過程。
此外,Edge Impulse Studio中的資料探索器(Data Explorer)採用了聚類別演算法,將相似的樣本聚集在一起,方便使用者快速標註,如圖7-9所示。
圖7-9:Edge Impulse Studio中的資料探索器
此圖示顯示了在Edge Impulse Studio中利用資料探索器進行資料標註的過程。 圖表翻譯: 圖7-9中的資料探索器利用聚類別演算法將相似樣本聚集在一起,使用者可以根據這些聚類別結果快速完成資料標註。
更進一步地,可以使用預訓練模型來自動標註資料。例如,利用在公開資料集上預訓練的物件偵測模型,可以自動標註80類別已知物體的例項,如圖7-10所示。
圖7-10:使用預訓練模型進行自動標註
此圖示顯示瞭如何利用預訓練模型自動標註資料。 圖表翻譯: 圖7-10展示了在Edge Impulse中使用預訓練的物件偵測模型來自動標註資料的過程,該模型能夠識別並標註80類別不同的物體。
輔助標註工具雖然能夠節省時間和人力,但由於自動化系統難以達到完美,因此仍需要人類進行檢查和校正,以確保標註品質。
半監督學習與主動學習
半監督學習和主動學習技術能夠進一步減少資料標註的工作量。這些技術透過部分訓練的模型來輔助標註過程。例如,主動學習工具可以建議需要手動標註的資料子集,以便為剩餘資料提供自動標註。
主動學習流程
- 標註部分資料
- 訓練模型
- 使用模型預測剩餘資料的標籤
Edge Impulse Studio的資料探索器也支援根據部分訓練模型的聚類別分析,如圖7-11所示。這種方法可以指導標註過程,確保每個聚類別至少包含一些已標註樣本。
圖7-11:根據部分訓練模型的資料聚類別
此圖示顯示瞭如何利用部分訓練模型進行資料聚類別。 圖表翻譯: 圖7-11展示了在Edge Impulse Studio中如何利用部分訓練模型的輸出對未標註資料進行聚類別,從而指導標註過程並提高資料品質。
資料格式處理
在AI專案中,資料格式的多樣性是一大挑戰。常見的資料格式包括文字格式(如CSV和JSON)、影像和音訊檔案,以及二進位格式(如NPY和TFRecord)。選擇適當的資料格式對於模型的訓練效率和準確度至關重要。
文字格式
CSV和JSON等文字格式易於讀取和編輯,但佔用空間較大且處理效率較低,適合小型資料集。
影像和音訊檔案
影像和音訊資料通常以獨立檔案的形式儲存,如JPEG和WAV格式。這種方式易於管理和修改,但可能不是最優的存取效率。
二進位格式
二進位格式(如NPY和TFRecord)能夠提供更高效的存取和處理效率,適合大規模資料集。二進位格式分為直接存取和順序存取兩種,前者允許隨機存取資料,而後者則針對特定順序進行最佳化。
直接存取二進位格式範例程式碼
import numpy as np
# 建立範例資料
data = np.array([1, 2, 3, 4, 5])
# 儲存為NPY格式
np.save('data.npy', data)
# 載入NPY檔案
loaded_data = np.load('data.npy')
print(loaded_data)
內容解密:
上述程式碼展示瞭如何使用NumPy函式庫儲存和載入NPY格式的二進位檔案。首先,建立了一個NumPy陣列data,然後使用np.save()函式將其儲存為data.npy檔案。接著,使用np.load()函式載入該檔案並將其內容列印出來。此範例說明瞭直接存取二進位格式在儲存和載入數值資料時的便捷性。
順序存取二進位格式範例程式碼
import tensorflow as tf
# 建立範例資料
data = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5])
# 儲存為TFRecord格式
writer = tf.io.TFRecordWriter('data.tfrecord')
for value in data:
example = tf.train.Example(features=tf.train.Features(feature={
'value': tf.train.Feature(int64_list=tf.train.Int64List(value=[value.numpy()]))
}))
writer.write(example.SerializeToString())
writer.close()
# 載入TFRecord檔案
raw_dataset = tf.data.TFRecordDataset('data.tfrecord')
# 解析TFRecord檔案內容
def parse_example(proto):
feature_description = {
'value': tf.io.FixedLenFeature([], tf.int64)
}
parsed_example = tf.io.parse_single_example(proto, feature_description)
return parsed_example['value']
parsed_dataset = raw_dataset.map(parse_example)
for value in parsed_dataset:
print(value.numpy())
內容解密:
此程式碼展示瞭如何使用TensorFlow儲存和載入TFRecord格式的順序存取二進位檔案。首先,建立了一個TensorFlow Dataset物件data,然後使用TFRecordWriter將其寫入data.tfrecord檔案。接著,使用TFRecordDataset載入該檔案,並定義了一個解析函式parse_example()來解析檔案中的Example物件。最後,將解析後的資料列印出來。此範例說明瞭順序存取二進位格式在儲存和處理序列化資料時的效率。
資料清理與錯誤處理
在進行人工智慧或機器學習專案時,資料的品質直接影響模型的表現。資料清理是確保資料集符合一致性標準的重要步驟。本文將探討資料清理的流程、常見錯誤、以及如何使用程式碼來修正這些錯誤。
資料清理流程
- 稽核資料:使用抽樣方法識別錯誤型別。
- 撰寫程式碼修正錯誤:根據發現的錯誤型別,撰寫程式碼進行修正。
- 評估結果:驗證問題是否已解決。
- 自動化修正過程:將修正過程自動化,以便應用於整個資料集和未來的新資料。
常見資料錯誤
- 原始感測器資料中的異常值
- 不同裝置資料格式不一致
- 合併多來源資料時出現的缺失值
- 特徵工程中的錯誤導致的值不正確
稽核資料集
使用Python的pandas函式庫可以有效地探索和總結資料集。例如,使用frame.describe()可以列印出時間序列值的統計摘要。
>>> frame.describe()
value
count 365.000000
mean 0.508583
std 0.135374
min 0.211555
25% 0.435804
50% 0.503813
75% 0.570967
max 1.500000
內容解密:
這段程式碼用於生成資料集的統計摘要。其中,count表示資料的總數,mean表示平均值,std表示標準差,min和max分別表示最小值和最大值。透過這些統計資料,可以初步判斷資料是否合理。
資料視覺化
使用Matplotlib可以視覺化資料。例如,繪製直方圖可以觀察資料的分佈。
plt.hist(frame['value'])
plt.show()
內容解密:
這段程式碼用於繪製frame['value']的直方圖。直方圖可以直觀地展示資料的分佈情況,有助於發現異常值或不合理的資料。
修正錯誤
根據錯誤的型別,可以採取不同的修正方法:
- 修改值:修復錯誤或將資料轉換為正確的格式。
- 替換值:用合理的替代值取代錯誤或缺失的值。
- 排除記錄:刪除無法修復的錯誤記錄。
程式碼撰寫與檔案記錄
撰寫用於修正錯誤的程式碼需要高品質、良好的檔案記錄和可維護性。以下是一些撰寫修正程式碼的建議:
使用Python進行資料清理
import pandas as pd
import numpy as np
# 假設有一個DataFrame包含一些缺失值
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8]
})
# 使用均值替換缺失值
df['A'] = df['A'].fillna(df['A'].mean())
print(df)
內容解密:
這段程式碼首先建立了一個包含缺失值的DataFrame。然後,使用fillna方法將欄位A中的缺失值替換為該欄位的均值。這是一種常見的處理缺失值的方法,但應根據具體情況選擇合適的方法。
資料清理與改善
在資料科學領域,資料的品質對於模型的訓練和預測結果至關重要。當資料集存在錯誤或不平衡的問題時,我們需要採取適當的措施進行清理和改善。
紀錄轉換程式碼的重要性
將資料清理的過程透過程式碼記錄下來,不僅能夠保留資料變化的歷史紀錄,也能夠自動化未來可能需要的修正步驟。這些轉換程式碼是資料處理流程中的一部分,能夠幫助我們理解資料的來源、特性以及在追求品質過程中所做的調整。
評估與自動化
在對資料集的子集進行錯誤修正後,我們需要再次進行審核,以確認是否有新的問題被引入或是原有的問題是否已經被解決。這個過程需要重複進行,直到我們對資料的品質感到滿意為止。
重點提示
保留原始資料集的副本,以便在需要時可以回復。這樣可以在實驗過程中避免因錯誤而導致資料丟失。
追蹤錯誤型別與比例
在進行資料修正的過程中,需要記錄受錯誤影響的紀錄型別。如果錯誤對某些子群體的影響較大,可能會對模型的表現產生不良影響。同時,也需要追蹤不同型別錯誤在資料集中的比例。如果錯誤紀錄的比例過高,可能需要考慮解決上游問題。
自動化測試
隨著資料集的增長,新的問題可能會出現。建立自動化測試可以幫助我們及時發現問題。例如,如果我們已經努力刪除了極端異常值,可以建立一個自動化測試來驗證資料集的變異數是否在預期範圍內。
解決資料不平衡問題
除了處理資料中的錯誤之外,資料不平衡是另一個常見的問題。資料不平衡可能導致模型偏向於多數類別,而忽視少數類別。
蒐集更多資料
解決資料不平衡的最佳方法是為代表性不足的子群體蒐集更多資料。如果無法蒐集更多資料,可以考慮對代表性不足的子群體進行過度抽樣,或對代表性過高的子群體進行欠抽樣。
過度抽樣與欠抽樣的注意事項
過度抽樣可以增加代表性不足的子群體在模型訓練中的權重,但如果原始資料不足以代表真實世界的變異,過度抽樣可能無法提升模型的表現。同樣地,使用過度抽樣的資料進行評估可能會導致結果不夠可靠。
子群體權重調整
除了抽樣方法之外,也可以透過調整子群體在訓練過程中的權重來解決資料不平衡的問題。對於代表性不足的子群體賦予較高的權重,可以增加其對模型訓練的貢獻。
異常檢測中的平衡問題
在異常檢測任務中,目標是識別不尋常的輸入。在某些情況下,預期的輸入可能是非常罕見的,這使得資料平衡更加具有挑戰性。
資料清理流程
圖表翻譯: 此圖示呈現了從原始資料集到最終資料集的處理流程,包括錯誤檢測、修正、重新審核、自動化測試以及解決資料不平衡問題等步驟。
程式碼範例:過度抽樣
import pandas as pd
from sklearn.utils.class_weight import compute_class_weight
from sklearn.preprocessing import LabelEncoder
# 假設 df 是我們的資料集,'target' 是目標變數
df = pd.read_csv('data.csv')
# 對目標變數進行編碼
le = LabelEncoder()
df['target'] = le.fit_transform(df['target'])
# 計算類別權重
class_weights = compute_class_weight(class_weight='balanced', classes=np.unique(df['target']), y=df['target'])
# 對代表性不足的類別進行過度抽樣
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=42)
X_res, y_res = ros.fit_resample(df.drop('target', axis=1), df['target'])
內容解密:
- 首先,我們匯入必要的函式庫,包括
pandas用於資料處理,以及sklearn中的LabelEncoder和compute_class_weight用於類別編碼和權重計算。 - 我們使用
LabelEncoder將目標變數'target'進行編碼,使其適合用於機器學習模型。 - 透過
compute_class_weight函式計算類別權重,這有助於我們瞭解不同類別之間的平衡狀況。 - 使用
RandomOverSampler對代表性不足的類別進行過度抽樣,以解決資料不平衡的問題。 - 最終,我們獲得了一個新的、平衡的資料集
X_res和y_res,可以用於訓練機器學習模型。
資料準備與異常檢測在邊緣AI專案中的重要性
在邊緣AI專案中,資料準備是至關重要的步驟,尤其是在處理異常檢測時。異常檢測旨在識別資料中的異常模式,這些模式可能指示潛在的問題或故障。在工業裝置維護等應用場景中,異常檢測可以提供早期預警,避免災難性故障的發生。
異常檢測的挑戰
當面臨從未發生的災難性故障時,可能無法獲得相關的示例資料。在這種情況下,資料集將僅包含代表正常運作的樣本。我們的任務是建立一個系統,能夠識別何時條件與基線顯著不同。就平衡性和代表性而言,這意味著我們應該努力捕捉廣泛的正常條件。例如,工業裝置的工作量可能會因天氣或季節而異。確保資料集包含所有可能模式的代表性樣本至關重要。
測試異常檢測系統
當沒有真實異常的例子可用於構建測試資料集時,測試異常檢測系統可能會很具挑戰性。可能需要模擬可能的變化,以確定它們是否被系統捕捉到。在工業裝置中,這可能透過故意以不尋常的方式執行機器或模擬故障來實作。也可以建立合成資料,引入潛在的異常。例如,可以修改正常的輸入以模擬各種變化。所有這些都需要來自領域專家的輸入。
佈署未經測試的系統
佈署未經真實世界資料測試的系統永遠不是明智的選擇。只有在像預測性維護這樣的有限範圍內,才應該這樣做,並且利益相關者應該對系統的有效性尚未得到證實有現實的理解。在佈署後,需要進行一段時間的嚴格審查和評估,以確保模型表現良好。
特徵工程
大多數邊緣AI專案都會涉及一些特徵工程工作。這可能簡單到縮放特徵,也可能涉及極其複雜的數位訊號處理(DSP)演算法。由於機器學習模型和其他決策演算法是根據特徵而非原始資料執行的,因此特徵工程是資料準備的重要組成部分。
為什麼進行特徵工程?
- 縮放值,使其能夠用作機器學習模型的輸入
- 組合值,可能執行感測器融合
- 預先計算DSP演算法,使訓練執行得更快
在開發過程的早期進行一些初始的特徵工程工作,可以讓您從特徵而非原始資料的角度探索和理解資料集。
分割資料
AI專案的工作流程涉及演算法開發和評估的迭代過程。為了支援這一迭代工作流程,我們需要將資料集分成三個部分:訓練、驗證和測試。
訓練、驗證和測試資料集的作用
- 訓練:直接用於開發演算法,通常透過訓練機器學習模型
- 驗證:在迭代開發過程中用於評估模型。每當開發出新的迭代版本時,根據驗證資料集檢查效能
- 測試:保留到專案的最後階段,用於確保模型能夠對從未見過的資料表現良好
使用獨立的資料分割來檢測過度擬合。如果模型的訓練準確度和驗證準確度相似,則表明模型能夠將從訓練資料集中學到的知識推廣到未見過的資料。
過度擬合的識別
透過比較模型在訓練資料和驗證資料上的表現,可以識別是否發生了過度擬合。例如,如果訓練準確率為95%,而驗證準確率為94%,則表明模型具有良好的泛化能力。然而,如果驗證準確率明顯低於訓練準確率,則可能是過度擬合的跡象。
資料分割的重要性與正確方法
在機器學習(ML)模型的開發過程中,資料的分割是至關重要的一環。適當的資料分割能夠幫助開發者評估模型的效能,檢測過擬合(overfitting),並最終提高模型在未知資料上的表現。
為何需要分割資料?
在機器學習中,模型的訓練需要大量的資料。然而,使用相同的資料進行訓練和評估會導致評估結果的不準確。因此,通常會將可用的資料分割成三個部分:訓練集(training split)、驗證集(validation split)和測試集(testing split)。
- 訓練集:用於訓練模型。
- 驗證集:用於在模型開發過程中評估模型效能,指導模型的調整。
- 測試集:用於最終評估模型的效能。
過擬合的問題
當模型的訓練準確率遠高於驗證準確率時,例如:
- 訓練準確率:95%
- 驗證準確率:76%
這通常是過擬合的跡象,表明模型在訓練資料上表現良好,但在未見資料上表現不佳。
為何需要測試集?
即使用驗證集來檢測過擬合,仍然需要測試集。這是因為在迭代開發過程中,透過不斷調整模型以提高在驗證集上的效能,可能會導致模型對驗證集過擬合。也就是說,模型的調整可能會無意中學習到驗證集的特性,從而降低在真正未知資料上的效能。
測試集提供了一個獨立的評估手段,可以在模型開發完成後給出一個清晰的效能評估。
何時使用測試集?
由於迭代開發過程中可能對驗證集過擬合,因此同樣可能對測試集過擬合。所以,使用測試集時必須非常謹慎。一旦發現模型在測試集上表現不佳,例如出現過擬合,通常不應該透過調整模型來修復它,而是應該重新開始,使用完全不同的方法。
資料分割的方法
資料通常透過隨機抽樣按照比例進行分割。常見的做法是先將資料80/20分割,其中20%作為測試集。剩下的80%再進行80/20分割,其中80%作為訓練集,20%作為驗證集。
圖表翻譯:
此圖示展示了資料分割的過程。首先將原始資料分成訓練驗證集和測試集,然後再將訓練驗證集進一步分成訓練集和驗證集。
確保每個分割都是整個資料集的代表性樣本非常重要。如果資料集平衡良好且子群體比例適當,隨機抽樣通常就足夠。但如果資料集中某些子群體代表性不足,則可能需要使用分層抽樣(stratified sampling)。
分層抽樣
分層抽樣是分別對每個子群體進行分割,然後合併結果,以確保每個分割都保持與原資料集相同的平衡性。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 邊緣AI專案資料處理最佳實務
package "圖論網路分析" {
package "節點層" {
component [節點 A] as nodeA
component [節點 B] as nodeB
component [節點 C] as nodeC
component [節點 D] as nodeD
}
package "中心性指標" {
component [度中心性
Degree Centrality] as degree
component [特徵向量中心性
Eigenvector Centrality] as eigen
component [介數中心性
Betweenness Centrality] as between
component [接近中心性
Closeness Centrality] as close
}
}
nodeA -- nodeB
nodeA -- nodeC
nodeB -- nodeD
nodeC -- nodeD
nodeA --> degree : 計算連接數
nodeA --> eigen : 計算影響力
nodeB --> between : 計算橋接度
nodeC --> close : 計算距離
note right of degree
直接連接數量
衡量局部影響力
end note
note right of eigen
考慮鄰居重要性
衡量全局影響力
end note
@enduml
圖表翻譯:
此圖示展示了分層抽樣的過程。對每個子群體分別進行資料分割,然後將結果合併,以保持每個分割的平衡性。
交叉驗證(Cross-Validation)
為了減少因特定資料分割而導致的評估偏差,可以使用k折交叉驗證(k-fold cross-validation)。這種方法將資料分成k個不同的分割,每次使用不同的分割組合進行訓練和驗證,最後平均結果以獲得更穩健的效能評估。
資料分割的陷阱
錯誤的資料分割方法可能導致無法正確評估模型在未知資料上的效能,從而影響模型的實際表現。常見的問題包括未能確保分割的代表性、未考慮子群體的平衡等。正確的資料分割和評估策略對於開發高效能的機器學習模型至關重要。
內容解密:
本段落強調了正確進行資料分割的重要性,並介紹了常見的資料分割方法和需要注意的事項,包括隨機抽樣、分層抽樣和交叉驗證等技術,以確保模型的評估結果可靠並提高模型的泛化能力。