人工智慧資料準備


在上一節中,我們已經學習了監督和無監督機器學習演算法。 這些演算法需要格式化資料才能開始訓練過程。在這一節中,我們以某種方式準備或格式化資料,以便將其作為ML演算法的輸入提供。

本章重點介紹機器學習演算法的資料準備。

預處理資料

在我們的日常生活中,需要處理大量資料,但這些資料是原始資料。 為了提供資料作為機器學習演算法的輸入,需要將其轉換為有意義的資料。 這就是資料預處理進入影象的地方。 換言之,可以說在將資料提供給機器學習演算法之前,我們需要對資料進行預處理。

資料預處理步驟

按照以下步驟在Python中預處理資料 -

第1步 - 匯入有用的軟體包 - 如果使用Python,那麼這將成為將資料轉換為特定格式(即預處理)的第一步。如下程式碼 -

import numpy as np
sklearn import preprocessing

這裡使用了以下兩個軟體包 -

  • NumPy - 基本上NumPy是一種通用的陣列處理軟體包,設計用於高效處理任意記錄的大型多維陣列而不犧牲小型多維陣列的速度。
  • sklearn.preprocessing - 此包提供了許多常用的實用函式和變換器類,用於將原始特徵向量更改為更適合機器學習演算法的表示形式。

第2步 - 定義樣本資料 - 匯入包後,需要定義一些樣本資料,以便可以對這些資料應用預處理技術。現在將定義以下樣本資料 -

input_data = np.array([2.1, -1.9, 5.5],
                      [-1.5, 2.4, 3.5],
                      [0.5, -7.9, 5.6],
                      [5.9, 2.3, -5.8]])

第3步 - 應用預處理技術 - 在這一步中,我們需要應用預處理技術。

以下部分描述資料預處理技術。

資料預處理技術

下面介紹資料預處理技術 -

二值化

這是當需要將數值轉換為布林值時使用的預處理技術。我們可以用一種內建的方法來二值化輸入資料,比如說用0.5作為閾值,方法如下 -

data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)

現在,執行上面的程式碼後,將得到以下輸出,所有高於0.5(閾值)的值將被轉換為1,並且所有低於0.5的值將被轉換為0

二值化資料

[[ 1. 0. 1.]
[ 0. 1. 1.]
[ 0. 0. 1.]
[ 1. 1. 0.]]

平均去除

這是機器學習中使用的另一種非常常見的預處理技術。 基本上它用於消除特徵向量的均值,以便每個特徵都以零為中心。 還可以消除特徵向量中的特徵偏差。 為了對樣本資料應用平均去除預處理技術,可以編寫如下Python程式碼。 程式碼將顯示輸入資料的平均值和標準偏差 -

print("Mean = ", input_data.mean(axis = 0))
print("Std deviation = ", input_data.std(axis = 0))

執行上述程式碼行後,將得到以下輸出 -

Mean = [ 1.75       -1.275       2.2]
Std deviation = [ 2.71431391  4.20022321  4.69414529]

現在,下面的程式碼將刪除輸入資料的平均值和標準偏差 -

data_scaled = preprocessing.scale(input_data)
print("Mean =", data_scaled.mean(axis=0))
print("Std deviation =", data_scaled.std(axis = 0))

執行上述程式碼行後,將得到以下輸出 -

Mean = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Std deviation = [ 1.             1.             1.]

縮放

這是另一種資料預處理技術,用於縮放特徵向量。 特徵向量的縮放是需要的,因為每個特徵的值可以在許多隨機值之間變化。 換句話說,我們可以說縮放非常重要,因為我們不希望任何特徵合成為大或小。 借助以下Python程式碼,我們可以對輸入資料進行縮放,即特徵向量 -

最小最大縮放

data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)

執行上述程式碼行後,將得到以下輸出 -

[ [ 0.48648649  0.58252427   0.99122807]
[   0.          1.           0.81578947]
[   0.27027027  0.           1.        ]
[   1.          0. 99029126  0.        ]]

正常化

這是另一種資料預處理技術,用於修改特徵向量。 這種修改對於在一個普通的尺度上測量特徵向量是必要的。 以下是可用於機器學習的兩種標準化 -

L1標準化

