機器學習中的資料準備



資料準備是機器學習過程中一個至關重要的步驟,它會顯著影響最終模型的準確性和有效性。它需要仔細關注細節,並對資料和手頭的問題有透徹的理解。

讓我們討論一下如何準備資料,以便更好地適應模型,從而提高準確性和結果。

什麼是資料準備?

資料準備是處理原始資料,即清洗、組織和轉換資料以使其與機器學習演算法對齊的過程。資料準備是一個持續的過程,對機器學習模型的效能有巨大影響。乾淨且結構化的資料會產生更好的結果。

資料準備的重要性

在機器學習中,模型從輸入的資料中學習。因此,只有當資料組織完善且完美時,演算法才能有效地學習。用於模型的資料質量會顯著影響模型的效能。

以下是一些定義資料準備在機器學習中重要性的方面:

  • 提高模型準確性 - 機器學習演算法完全依賴於資料。當您向模型提供乾淨且結構化的資料時,結果會更準確。
  • 促進特徵工程 - 資料準備通常包括選擇或建立新特徵來訓練模型的過程。因此,資料準備會使特徵工程更容易。
  • 資料質量 - 收集的資料通常包含不一致之處、錯誤和無關資訊。因此,當應用資料清洗、轉換等任務時,資料就會變得格式化和整潔。這可以用於獲得見解和模式。
  • 提高預測速度 - 準備好的資料使分析結果更容易,並會產生準確的結果。

資料準備流程步驟

資料準備過程包含一系列步驟,這些步驟是使資料適合分析和建模所必需的。資料準備的目標是確保資料對於分析是準確、完整和相關的。

以下是資料準備中涉及的一些關鍵步驟:

  • 資料收集
  • 資料清洗
  • 資料轉換
  • 資料降維
  • 資料分割
ML Data Preparation Steps
所示過程並非總是順序的。例如,您可能在轉換資料之前先分割資料。您可能需要收集更多資料。

讓我們詳細瞭解上述每個步驟:

資料收集

資料收集是機器學習過程的第一步,它從不同的來源收集資料以做出決策、回答研究問題和進行統計規劃。資料收集可以使用不同的來源,例如資料庫、文字檔案、圖片、聲音檔案或網路抓取。一旦選擇資料,就必須對資料進行預處理以獲得見解。此過程是為了將資料轉換成適合解決問題的適當格式。有時資料收集會在資料整合步驟之後進行。

資料整合涉及將來自多個來源的資料組合到單個數據集中進行分析。這可能包括匹配或連結不同資料集中的記錄,或基於公共變數合併資料集。

選擇原始資料後,最重要的任務是資料預處理。廣義地說,資料預處理會將選擇的資料轉換為我們可以使用或可以饋送到機器學習演算法的格式。我們總是需要預處理我們的資料,以便它可以滿足機器學習演算法的預期。資料預處理包括資料清洗、轉換和降維。讓我們詳細討論這三個方面。

資料清洗

資料清洗是識別和糾正資料中的錯誤、缺失值、重複值和異常值等的處理過程。此步驟在機器學習過程中至關重要,因為它確保資料準確、相關且無錯誤。

用於資料清洗的常用技術包括插補、異常值檢測和去除等。以下是資料清洗步驟的順序:

1. 處理重複值

資料集中存在重複資料意味著存在重複資料,這可能是由於資料輸入錯誤或資料收集過程中的問題造成的。用於去除重複資料的技術首先是識別它們,然後使用**Pandas中的drop_duplicates函式**將其刪除。

2. 糾正語法錯誤

在此步驟中,應解決結構性錯誤,例如資料格式或命名約定中的不一致之處。標準化格式和糾正錯誤將確保資料一致性和準確的分析。

3. 處理異常值

異常值是不尋常的值,與資料差異很大。用於檢測異常值的技巧包括統計方法,如**z分數**或**IQR方法**,以及機器學習方法,如**聚類**和**支援向量機 (SVM)**。

4. 處理缺失值

缺失值是指資料集中某些值未儲存的值或資料。有多種方法可以處理缺失資料,例如

  • 插補 - 在此過程中,缺失值被替換為不同的值,對於數值可以是均值、中位數或眾數等集中趨勢度量,對於分類資料則是最頻繁的類別。插補的其他方法包括迴歸插補和多重插補。
  • 刪除 - 在此過程中,刪除所有包含缺失值的例項。好吧,這並不是一種可靠的方法,因為存在資料丟失。

5. 驗證資料

資料驗證是另一個階段,它確保資料完全符合要求,以便預測結果準確。一些常見的資料驗證程式是在將資料儲存到資料庫之前檢查資料的正確性,例如:

  • 資料型別檢查
  • 程式碼檢查
  • 格式檢查
  • 範圍檢查

資料轉換

資料轉換是將資料從原始格式轉換為適合分析和建模的格式的過程。這可能包括定義結構、對齊資料、從源提取資料,然後將其儲存到適當的格式中。

有多種技術可用於將資料轉換為合適的格式。一些常用的資料轉換技術如下:

  • 縮放
  • 歸一化 - L1和L2歸一化
  • 標準化
  • 二值化
  • 編碼
  • 對數轉換

