機器學習一:資料預處理

Cassie1492949236626發表於2019-02-27

最近一直在學習機器學習的知識,入門很難。之前跟著吳恩達老師的視訊在學習,發現還是有很多的知識點難以理解。前不久,《機器學習A-Z》出了中文翻譯,老師講的非常淺顯易懂,所以開始跟著學起來了。

為了能更系統的整理到學的知識進行一個整理,也作為一個自我監督,接下來就把較為系統的知識點都整理到部落格上。相應的程式碼也會同步到github上。

下面所有的程式碼都是使用Python寫的,資料預處理主要用到的是sklearn.preprocessing模組 [sklearn.apachecn.org/cn/0.19.0/m…]

目錄

機器學習一:資料預處理

在機器學習一的這部分,我主要說一下資料的預處理。

1.匯入標準庫

  • numpy:包含很多機器學習需要用到的數學方法
  • matplotlib.pyplot:主要用於繪圖
  • pandas:匯入資料集以及對資料集進行一系列的處理
import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd
複製程式碼

2.匯入資料集

iloc陣列中引數:逗號左邊表示行數,逗號右邊表示列數,冒號表示選擇所有行或者列

# Import the dataset
dataset = pd.read_csv(`Data.csv`)
X = dataset.iloc[:,:-1].values
y = dataset.iloc[:,3].values
複製程式碼

3.缺失資料

機器學習一:資料預處理

一般處理資料缺失的方法包括平均數填充、中位數填充,眾數填充。在Imputer類中的strategy的可選引數中可以進行選擇。

Imputer這個類主要用於缺失資料的處理
引數axis:

  • axis = 0 取一列的平均值
  • axis = 1 取一行的平均值

引數strategy:
strategy : string, optional (default=”mean”)
The imputation strategy.

  • If “mean”, then replace missing values using the mean along the axis.
  • If “median”, then replace missing values using the median along the axis.
  • If “most_frequent”, then replace missing using the most frequent value along the axis.
# Taking care of missing data
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values="NaN",strategy="mean",axis=0)
imputer.fit(X[:,1:3])  #代表1和2
X[:,1:3] = imputer.transform(X[:,1:3])
複製程式碼

4.分類資料

4.1. 標籤編碼

作用:將文字轉換為數字

機器學習一:資料預處理
機器學習一:資料預處理

缺點:在開始的時候不同的國籍並沒有數值的區分,將不同的國家轉換為數值之後0,1,2之後,對於不同的類就有大小之分,所以對不同的類進行了排序。

解決方案:獨熱編碼(虛擬編碼)

4.2. 獨熱編碼(虛擬編碼)(dummy coding)

機器學習一:資料預處理
# Encoding categorical data
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()

labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

# Encode labels with value between 0 and n_classes-1(將不同組的名稱轉換為數字)
複製程式碼

5.將資料集劃分為訓練集和測試集

  • test_size:0到1之間,預設值為0.25 一般情況下比較好的為0.2或者0.25
  • random_state:決定隨機數生成的方式
# splitting dataset into Training set and Test set
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state=0)
複製程式碼

6.特徵縮放

為什麼要對資料進行特徵縮放?

歐氏距離(兩個點之間線段的長度),在很多機器學習的演算法中非常重要。

將不同數量級的資料縮放到同一個數量級,如果不進行特徵縮放,年齡在工資的比較下影響就會變得非常小。

為了解決這個問題,我們需要將Age和Salary縮放到同一個數量級裡面。

機器學習一:資料預處理

6.1. 標準化(Standardisation)

得到的新的資料平均值為0,並且方差為1
運用在支援向量機、邏輯迴歸、類神經網路

機器學習一:資料預處理
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
複製程式碼

6.2. 歸一化(Normalisation)

將所有的值投射到0和1之間

機器學習一:資料預處理
機器學習一:資料預處理
import sklearn.preprocessing as sp
mms = sp.MinMaxScaler(feature_range=(0,1))
mms_samples2 = mms.fit_transform(raw_samples)
複製程式碼

7.資料預先處理模板

import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd

# Import the dataset
dataset = pd.read_csv(`Data.csv`)
X = dataset.iloc[:,:-1].values
y = dataset.iloc[:,3].values

# Taking care of missing data
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values="NaN",strategy="mean",axis=0)
imputer = Imputer()
test = imputer.fit(X[:,1:3])
X[:,1:3] = imputer.transform(X[:,1:3])

# Encoding categorical data
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()
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state=0)

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
複製程式碼

8.問題

8.1. fit、fit_transform、transform之間的區別?

  • fit():簡單來說,就是求得訓練集的均值、方差、最大值、最小值,也就是訓練集X的屬性,可以理解為一個訓練過程;
  • Transform():在fit的基礎上,進行標準化、降維、歸一化等操作;
  • fit_transform():是fit和transform的組合,既包含訓練又包含轉換。

注意:

  1. 必須先用fit_transform(trainData),之後再用transform(testData);
  2. 如果直接使用transform(testData)會報錯;
  3. 如果fit_transform(trainData)後,使用fit_transform(testData)而不是transform(testData),雖然也能歸一化,但是兩個結果是不在同一個“標準”下的,具有明顯的差異。

8.2. 標準化和歸一化的區別以及各自作用的場景?

www.jianshu.com/p/95a8f035c…

相關文章