機器學習A-Z~數據預處理

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

  1. 導入數據集
  2. 處理缺失數據
  3. 分類數據
  4. 數據分成訓練集和測試集
  5. 特徵縮放

導入數據集

我們當前有一組數據集如下:

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_{stand}$ 表示的就是平均值爲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,看起來已經進行了特徵縮放,因此可以不做特徵縮放,但進行特徵縮放後可能會對算法的性能有所提升,這裏就都進行特徵縮放。對自變量進行特徵縮放後,在看看因變量,這裏的因變量代表的是不同的類別,那麼這裏就不需要了,若是迴歸問題,那麼因變量就可能需要進行特徵縮放。

總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章