讓我們詳細討論上述每種資料轉換技術:

1. 縮放

在大多數情況下,我們收集的資料包含具有不同比例的屬性,但我們不能向機器學習演算法提供此類資料,因此需要重新縮放。資料縮放確保屬性具有相同的比例,即通常為0到1的範圍。

我們可以藉助scikit-learn Python庫的MinMaxScaler類來重新縮放資料。

示例

本例將重新縮放我們之前使用過的Pima印第安人糖尿病資料集的資料。首先,將載入CSV資料(如前幾章所做的那樣),然後藉助MinMaxScaler類,將其重新縮放至0到1的範圍。

以下指令碼的前幾行與我們在前幾章載入CSV資料時編寫的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

現在,我們可以使用MinMaxScaler類將資料重新縮放至0到1的範圍。

data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)

我們還可以根據自己的選擇彙總輸出資料。這裡,我們將精度設定為1,並顯示輸出中的前10行。

set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])
輸出
Scaled data:
[
   [0.4 0.7 0.6 0.4 0.  0.5 0.2 0.5 1. ]
   [0.1 0.4 0.5 0.3 0.  0.4 0.1 0.2 0. ]
   [0.5 0.9 0.5 0.  0.  0.3 0.3 0.2 1. ]
   [0.1 0.4 0.5 0.2 0.1 0.4 0.  0.  0. ]
   [0.  0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
   [0.3 0.6 0.6 0.  0.  0.4 0.1 0.2 0. ]
   [0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
   [0.6 0.6 0.  0.  0.  0.5 0.  0.1 0. ]
   [0.1 1.  0.6 0.5 0.6 0.5 0.  0.5 1. ]
   [0.5 0.6 0.8 0.  0.  0.  0.1 0.6 1. ]
]

從上面的輸出可以看出,所有資料都已重新縮放至0到1的範圍。

2. 歸一化

歸一化用於將資料重新縮放至0到1之間的分佈值。對於每個特徵,最小值設定為0,最大值設定為1。

這用於重新縮放資料的每一行,使其長度為1。這主要用於稀疏資料集,其中有很多零。我們可以藉助scikit-learn Python庫的Normalizer類來重新縮放資料。

在機器學習中,有兩種歸一化預處理技術,如下所示:

L1歸一化

它可以定義為一種歸一化技術,它以這樣的方式修改資料集的值:在每一行中,絕對值的總和始終加起來為1。它也稱為最小絕對偏差。

示例

在本例中,我們使用L1歸一化技術來歸一化我們之前使用過的Pima印第安人糖尿病資料集的資料。首先,將載入CSV資料,然後藉助Normalizer類對其進行歸一化。

以下指令碼的前幾行與我們在前幾章載入CSV資料時編寫的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

現在,我們可以使用帶有L1的Normalizer類來歸一化資料。

Data_normalizer = Normalizer(norm='l1').fit(array)
Data_normalized = Data_normalizer.transform(array)

我們還可以根據自己的選擇彙總輸出資料。這裡,我們將精度設定為2,並顯示輸出中的前3行。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
輸出
Normalized data:
[
   [0.02 0.43 0.21 0.1  0. 0.1  0. 0.14 0. ]
   [0.   0.36 0.28 0.12 0. 0.11 0. 0.13 0. ]
   [0.03 0.59 0.21 0.   0. 0.07 0. 0.1  0. ]
]

L2歸一化

它可以定義為一種歸一化技術,它以這樣的方式修改資料集的值:在每一行中,平方的總和始終加起來為1。它也稱為最小二乘法。

示例

在本例中,我們使用L2歸一化技術來歸一化我們之前使用過的Pima印第安人糖尿病資料集的資料。首先,將載入CSV資料(如前幾章所做的那樣),然後藉助Normalizer類對其進行歸一化。

以下指令碼的前幾行與我們在前幾章載入CSV資料時編寫的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

現在,我們可以使用帶有L1的Normalizer類來歸一化資料。

Data_normalizer = Normalizer(norm='l2').fit(array)
Data_normalized = Data_normalizer.transform(array)

我們還可以根據自己的選擇彙總輸出資料。這裡,我們將精度設定為2,並顯示輸出中的前3行。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
輸出
Normalized data:
[
   [0.03 0.83 0.4  0.2  0. 0.19 0. 0.28 0.01]
   [0.01 0.72 0.56 0.24 0. 0.22 0. 0.26 0.  ]
   [0.04 0.92 0.32 0.   0. 0.12 0. 0.16 0.01]
]

3. 標準化

標準化用於將資料屬性轉換為標準高斯分佈,其均值為0,標準差為1。此技術適用於線性迴歸、邏輯迴歸等機器學習演算法,這些演算法假設輸入資料集中存在高斯分佈,並且使用重新縮放的資料可以產生更好的結果。

我們可以藉助scikit-learn Python庫的StandardScaler類來標準化資料(均值=0,標準差=1)。

示例

在本例中,我們將重新縮放我們之前使用過的Pima印第安人糖尿病資料集的資料。首先,將載入CSV資料,然後藉助StandardScaler類將其轉換為均值=0,標準差=1的高斯分佈。

以下指令碼的前幾行與我們在前幾章載入CSV資料時編寫的相同。

from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

現在,我們可以使用StandardScaler類來重新縮放資料。

data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)

我們還可以根據自己的選擇彙總輸出資料。這裡,我們將精度設定為2,並顯示輸出中的前5行。

set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])
輸出
Rescaled data:
[
   [ 0.64  0.85  0.15  0.91 -0.69  0.2   0.47  1.43  1.37]
   [-0.84 -1.12 -0.16  0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
   [ 1.23  1.94 -0.26 -1.29 -0.69 -1.1   0.6  -0.11  1.37]
   [-0.84 -1.   -0.16  0.15  0.12 -0.49 -0.92 -1.04 -0.73]
   [-1.14  0.5  -1.5   0.91  0.77  1.41  5.48 -0.02  1.37]
]

4. 二值化

顧名思義,這是一種可以使我們的資料二值化的技術。我們可以使用二值化閾值來使我們的資料二值化。高於該閾值的值將轉換為1,低於該閾值的值將轉換為0。例如,如果我們選擇閾值=0.5,則高於該閾值的資料集值將變為1,低於該閾值的資料集值將變為0。這就是為什麼我們可以稱之為對資料進行二值化或對資料進行閾值處理。當我們的資料集中有機率並且想要將其轉換為清晰的值時,此技術很有用。

我們可以藉助scikit-learn Python庫的Binarizer類來二值化資料。

示例

在本例中,我們將重新縮放我們之前使用過的Pima印第安人糖尿病資料集的資料。首先,將載入CSV資料,然後藉助Binarizer類將其轉換為二進位制值,即0和1,具體取決於閾值。我們取0.5作為閾值。

以下指令碼的前幾行與我們在前幾章載入CSV資料時編寫的相同。

from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

現在,我們可以使用Binarize類將資料轉換為二進位制值。

binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)

