準備機器學習的資料
在建立機器學習模型之前,您需要準備用於定型和評估的資料。 資料從其來源 (通常作為資料檔案) 被內嵌至 Azure Databricks 中。 也可以根據資料檔案建立差異資料表,以簡化資料探索和分析。 資料經內嵌後,資料科學家為機器學習進行準備。
資料的準備通常涉及兩項關鍵工作:
- 資料清理:識別和緩解資料中會影響其對機器學習實用性的問題。
- 特徵工程和前置處理:為模型定型選取和轉換合適的特徵。
資料清理
清理資料所需的具體步驟因專案而異,但需要解决的一般問題包括:
- 不完整資料:資料通常包括遺漏個別欄位的記錄 (通常由 NULL 值表示)。 需要識別遺漏的值,並透過以下方式緩解它們:
- 用合適的替換值至來替換它們 - 透過在數列中插入值、使用平均值 (或中間值) 或建立其他合適的值。
- 完全移除不完整的資料列 (假設這為模型化留下了足够合適的代表性資料)
- 錯誤:由於資料輸入錯誤或上游資料處理失敗,資料中包含錯誤的情况並不少見。 尋找錯誤可能很困難,通常需要使用査詢和視覺效果對資料進行大量檢查,以摘要資料並尋找與指定欄位中大多數其他值不一致的值。
- 極端值:極端值是指明顯超出 (高於或低於) 資料統計散發的值。 有時極端值是錯誤的指示 (例如,值可能多了一個零或省略了一個小數點),有時它們是與大多數觀察相比異常高或低的真實值。 在任何一種情况下,極端值都可以對機器學習模型的定型產生負面影響;因此,通常最好的方法是,透過將它們重設為上限或下限閾值,或者從資料集中移除包含極端值的記錄來處理它們。
- 資料類型不正確:機器學習演算法可能對指派至特徵值的資料類型敏感。 根據文字檔 (包含錯誤或 null 值) 的資料集將數字位欄位誤播為字串資料類型很常見,通常表示離散整數值的值可能會被誤播為十進位數字 (反之亦然)。 您應該檢查資料的結構描述,並指派最有效地反映資料值的適當資料類型。
- 不平衡資料:如果定型資料對可能遇到的所有不同特徵和標籤組合都有足够的表示,那麼機器學習定型效果最好。 在不平衡的資料集中,包括特定分類值或欄位組合的記錄被過度表示;這會影響定型演算法並將偏差引入模型中。 緩解此問題的常見技術是依包含的重複資料列對表示不足的值進行超取樣,或者對表示過多的資料列進行超取樣 (透過將它們從資料集中移除)。
在 Azure Databricks 上,偵測和處理此類問題的最常見方法是在筆記本中撰寫程式碼來探索和操作資料。 用於這種資料操作的主要類別是 Spark DataFrame。
例如,以下程式碼將文字檔中的資料載入至 DataFrame 中:
df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")
或者,如果資料已載入至 Azure Databricks 工作區中的差異資料表中,則可以使用 SQL 査詢將其資料載入至 DataFrame 中:
df = spark.sql("SELECT * FROM mytable")
將資料載入至 DataFrame 中後,您可以使用 Spark SQL 程式庫中的方法和其他函式來探索和轉換資料。 例如,以下程式碼使用 dropna 方法移除任何包含 null 值的資料列,並將特定的資料類型指派至 DataFrame 中的資料行。
clean_data = df.dropna().select(col("column1").astype("string"),
col("column2").astype("float"))
提示
如需 Spark DataFrame 功能的詳細資訊,請參閱 Spark DataFrame 文件。
特徵工程和前置處理
在確保資料集完整且乾淨後,您可以開始為機器學習準備特徵。 特徵工程是反覆式方法,通常需要一些嘗試和錯誤來確定哪些特徵資料行具有預測價值,以及如何最好地表示特徵。 常見的特徵工程和前置處理工作包括:
衍生新特徵:通常,您可以從現有特徵中衍生出新的、更具預測性的特徵。 例如,假設資料集包括日期資料行,並且您懷疑完整的日期可能不是識別標籤的重要預測因素,但星期幾可能是重要因素。 可以根據日期建立新的 day_of_week 特徵,並測試您的理論。
分隔數字特徵:在某些情况下,當將數字分隔為表示特定值範圍的類別時,數字可能更具預測性。 例如,可以取得價格特徵中的數字,並根據適當的閾值將它們指派至低、中和高類別中。
編碼類別特徵:許多資料集包括由字串值表示的類別資料。 然而,大多數機器學習演算法在處理數字資料時效果最好。 因此,指派數字程式碼來表示類別而不是字串是很常見的。 例如,產品詳細資料的資料集可能包括色彩特徵,其值可以為「綠色」、「紅色」或「藍色」。 可以使用簡單的整數程式碼對這些值進行編碼,例如 0 表示「綠色」,1 表示「紅色」,2 表示「藍色」。 或者,您可以使用獨熱編碼技術,為每個可能的類別建立新資料行,並根據每一資料行的情况為每一資料列指派值 1 或 0,如下所示:
原始色彩資料行 綠色 紅色 藍色 綠色 1 0 0 藍色 0 0 1 紅色 0 1 0 縮放 (標準化) 數值:數值資料值之間的小數位數或測量單位通常不同。 機器學習演算法會將它們全部處理為絕對數值,並且較大值的功能通常可以主導模型的定型。 為了解决這個問題,通常會縮放所有數字資料行,以便單一資料行的個別值彼此保持相同的比例關聯,但所有數字資料行的小數位數都相似。 例如,假設資料集包含以公尺和公斤為測量單位的長度和重量值。 您可以將這兩個特徵轉換為介於 0 和 1 之間的縮放值,如下所示:
length 重量 scaled_length scaled_weight 250.0 2.1 0.250 0.210 176.0 0.9 0.176 0.09
許多機器學習程式庫都包含可用於執行常見特徵工程工作的類別。 例如,Spark MLlib 程式庫包含 StringIndexer 類別,您可以使用它對字串值執行簡單的整數型編碼。
from pyspark.ml.feature import StringIndexer
encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)
注意
值得更詳細地解釋 StringIndexer 程式碼範例。 Spark MLlib 類別可以包括將特定轉換作業的演算法調整為適用於某些範例資料的評估工具。 在這種情況下,StringIndexer 將編碼演算法調整為適用於資料 DataFrame 中 catCol 資料行中的離散字串值,以確定產生包含編碼值的新 catColCode 資料行所需的特定計算。 評估工具的輸出是轉換器,它封裝了評估工具定義的函式,可以將該函式套用至資料並產生新的 DataFrame。 在本例中,我們將用於確定編碼函式的相同資料傳遞給產生的轉換器,以實際套用編碼。
在 Spark MLLib 中,可以將一系列評估工具和轉換器鏈結在一個管線中,其執行準備資料所需的所有特徵工程和前置處理步驟。 管線可以以機器學習演算法結束,其充當評估工具來確定從已就緒的特徵預測標籤所需的作業。 管線的輸出是機器學習模型,它實際上是轉換器,可以用於將模型函式套用至 DataFrame 中的特徵並預測相應的標籤值。