數(shù)據(jù)預(yù)處理
前言:
- What's This:我自己的學(xué)習(xí)筆記,如果你不想看GitHub们衙,這里搬運的應(yīng)該也很全面钾怔。
- 為什么要學(xué)機器學(xué)習(xí):很厲害,應(yīng)用廣蒙挑,缺口大蒂教,解放人力,提升自己
- 課程來源:YouTube上的大咖Siraj Raval就發(fā)起了一個挑戰(zhàn):#100DaysOfMLCode脆荷。
- GitHUb地址:中文版本點這里 —— Here For English Edition
- 學(xué)習(xí)計劃: 不強求每天都來凝垛,佛性隨性,每天課程量不大蜓谋,所以我把100天改成了100小時梦皮,所以只要堅持同等與兩周工作量的時間里,就能完成本課程桃焕。學(xué)到就是收獲剑肯。
- 基礎(chǔ)要求: Python的使用
Start
Step 0: 環(huán)境
Mine——Windows10x64, Python2.7观堂, Hyper(推薦让网,比原生的命令窗口好看一點。在人工智能飛速發(fā)展的當(dāng)下师痕,培養(yǎng)藝術(shù)審美能力是贏得未來的重要技能)
Step 1: 導(dǎo)入必要的庫
NumPy——用于實現(xiàn)大量的數(shù)學(xué)計算
Pandas——用于操作數(shù)據(jù)集
So easy溃睹, 直接Python pip安裝。
pip install Numpy
pip install Pandas
后邊數(shù)據(jù)預(yù)處理還會用到 sklearn庫
pip install sklearn
然后sklearn又依賴scipy
pip install scipy
還有一個必備的
pip install matplotlib
整理如下胰坟,可以直接復(fù)制粘貼進(jìn)行安裝相關(guān)依賴庫
pip install Numpy Pandas scipy sklearn matplotlib
裝這個可能要15分鐘左右因篇,可以去上個廁所,彈彈吉他笔横,打會兒太極拳竞滓,或者找女朋友聊會兒天。下邊的內(nèi)容等裝好了邊看邊動手做吹缔。
Step 2: 導(dǎo)入數(shù)據(jù)集
Data sets一般以.csv格式存儲商佑,內(nèi)容為純文本樣式的表格,每行代表了一條數(shù)據(jù)record.這里使用 pandas的 read_csv
方法讀取本地的csv文件作為數(shù)據(jù)幀厢塘, 然后從數(shù)據(jù)幀中制作自變量和因變量的矩陣(Matrix)和向量(Vector)茶没。
Data sets右鍵另存為下載
import numpy as np
import pandas as pd
data = r'your/path/to/store/Data.csv'
dataset = pd.read_csv(data)
看一眼dataset是啥樣子
dataset
Country Age Salary Purchased
0 France 44.0 72000.0 No
1 Spain 27.0 48000.0 Yes
2 Germany 30.0 54000.0 No
3 Spain 38.0 61000.0 No
4 Germany 40.0 NaN Yes
5 France 35.0 58000.0 Yes
6 Spain NaN 52000.0 No
7 France 48.0 79000.0 Yes
8 Germany 50.0 83000.0 No
9 France 37.0 67000.0 Yes
繼續(xù)操作
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 3].values
這里可以理解為類似Python序列的分片操作,得到自己想要的數(shù)據(jù)組合
看一下我們的X俗冻,Y:
>>> X
array([['France', 44.0, 72000.0],
['Spain', 27.0, 48000.0],
['Germany', 30.0, 54000.0],
['Spain', 38.0, 61000.0],
['Germany', 40.0, nan],
['France', 35.0, 58000.0],
['Spain', nan, 52000.0],
['France', 48.0, 79000.0],
['Germany', 50.0, 83000.0],
['France', 37.0, 67000.0]], dtype=object)
>>> Y
array(['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'],
dtype=object)
Step 3: 處理丟失的數(shù)據(jù)
對于數(shù)據(jù)的完整性來說礁叔,我國偉大的文學(xué)家蘇軾早就有了“此事古難全”的重要論斷。因此為了不影響機器學(xué)習(xí)模型的性能迄薄,我們用同類數(shù)據(jù)的均值或中間值來替代琅关。此處用到sklearn.preprocessing
庫中的Impputer
類來完成相關(guān)操作。
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])
簡單解釋一下代碼,導(dǎo)入就不用說了涣易,
第一句是初始化了一個imputer類画机,傳入的參數(shù)分別為missing_values,設(shè)置為NaN新症,替換策略strategy為mean步氏,即用均值替代丟失值,axis設(shè)置為0徒爹。
第二句用新建的imputer類來fit一下X荚醒。
第三句完成缺失數(shù)據(jù)的替代。
Step2得到的X變成了如下內(nèi)容:
>>> X
array([['France', 44.0, 72000.0],
['Spain', 27.0, 48000.0],
['Germany', 30.0, 54000.0],
['Spain', 38.0, 61000.0],
['Germany', 40.0, 63777.77777777778],
['France', 35.0, 58000.0],
['Spain', 38.77777777777778, 52000.0],
['France', 48.0, 79000.0],
['Germany', 50.0, 83000.0],
['France', 37.0, 67000.0]], dtype=object)
Step 4: 編碼分類數(shù)據(jù)
分類數(shù)據(jù)(Categorical Data)指的是非數(shù)字類型的變量隆嗅,通常以標(biāo)簽值的形式出現(xiàn)界阁,例如本例中的‘Yes’和‘No’,對于模型的數(shù)學(xué)計算胖喳,需要把它們編碼成數(shù)字泡躯。這里用到的是sklearn.preprocessing
庫中的LabelEncoder
類。
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
##Creating a dummy variable
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
經(jīng)過轉(zhuǎn)化丽焊,X和Y的變化如下:
>>> X
array([[0L, 44.0, 72000.0],
[2L, 27.0, 48000.0],
[1L, 30.0, 54000.0],
[2L, 38.0, 61000.0],
[1L, 40.0, 63777.77777777778],
[0L, 35.0, 58000.0],
[2L, 38.77777777777778, 52000.0],
[0L, 48.0, 79000.0],
[1L, 50.0, 83000.0],
[0L, 37.0, 67000.0]], dtype=object)
>>> X
array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.40000000e+01, 7.20000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 2.70000000e+01, 4.80000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 3.00000000e+01, 5.40000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.80000000e+01, 6.10000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.00000000e+01, 6.37777778e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.50000000e+01, 5.80000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.87777778e+01, 5.20000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.80000000e+01, 7.90000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 5.00000000e+01, 8.30000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.70000000e+01, 6.70000000e+04]])
>>> Y
array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1], dtype=int64)
Step 5: 將數(shù)據(jù)集分為測試集和訓(xùn)練集
我們通常把數(shù)據(jù)集按照“二八原則”分為訓(xùn)練集(training set)和測試集(test set)较剃,前者用于訓(xùn)練模型,占80%技健;后者用于測試驗證模型写穴,占20%。這里用sklearn.crossvalidation
庫中的train_test_split()
方法凫乖。
from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
Step 6: 特征縮放
大部分模型算法計算兩個數(shù)據(jù)點的歐式距離确垫,導(dǎo)致的問題就是幅度變化不好控制弓颈,高幅度的特征比低幅度的特征權(quán)重更大帽芽。解決這個問題的方法是特征標(biāo)準(zhǔn)化或Z值歸一化。這里用sklearn.preprocessing
庫的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)
總結(jié)
To Be Honest导街, 第一天主要就是個入門和環(huán)境搭建的上手,用Python作為工具纤子,簡述了進(jìn)行機器學(xué)習(xí)的前6個步驟搬瑰,并用相應(yīng)的庫簡單輕松的完成了操作,不要覺得無聊控硼,繼續(xù)下去泽论,會有新收獲!