機器學習A Z 資料預處理

2021-09-12 23:48:03 字數 4219 閱讀 9644

資料預處理是機器學習中非常重要的步驟,為了能正確的分析資料,得到最佳的機器學習演算法,拿到資料後我們一般來說都需要對資料進行預處理。資料預處理包括以下幾個步驟:

匯入資料集

處理缺失資料

分類資料

資料分成訓練集和測試集

特徵縮放

我們當前有一組資料集如下:

country,age,salary,purchased

france,44,72000,no

spain,27,48000,yes

germany,30,54000,no

spain,38,61000,no

germany,40,,yes

france,35,58000,yes

spain,,52000,no

france,48,79000,yes

germany,50,83000,no

france,37,67000,yes

這組資料反映的是使用者的國籍、年齡、薪水對是否購買該商品的影響。匯入資料集我們一般要用到pandas包,對於這組資料而言,前三列都是自變數,最後一列是因變數,即我們要進行**的結果。那麼匯入資料的**如下(這裡我們先把後面要用到的包匯入):

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import standardscaler

data_path = '../data/data.csv'

#import the dataset

dataset = pd.read_csv(data_path)

x = dataset.iloc[:,:-1].values

y = dataset.iloc[:,3].values

x為資料中所有行的除了最後一列的所有資料,y則是最後一列的結果。這樣,資料集就被匯入進來了。

仔細觀察這組資料集,我們會發現有幾行的資料出現了資料缺失的情況,比如第五行資料中就缺少了salary的資訊。那麼對於這種缺失的資料應該怎麼處理呢?以下有兩種方法:

那麼如何用python來處理呢,我們要用到的就是強大的sklearn包,其中imputer類可以用來處理缺失資料,**如下所示:

# taking care of missing data

from sklearn.preprocessing import imputer

imputer = imputer(missing_values = 'nan', strategy = 'mean', axis = 0)

imputer = imputer.fit(x[:, 1:3])

x[:, 1:3] = imputer.transform(x[:, 1:3])

處理之後我們再檢視x的資料,會發現缺失資料已經被該列的平均值所填充。

仔細觀察這組資料,對於年齡和薪水都是數值,而國家卻是各個國家的類別,是否購買這邊只有購買和未購買兩個類別。在機器學習中我們本質上是用方程對資料進行不同的處理,那麼針對這種不同的類別,需要將其轉換成不同的數值,來帶入我們的方程裡面。在python中,依然是使用sklearn包,要用到的工具是labelencoder。**如下:

# encoding categorical data

# encoding the independent variable

from sklearn.preprocessing import labelencoder, onehotencoder

labelencoder_x = labelencoder()

x[:, 0] = labelencoder_x.fit_transform(x[:, 0])

onehotencoder = onehotencoder(categorical_features = [0])

x = onehotencoder.fit_transform(x).toarray()

# encoding the dependent variable

labelencoder_y = labelencoder()

y = labelencoder_y.fit_transform(y)

在我們使用labelencoder進行轉換後,第一列的資料會將國家變成0,1,2這些數值,但這樣會帶來乙個問題,原本這些國家僅僅只是表示了不同的類別,但轉換成數字後會無意的將其進行了排序,而這些排序是無意義的,那麼這裡要使用虛擬編碼來解決這種問題。

所謂虛擬編碼,如下圖所示,原本資料中的國籍有三個類別法國、西班牙和德國,那麼我們可以將其分為三列,每一列代表使用者是否是這一列的分組,比如如果該使用者是法國人,那麼法國這一列就為1,而另外兩列為0。

使用虛擬編碼的方式,可以將原來的一列變數變為了三列變數,但數值之間沒有了順序的區別。使用python的話這裡用到的工具是onehotencoder,**上面也已經給出,categorical_features指的是要處理的是哪一列。當然別忘了最後一列,由於最後一列是因變數,python的函式可以自動將這一列識別為分類資料,因此不需要再使用onehotencoder,直接用labelencoder處理即可。

再切分資料前,我們需要談談什麼是訓練集和測試集,那麼首先,說一下機器學習這個名詞代表的意義。機器學習,顧名思義,就是讓機器學習資料之間的關係,並可以用學習到的結果對新的資料進行**。那麼學習的過程就是不斷通過資料來修改自己的公式。機器從訓練集中的資料學習資料的相關性,學習完之後,機器需要在新的資料即測試集來測試自己訓練的成果怎樣。在python中,有非常簡單的方法來切分資料集,如下所示:

#spliting the dataset to trainset and testset

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 0)

其中test_size指的就是測試集所佔的比例,最後的random_state指的是切分方式,一樣的random_state切出來的結果是一樣的。關於訓練集、測試集的概念在我的另一篇部落格: 吳恩達機器學習筆記-應用機器學習的建議 中有提及,是吳恩達老師的課程的筆記,可以額外參考一下。

回過頭來看下這組資料,這裡重點關注下年齡和薪水,年齡的值基本在30-50浮動,而薪水在50000-80000之間浮動。機器學習中有個術語叫做歐式距離,所謂歐式距離可以看作是平面中兩個點之間的距離,顯然是兩者橫縱座標差的平方和相加後開方。那麼問題來了,如果這裡的薪水和年齡分別為橫縱座標,那麼薪水的座標差的平方相對於年齡的來說差距非常大,那麼年齡對這個結果的影響會變得很小。因此,我們需要將年齡和薪水縮放到同乙個數量級上面,有些演算法可能沒用到歐式距離,但進行特徵縮放後,演算法的收斂速度會變快很多(比如決策樹)。

接下來看看如何對資料進行特徵縮放,以下有兩種演算法:standardisation和normalisation。

其中標準化中,mean(x)表示x的平均值,standarddeviation表示標準方差,即衡量一列資料中浮動性大概有多少。那麼這裡得到的$x_$ 表示的就是平均值為0,方差為1的分布。

在python中的**如下所示:

#feature scaling

sc_x = standardscaler()

x_train = sc_x.fit_transform(x_train)

x_test = sc_x.transform(x_test)

記得上面的分類資料中,對第一列和最後一列都進行了虛擬編碼,這些虛擬變數是否需要進行特徵縮放呢,這個需要針對不同的場景進行分析,這裡的變數值只有0和1,看起來已經進行了特徵縮放,因此可以不做特徵縮放,但進行特徵縮放後可能會對演算法的效能有所提公升,這裡就都進行特徵縮放。對自變數進行特徵縮放後,在看看因變數,這裡的因變數代表的是不同的類別,那麼這裡就不需要了,若是回歸問題,那麼因變數就可能需要進行特徵縮放。

以上就是資料預處理中的各個步驟,針對實際情況,不是所有的步驟都一定需要做。針對不同的場景選擇需要的步驟即可。

機器學習 資料預處理

均值為0,標準差為1 from sklearn import preprocessing scaler preprocessing.standardscaler scaler.fit transform x 對原始資料進行線性變換,變換到 0,1 區間 也可以是其他固定最小最大值的區間 from s...

機器學習 資料預處理

1 連續資料特徵離散化的方法 由於lr 中模型表達能力有限,可以通過特徵離散化來提高非線性學習能力。主要方法 1 等距離散 取值範圍均勻劃分成n 等分,每份的間距相等。2 等頻離散 均勻分為n 等分,每份內包含的觀察點數相同 3 優化離散 3 1 卡方檢驗方法 統計樣本的實際觀測值與理論判斷值之間的...

機器學習python資料預處理

from pandas import read csv from sklearn.preprocessing import standardscaler from numpy import set printoptions from sklearn.preprocessing import minm...