機器學習一:資料預處理
阿新 • • 發佈:2018-11-08
最近一直在學習機器學習的知識,入門很難。之前跟著吳恩達老師的視訊在學習,發現還是有很多的知識點難以理解。前不久,《機器學習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的組合,既包含訓練又包含轉換。
注意:
- 必須先用fit_transform(trainData),之後再用transform(testData);
- 如果直接使用transform(testData)會報錯;
- 如果fit_transform(trainData)後,使用fit_transform(testData)而不是transform(testData),雖然也能歸一化,但是兩個結果是不在同一個“標準”下的,具有明顯的差異。