在上一節(jié)中,我們已經(jīng)學(xué)習(xí)了監(jiān)督和無監(jiān)督機(jī)器學(xué)習(xí)算法。 這些算法需要格式化數(shù)據(jù)才能開始訓(xùn)練過程。在這一節(jié)中,我們以某種方式準(zhǔn)備或格式化數(shù)據(jù),以便將其作為ML算法的輸入提供。
本章重點(diǎn)介紹機(jī)器學(xué)習(xí)算法的數(shù)據(jù)準(zhǔn)備。
在我們的日常生活中,需要處理大量數(shù)據(jù),但這些數(shù)據(jù)是原始數(shù)據(jù)。 為了提供數(shù)據(jù)作為機(jī)器學(xué)習(xí)算法的輸入,需要將其轉(zhuǎn)換為有意義的數(shù)據(jù)。 這就是數(shù)據(jù)預(yù)處理進(jìn)入圖像的地方。 換言之,可以說在將數(shù)據(jù)提供給機(jī)器學(xué)習(xí)算法之前,我們需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。
數(shù)據(jù)預(yù)處理步驟
按照以下步驟在Python中預(yù)處理數(shù)據(jù) -
第1步 - 導(dǎo)入有用的軟件包 - 如果使用Python,那么這將成為將數(shù)據(jù)轉(zhuǎn)換為特定格式(即預(yù)處理)的第一步。如下代碼 -
import numpy as np
sklearn import preprocessing
這里使用了以下兩個(gè)軟件包 -
第2步 - 定義樣本數(shù)據(jù) - 導(dǎo)入包后,需要定義一些樣本數(shù)據(jù),以便可以對(duì)這些數(shù)據(jù)應(yīng)用預(yù)處理技術(shù)?,F(xiàn)在將定義以下樣本數(shù)據(jù) -
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步 - 應(yīng)用預(yù)處理技術(shù) - 在這一步中,我們需要應(yīng)用預(yù)處理技術(shù)。
以下部分描述數(shù)據(jù)預(yù)處理技術(shù)。
下面介紹數(shù)據(jù)預(yù)處理技術(shù) -
二值化
這是當(dāng)需要將數(shù)值轉(zhuǎn)換為布爾值時(shí)使用的預(yù)處理技術(shù)。我們可以用一種內(nèi)置的方法來二值化輸入數(shù)據(jù),比如說用0.5作為閾值,方法如下 -
data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)
現(xiàn)在,運(yùn)行上面的代碼后,將得到以下輸出,所有高于0.5(閾值)的值將被轉(zhuǎn)換為1,并且所有低于0.5的值將被轉(zhuǎn)換為0。
二值化數(shù)據(jù)
[[ 1. 0. 1.]
[ 0. 1. 1.]
[ 0. 0. 1.]
[ 1. 1. 0.]]
平均去除
這是機(jī)器學(xué)習(xí)中使用的另一種非常常見的預(yù)處理技術(shù)。 基本上它用于消除特征向量的均值,以便每個(gè)特征都以零為中心。 還可以消除特征向量中的特征偏差。 為了對(duì)樣本數(shù)據(jù)應(yīng)用平均去除預(yù)處理技術(shù),可以編寫如下Python代碼。 代碼將顯示輸入數(shù)據(jù)的平均值和標(biāo)準(zhǔn)偏差 -
print("Mean = ", input_data.mean(axis = 0))
print("Std deviation = ", input_data.std(axis = 0))
運(yùn)行上述代碼行后,將得到以下輸出 -
Mean = [ 1.75 -1.275 2.2]
Std deviation = [ 2.71431391 4.20022321 4.69414529]
現(xiàn)在,下面的代碼將刪除輸入數(shù)據(jù)的平均值和標(biāo)準(zhǔn)偏差 -
data_scaled = preprocessing.scale(input_data)
print("Mean =", data_scaled.mean(axis=0))
print("Std deviation =", data_scaled.std(axis = 0))
運(yùn)行上述代碼行后,將得到以下輸出 -
Mean = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Std deviation = [ 1. 1. 1.]
縮放
這是另一種數(shù)據(jù)預(yù)處理技術(shù),用于縮放特征向量。 特征向量的縮放是需要的,因?yàn)槊總€(gè)特征的值可以在許多隨機(jī)值之間變化。 換句話說,我們可以說縮放非常重要,因?yàn)槲覀儾幌M魏翁卣骱铣蔀榇蠡蛐 ?借助以下Python代碼,我們可以對(duì)輸入數(shù)據(jù)進(jìn)行縮放,即特征矢量 -
最小最大縮放
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)
運(yùn)行上述代碼行后,將得到以下輸出 -
[ [ 0.48648649 0.58252427 0.99122807]
[ 0. 1. 0.81578947]
[ 0.27027027 0. 1. ]
[ 1. 0. 99029126 0. ]]
這是另一種數(shù)據(jù)預(yù)處理技術(shù),用于修改特征向量。 這種修改對(duì)于在一個(gè)普通的尺度上測量特征向量是必要的。 以下是可用于機(jī)器學(xué)習(xí)的兩種標(biāo)準(zhǔn)化 -
L1標(biāo)準(zhǔn)化
它也被稱為最小絕對(duì)偏差。 這種標(biāo)準(zhǔn)化會(huì)修改這些值,以便絕對(duì)值的總和在每行中總是最多為1。 它可以在以下Python代碼,使用上面的輸入數(shù)據(jù)來實(shí)現(xiàn) -
# 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標(biāo)準(zhǔn)化
它也被稱為最小二乘。這種歸正?;薷牧诉@些值,以便每一行中的平方和總是最多為1。它可以在以下Python代碼,使用上面的輸入數(shù)據(jù)來實(shí)現(xiàn) -
# Normalize data
data_normalized_l2 = preprocessing.normalize(input_data, norm = 'l2')
print("\nL2 normalized data:\n", data_normalized_l2)
執(zhí)行以上代碼行將生成以下輸出 -
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 ]]
我們已經(jīng)知道,某種格式的數(shù)據(jù)對(duì)于機(jī)器學(xué)習(xí)算法是必需的。 另一個(gè)重要的要求是,在將數(shù)據(jù)作為機(jī)器學(xué)習(xí)算法的輸入發(fā)送之前,必須正確標(biāo)記數(shù)據(jù)。 例如,如果所說的分類,那么數(shù)據(jù)上會(huì)有很多標(biāo)記。 這些標(biāo)記以文字,數(shù)字等形式存在。與sklearn中的機(jī)器學(xué)習(xí)相關(guān)的功能期望數(shù)據(jù)必須具有數(shù)字標(biāo)記。 因此,如果數(shù)據(jù)是其他形式,那么它必須轉(zhuǎn)換為數(shù)字。 這個(gè)將單詞標(biāo)簽轉(zhuǎn)換為數(shù)字形式的過程稱為標(biāo)記編碼。
標(biāo)記編碼步驟
按照以下步驟在Python中對(duì)數(shù)據(jù)標(biāo)記進(jìn)行編碼 -
第1步 - 導(dǎo)入有用的軟件包
如果使用Python,那么這將是將數(shù)據(jù)轉(zhuǎn)換為特定格式(即預(yù)處理)的第一步。 它可以做到如下 -
import numpy as np
from sklearn import preprocessing
第2步 - 定義樣本標(biāo)簽
導(dǎo)入包后,我們需要定義一些樣本標(biāo)簽,以便可以創(chuàng)建和訓(xùn)練標(biāo)簽編碼器。 現(xiàn)在將定義以下樣本標(biāo)簽 -
# Sample input labels
input_labels = ['red','black','red','green','black','yellow','white']
第3步 - 創(chuàng)建和訓(xùn)練標(biāo)簽編碼器對(duì)象
在這一步中,我們需要?jiǎng)?chuàng)建標(biāo)簽編碼器并對(duì)其進(jìn)行訓(xùn)練。 以下是Python代碼的實(shí)現(xiàn) -
# Creating the label encoder
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)
以下是運(yùn)行上面的Python代碼后的輸出 -
LabelEncoder()
第4步 - 通過編碼隨機(jī)排序列表來檢查性能
此步驟可用于通過編碼隨機(jī)排序列表來檢查性能。 下面的Python代碼可以做同樣的事情 -
# encoding a set of labels
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
標(biāo)簽將如下打印 -
Labels = ['green', 'red', 'black']
現(xiàn)在,可以得到編碼值列表,即將文字標(biāo)簽轉(zhuǎn)換為數(shù)字,如下所示 -
print("Encoded values =", list(encoded_values))
輸出結(jié)果打印如下 -
Encoded values = [1, 2, 0]
第5步 - 通過解碼一組隨機(jī)數(shù)來檢查性能 -
通過對(duì)隨機(jī)數(shù)字集進(jìn)行解碼,可以使用此步驟來檢查性能。 下面的Python代碼也可以做同樣的事情 -
# decoding a set of values
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
print("\nEncoded values =", encoded_values)
現(xiàn)在,將被打印如下 -
Encoded values = [3, 0, 4, 1]
print("\nDecoded labels =", list(decoded_list))
現(xiàn)在,解碼值將被打印如下 -
Decoded labels = ['white', 'black', 'yellow', 'green']
標(biāo)記與未標(biāo)記數(shù)據(jù)
未標(biāo)記的數(shù)據(jù)主要由自然或人造物體的樣本組成,這些樣本可以很容易從現(xiàn)實(shí)世界中獲得。 它們包括音頻,視頻,照片,新聞文章等。
另一方面,帶標(biāo)簽的數(shù)據(jù)采用一組未標(biāo)記的數(shù)據(jù),并用一些有意義的標(biāo)簽或標(biāo)簽或類來擴(kuò)充每片未標(biāo)記的數(shù)據(jù)。 例如,如果有照片,那么標(biāo)簽可以基于照片的內(nèi)容放置,即它是男孩或女孩或動(dòng)物或其他任何照片。 標(biāo)記數(shù)據(jù)需要人類專業(yè)知識(shí)或判斷一個(gè)給定的未標(biāo)記數(shù)據(jù)。
有很多情況下,無標(biāo)簽數(shù)據(jù)豐富且容易獲得,但標(biāo)注數(shù)據(jù)通常需要人工/專家進(jìn)行注釋。 半監(jiān)督學(xué)習(xí)嘗試將標(biāo)記數(shù)據(jù)和未標(biāo)記數(shù)據(jù)組合起來,以建立更好的模型。