機器學習-數據預處理

數據預處理是機器學習中很基本也是很重要的一步,數據處理是否得當對訓練和預測結果影響很是大。機器學習

在工程實踐中,咱們獲得的數據會存在有缺失值、重複值等,在使用以前須要進行數據預處理。數據預處理沒有標準的流程,一般針對不一樣的任務和數據集屬性的不一樣而不一樣。數據預處理的經常使用流程爲:處理缺失值、屬性編碼、數據標準化正則化、特徵選擇、主成分分析。學習

首先,咱們開始進行缺失值的處理,通常在讀取數據某些特徵時會有缺失值,若是缺失值過多基本上能夠直接去除掉這一列,在缺失值很少的狀況下咱們能夠用一些方法處理,好比插入0、平均值、中位數值等等,根據實際狀況而定。測試

# 第一天數據預處理
from sklearn.preprocessing import Imputer,minmax_scale,LabelEncoder,OneHotEncoder
import pandas as pd

# 數據讀取
data = pd.read_csv('1day/dataSource/Data.csv', header=0)
print(data)

# 缺失值處理
#方法一
# imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)
# imputer = imputer.fit(data.iloc[:,1:3])
# data.iloc[:,1:3] = imputer.transform(data.iloc[:,1:3])
# print(data)
#方法二
data['Age'].fillna(data['Age'].mean(), inplace=True)
data['Salary'].fillna(data['Salary'].mean(), inplace=True)
print(data)
   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
   Country        Age        Salary Purchased
0   France  44.000000  72000.000000        No
1    Spain  27.000000  48000.000000       Yes
2  Germany  30.000000  54000.000000        No
3    Spain  38.000000  61000.000000        No
4  Germany  40.000000  63777.777778       Yes
5   France  35.000000  58000.000000       Yes
6    Spain  38.777778  52000.000000        No
7   France  48.000000  79000.000000       Yes
8  Germany  50.000000  83000.000000        No
9   France  37.000000  67000.000000       Yes

這裏列出了兩種插入缺失值的方法,都是用的插入特徵列的均值,還能夠插入中位數、最大值、最小值等等均可以。編碼

如今咱們發現Country這列和Purchased不是數字類型不能直接用於訓練計算,這裏要進行處理成可以訓練的格式,爲實現這一功能,咱們從sklearn.preprocessing庫導入LabelEncoder類。spa

# 解析分類數據
labelEncoder = LabelEncoder()
data['Purchased'] = labelEncoder.fit_transform(data['Purchased'])
print(data)
Country        Age        Salary  Purchased
0   France  44.000000  72000.000000          0
1    Spain  27.000000  48000.000000          1
2  Germany  30.000000  54000.000000          0
3    Spain  38.000000  61000.000000          0
4  Germany  40.000000  63777.777778          1
5   France  35.000000  58000.000000          1
6    Spain  38.777778  52000.000000          0
7   France  48.000000  79000.000000          1
8  Germany  50.000000  83000.000000          0
9   France  37.000000  67000.000000          1

如今Purchased已經ok了,接下來再把Country列的每一個值當作一個特徵列,用0,1表示是不是該值,咱們用pandas中的get_dummies方法,該方法會把非數字的枚舉列變成進行one-hot編碼,結果以下code

# 解析分類數據
labelEncoder = LabelEncoder()
data['Purchased'] = labelEncoder.fit_transform(data['Purchased'])
data = pd.get_dummies(data)
print(data)
Age        Salary  Purchased  Country_France  Country_Germany  Country_Spain
0  44.000000  72000.000000          0               1                0              0
1  27.000000  48000.000000          1               0                0              1
2  30.000000  54000.000000          0               0                1              0
3  38.000000  61000.000000          0               0                0              1
4  40.000000  63777.777778          1               0                1              0
5  35.000000  58000.000000          1               1                0              0
6  38.777778  52000.000000          0               0                0              1
7  48.000000  79000.000000          1               1                0              0
8  50.000000  83000.000000          0               0                1              0
9  37.000000  67000.000000          1               1                0              0

到這裏就已經具有了訓練數據的格式了,能夠直接把數據和標籤列放入訓練模型裏,可是在這裏還要繼續進行處理。orm

咱們發現Age和Salary列的數字數量級差距很大,並且這兩列的單位其實也是不同的,對於數量級大的訓練獲得的參數權重會更大,這樣會致使訓練的結果僅僅與數量級越大的特徵越密切,並且在訓練過程當中收斂的速度會比較慢,由於梯度降低可能會走很多彎路。blog

因此在這裏咱們要進行數據的歸一化處理,讓每一個特徵列的數據範圍基本一致。get

這裏咱們用到minmax_scale固然還有其它的歸一化的方法,好比scale,standardscale,上代碼pandas

# 歸一化處理
data_y = data['Purchased']
data_x = data.drop(['Purchased'], axis=1)
data_x = minmax_scale(data_x)
print(data_x)
[[0.73913043 0.68571429 1.         0.         0.        ]
 [0.         0.         0.         0.         1.        ]
 [0.13043478 0.17142857 0.         1.         0.        ]
 [0.47826087 0.37142857 0.         0.         1.        ]
 [0.56521739 0.45079365 0.         1.         0.        ]
 [0.34782609 0.28571429 1.         0.         0.        ]
 [0.51207729 0.11428571 0.         0.         1.        ]
 [0.91304348 0.88571429 1.         0.         0.        ]
 [1.         1.         0.         1.         0.        ]
 [0.43478261 0.54285714 1.         0.         0.        ]]

這個數據就比較標準了,最後在訓練前的一步就是給數據拆分紅訓練集和測試集了,咱們仍是用sklearn裏面的方法train_test_split

from sklearn.model_selection import train_test_split
#...
#中途省略上面有代碼
#...
# 拆分數據
train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.3)
print(train_x)
print(train_y)
print(test_x)
print(test_y)
[[0.56521739 0.45079365 0.         1.         0.        ]
 [0.73913043 0.68571429 1.         0.         0.        ]
 [0.51207729 0.11428571 0.         0.         1.        ]
 [1.         1.         0.         1.         0.        ]
 [0.34782609 0.28571429 1.         0.         0.        ]
 [0.43478261 0.54285714 1.         0.         0.        ]
 [0.13043478 0.17142857 0.         1.         0.        ]]
4    1
0    0
6    0
8    0
5    1
9    1
2    0
Name: Purchased, dtype: int64
[[0.91304348 0.88571429 1.         0.         0.        ]
 [0.47826087 0.37142857 0.         0.         1.        ]
 [0.         0.         0.         0.         1.        ]]
7    1
3    0
1    1
Name: Purchased, dtype: int64
相關文章
相關標籤/搜索