數據預處理是機器學習中很基本也是很重要的一步,數據處理是否得當對訓練和預測結果影響很是大。機器學習
在工程實踐中,咱們獲得的數據會存在有缺失值、重複值等,在使用以前須要進行數據預處理。數據預處理沒有標準的流程,一般針對不一樣的任務和數據集屬性的不一樣而不一樣。數據預處理的經常使用流程爲:處理缺失值、屬性編碼、數據標準化正則化、特徵選擇、主成分分析。學習
首先,咱們開始進行缺失值的處理,通常在讀取數據某些特徵時會有缺失值,若是缺失值過多基本上能夠直接去除掉這一列,在缺失值很少的狀況下咱們能夠用一些方法處理,好比插入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