這裡,我們顯示輸出中的前5行。

print ("\nBinary data:\n", Data_binarized [0:5])
輸出
Binary data:
[
   [1. 1. 1. 1. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 0. 1. 0. 1. 0.]
   [1. 1. 1. 0. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 1. 1. 0. 1. 0.]
   [0. 1. 1. 1. 1. 1. 1. 1. 1.]
]

5. 編碼

此技術用於將分類變數轉換為數字表示。一些常見的編碼技術包括獨熱編碼標籤編碼目標編碼

標籤編碼

大多數sklearn函式期望資料使用數字標籤而不是文字標籤。因此,我們需要將此類標籤轉換為數字標籤。此過程稱為標籤編碼。我們可以藉助scikit-learn Python庫的LabelEncoder()函式執行資料的標籤編碼。

示例

在下面的示例中,Python指令碼將執行標籤編碼。

首先,匯入所需的Python庫,如下所示:

import numpy as np
from sklearn import preprocessing

現在,我們需要提供輸入標籤,如下所示:

input_labels = ['red','black','red','green','black','yellow','white']

下一行程式碼將建立標籤編碼器並對其進行訓練。

encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

接下來的幾行指令碼將透過編碼隨機排序的列表來檢查效能:

test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)

我們可以藉助以下Python指令碼獲取編碼值的列表:

print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))
輸出
Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']

6. 對數轉換

此技術通常用於處理傾斜資料。它涉及對資料集中所有值應用自然對數函式以修改數值的比例。

資料降維

資料縮減是一種透過選擇與分析最相關的特徵或觀察值的子集來減小資料集大小的技術。這有助於減少噪聲並提高模型的準確性。

當資料集非常大或資料集包含大量無關資料時,這很有用。

最常用的技術之一是降維,它在不丟失重要資訊的情況下減小資料集的大小。另一種方法是離散化,其中將時間和溫度等連續值轉換為離散類別,從而簡化資料。

資料分割

資料分割是機器學習資料準備的最後一步,其中資料被分割成不同的集合:

  • 訓練集 - 機器學習模型用於學習模式的子集。
  • 驗證集 - 用於評估機器學習模型在訓練期間效能的子集。
  • 測試集 - 用於評估訓練模型的效能和效率的子集。

Python示例

讓我們檢查一下使用乳腺癌資料集進行資料準備的示例:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# load the dataset
data = load_breast_cancer()

# separate the features and target
X = data.data
y = data.target

# split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# normalize the data using StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

在本例中,我們首先使用scikit-learn中的load_breast_cancer函式載入乳腺癌資料集。然後,我們分離特徵和目標,並使用train_test_split函式將資料分割成訓練集和測試集。

最後,我們使用scikit-learn中的StandardScaler對資料進行歸一化,該函式減去均值並將資料縮放至單位方差。這有助於將所有特徵都放到相似的尺度上,這對於SVM和神經網路之類的模型尤其重要。

資料準備和特徵工程

特徵工程涉及從現有資料中建立新的特徵,這些特徵可能對分析更有用或更有資訊量。它可能涉及組合或轉換現有特徵,或基於領域知識或見解建立新特徵。資料準備和特徵工程在整個資料預處理管道中是相輔相成的。

廣告