它也被稱為最小絕對偏差。 這種標準化會修改這些值,以便絕對值的總和在每行中總是最多為1。 它可以在以下Python程式碼,使用上面的輸入資料來實現 -

# Normalize data
data_normalized_l1 = preprocessing.normalize(input_data, norm = 'l1')
print("\nL1 normalized data:\n", data_normalized_l1)

上面的程式碼行生成以下輸出:

L1 normalized data:
[[ 0.22105263  -0.2          0.57894737]
[ -0.2027027    0.32432432   0.47297297]
[  0.03571429  -0.56428571   0.4       ]
[  0.42142857   0.16428571  -0.41428571]]

L2標準化

它也被稱為最小二乘。這種歸正常化修改了這些值,以便每一行中的平方和總是最多為1。它可以在以下Python程式碼,使用上面的輸入資料來實現 -

# Normalize data
data_normalized_l2 = preprocessing.normalize(input_data, norm = 'l2')
print("\nL2 normalized data:\n", data_normalized_l2)

執行以上程式碼行將生成以下輸出 -

L2 normalized data:
[[ 0.33946114  -0.30713151   0.88906489]
[ -0.33325106   0.53320169   0.7775858 ]
[  0.05156558  -0.81473612   0.57753446]
[  0.68706914   0.26784051  -0.6754239 ]]

標記資料

我們已經知道,某種格式的資料對於機器學習演算法是必需的。 另一個重要的要求是,在將資料作為機器學習演算法的輸入傳送之前,必須正確標記資料。 例如,如果所說的分類,那麼資料上會有很多標記。 這些標記以文字,數位等形式存在。與sklearn中的機器學習相關的功能期望資料必須具有數位標記。 因此,如果資料是其他形式,那麼它必須轉換為數位。 這個將單詞標籤轉換為數位形式的過程稱為標記編碼。

標記編碼步驟

按照以下步驟在Python中對資料標記進行編碼 -

第1步 - 匯入有用的軟體包

如果使用Python,那麼這將是將資料轉換為特定格式(即預處理)的第一步。 它可以做到如下 -

import numpy as np
from sklearn import preprocessing

第2步 - 定義樣本標籤

匯入包後,我們需要定義一些樣本標籤,以便可以建立和訓練標籤編碼器。 現在將定義以下樣本標籤 -

# Sample input labels
input_labels = ['red','black','red','green','black','yellow','white']

第3步 - 建立和訓練標籤編碼器物件

在這一步中,我們需要建立標籤編碼器並對其進行訓練。 以下是Python程式碼的實現 -

# Creating the label encoder
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

以下是執行上面的Python程式碼後的輸出 -

LabelEncoder()

第4步 - 通過編碼隨機排序列表來檢查效能

此步驟可用於通過編碼隨機排序列表來檢查效能。 下面的Python程式碼可以做同樣的事情 -

# encoding a set of labels
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)

標籤將如下列印 -

Labels = ['green', 'red', 'black']

現在,可以得到編碼值列表,即將文字標籤轉換為數位,如下所示 -

print("Encoded values =", list(encoded_values))

輸出結果列印如下 -

Encoded values = [1, 2, 0]

第5步 - 通過解碼一組亂數來檢查效能 -

通過對亂數字集進行解碼,可以使用此步驟來檢查效能。 下面的Python程式碼也可以做同樣的事情 -

# decoding a set of values
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
print("\nEncoded values =", encoded_values)

現在,將被列印如下 -

Encoded values = [3, 0, 4, 1]
print("\nDecoded labels =", list(decoded_list))

現在,解碼值將被列印如下 -

Decoded labels = ['white', 'black', 'yellow', 'green']

標記與未標記資料

未標記的資料主要由自然或人造物體的樣本組成,這些樣本可以很容易從現實世界中獲得。 它們包括音訊,視訊,照片,新聞文章等。

另一方面,帶標籤的資料採用一組未標記的資料,並用一些有意義的標籤或標籤或類來擴充每片未標記的資料。 例如,如果有照片,那麼標籤可以基於照片的內容放置,即它是男孩或女孩或動物或其他任何照片。 標記資料需要人類專業知識或判斷一個給定的未標記資料。

有很多情況下,無標籤資料豐富且容易獲得,但標註資料通常需要人工/專家進行注釋。 半監督學習嘗試將標記資料和未標記資料組合起來,以建立更好的模型。