機(jī)器學(xué)習(xí)入坑指南(二):數(shù)據(jù)預(yù)處理

機(jī)器學(xué)習(xí)初步:數(shù)據(jù)預(yù)處理

機(jī)器學(xué)習(xí)離不開大量的數(shù)據(jù)。在對(duì)這些數(shù)據(jù)進(jìn)行分析前,我們先學(xué)習(xí)一下在 Python 中如何導(dǎo)入數(shù)據(jù)并對(duì)它進(jìn)行預(yù)處理。

1 導(dǎo)入需要的庫(kù)

利用 Python 進(jìn)行數(shù)據(jù)分析所必須的庫(kù)有兩個(gè)。

NumPy 包含了各種數(shù)學(xué)計(jì)算函數(shù)。

Pandas 用于導(dǎo)入和管理數(shù)據(jù)集。

通常我們使用以下形式導(dǎo)入這兩個(gè)庫(kù):

import numpy as np
import pandas as pd

2 導(dǎo)入數(shù)據(jù)集

數(shù)據(jù)集通常是 .csv 格式。CSV 以純文本形式保存表格數(shù)據(jù),文件的每一行是一條數(shù)據(jù)記錄。我們使用 Pandas 的 read_csv 方法讀取本地 .csv 文件作為一個(gè)數(shù)據(jù)幀(dataframe),然后從數(shù)據(jù)幀中制作自變量和因變量的矩陣和向量。

示例數(shù)據(jù)地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets

可將數(shù)據(jù)下載到本地,放在 Jupyter Notebook 工作目錄下,或通過 upload 導(dǎo)入。

dataset = pd.read_csv(Data.csv)
# X 獲取所有行從第0列到倒數(shù)第1列的數(shù)據(jù)(從0起算)
X = dataset.iloc[ : ,:-1].values
# Y 獲取所有行第3列的數(shù)據(jù)
Y = dataset.iloc[ : , 3].values

iloc 的作用是通過行列號(hào)來獲取數(shù)據(jù),而 loc 則是通過標(biāo)簽索引數(shù)據(jù)。

導(dǎo)入后,dataset 的數(shù)據(jù)如下

image

3 處理丟失數(shù)據(jù)

我們得到的數(shù)據(jù)可能由于各種原因存在缺失。為了不降低機(jī)器學(xué)習(xí)模型的性能,我們可以通過一些方法處理這些數(shù)據(jù),比如使用整列數(shù)據(jù)的平均值或中位數(shù)來替換丟失的數(shù)據(jù)。

可以使用 sklearn.preprocessing 庫(kù)中的 Imputer 類來完成這項(xiàng)任務(wù)。

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
# 訓(xùn)練模型,擬合出作為替換值的均值
imputer = imputer.fit(X[ : , 1:3])
# 處理需要補(bǔ)全的數(shù)據(jù)
X[ : , 1:3] = imputer.transform(X[ : , 1:3])

Imputer 參數(shù)解釋:

missing_values:缺失值,可以為整數(shù)或 NaN ,默認(rèn)為 NaN

strategy:替換策略,默認(rèn)用均值 'mean' 替換,還可以選擇中位數(shù) 'median' 或眾數(shù) 'most_frequent'

axis:指定軸數(shù),默認(rèn) axis = 0 代表列,axis = 1 代表行

4 解析分類數(shù)據(jù)

分類數(shù)據(jù)是具有標(biāo)簽值而不是數(shù)值的變量,取值范圍通常固定(類似枚舉值),不能用于模型的數(shù)學(xué)計(jì)算,需要解析成數(shù)字。為實(shí)現(xiàn)這個(gè)功能,我們從 sklearn.preprocessing 庫(kù)中導(dǎo)入 LabelEnconder 類。

經(jīng)過編碼之后的變量稱為虛擬變量啞變量(Dummy Variable)

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
# 對(duì) X 中的標(biāo)簽數(shù)據(jù)編碼
X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
# 使用 onehotencoder 對(duì)經(jīng)過標(biāo)簽編碼的第0行數(shù)據(jù)進(jìn)行獨(dú)熱編碼
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
# 對(duì) Y 中的標(biāo)簽數(shù)據(jù)編碼
labelencoder_Y = LabelEncoder()
Y =  labelencoder_Y.fit_transform(Y)

關(guān)于獨(dú)熱編碼,參考博客園 - OneHotEncoder獨(dú)熱編碼和 LabelEncoder標(biāo)簽編碼

5 分割數(shù)據(jù)集

我們需要把數(shù)據(jù)集拆分成用來訓(xùn)練模型的訓(xùn)練集和用來驗(yàn)證模型的測(cè)試集。兩者的比例一般是 80:20。這里需要導(dǎo)入 sklearn.crossvalidation 庫(kù)中的 train_test_split()方法。

from sklearn.cross_validation import train_test_split
# 分割數(shù)據(jù)集
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)

6 特征縮放

許多機(jī)器學(xué)習(xí)算法在計(jì)算中使用數(shù)據(jù)點(diǎn)之間的歐氏距離,數(shù)據(jù)的某一特征值的量級(jí)在很大程度上決定了距離的大小。(特征縮放作用的體現(xiàn)參見 lwbeyond 的文章—— K-近鄰算法 )

因此,應(yīng)該把每個(gè)特征的取值限定在某一范圍內(nèi),稱為特征縮放。常用的方法有調(diào)節(jié)比例、標(biāo)準(zhǔn)化等。這里我們導(dǎo)入 sklearn.preprocessing 庫(kù)的 StandardScalar 類。

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)

歡迎關(guān)注 Evan 的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容