1. 程式人生 > >機器學習之 資料預處理 preprocessing

機器學習之 資料預處理 preprocessing

前言

對於資料的預處理,沒有固定的步驟。 
下文寫的僅僅的常規的一些小步驟。 
具體的預處理,還需要根據資料以及需求來自行處理。

====================================

Python

STEP1、匯入依賴包

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
  • 1
  • 2
  • 3

把np作為numpy的縮寫,後面可以直接使用np來呼叫各種方法。

==> 
numpy系統是python的一種開源的數值計算擴充套件。 
這種工具可用來儲存和處理大型矩陣,比python自身的巢狀列表結構要高效的多。 
你可以理解為凡是和矩陣有關的都用numpy

這個庫。

==> 
matplotlib.pyplot是用來做資料的展示。也就是資料的視覺化。

==> 
pandas該工具是為了解決資料分析任務而建立的。pandas 納入了大量庫和一些標準的資料模型,提供了高效地操作大型資料集所需的工具。 
pandas提供了大量能使我們快速便捷地處理資料的函式和方法。它是使python成為強大而高效的資料分析環境的重要因素之一。

======== 
選擇好這三行程式碼,敲下shift+return組合鍵。

如果結果如下,說明庫已經匯入了。 
我們的環境配置也完全沒有問題。

STEP2、讀取資料

Spyder中,設定好檔案路徑。千萬不要忘了。

輸入下面的程式碼。然後選擇這行程式碼,敲下shift+return組合鍵。

#import dataset
dataset = pd.read_csv('Data.csv')
  • 1
  • 2

我們在explorer中會看到我們命名的dataset

dataset

雙擊開啟

根據上面的dataset的那個圖我們可以看出,我們的目的是想要通過地區,年齡,薪資來看購買力。

那我們把country,age,salary作為X,purchased作為Y。 
得到二者之間的關係,就得到了country,age,salary和purchased之間的某種關係。

#取出所有的行,(去掉最後一列 purchased)
X = dataset.iloc[:,:-1].values

取出結果
Y = dataset.iloc
[:,3].values
  • 1
  • 2
  • 3
  • 4
  • 5

執行結果如下:

然後我們雙擊開啟X,會發現打不開。這個是因為資料型別的原因。

我們可以在程式碼中輸入X,然後選中執行。

STEP3、遺失資料的處理

我們回過頭在看上面的dataset的圖。 
我們會發現資料缺少幾個。他用了nan來標記缺失的資料。

注意: 
對於缺失的資料,我們大體上有3中處理方法: 
1、通過資料中的最大值和最小值,我們把中間值賦值給缺失的資料; 
2、通過所有資料的平均值來賦值給缺失的資料; 
3、刪除有空缺資料項;

擇優排隊的結果是:1 > 3 、 2 > 3 
因為在大部分的時候,我們的資料會非常稀少。每一個數據都來之不易。我們不能輕易的刪掉。

============

匯入庫。這個庫就是專門做資料預處理的。

#預處理impoter
from sklearn.preprocessing import Imputer

#做遺失的部分的處理 用NaN的方式填補上來
#axis:傳0或者。0代表處理列 ,1代表處理行。
#strategy的值有mean,median,most_frequent ,分別代表:平均數 中間值 最常出現的數值
imputer = Imputer(missing_values = 'NaN',strategy = 'mean', axis = 0)

#1-3行缺失的部分補上
imputer = imputer.fit(X[:,1:3])

#返回處理好的資料
X[:,1:3] = imputer.transform(X [:,1:3])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

對於這個方法,我們不熟悉可以通過Help來檢視。不過前提是 
from sklearn.preprocessing import Imputer這行程式碼執行過。

然後我們執行下,會發現缺失的資料已經被我們填充好了。

STEP4、資料明確化

資料明確就是為了提高執行的速度和準確性。 
當然我們不進行資料明確也可以…為了更好,還是加上這步吧。

我們看country 和 purchased ,如果都變成用數字表示。那我們執行的效率就提升上去了。

熱編碼的優點: 
1.能夠處理非連續型數值特徵。 
2.在一定程度上也擴充了特徵。

#資料明確
#提高執行的速度和準確性
#把資料明確化,變成數字
#OneHotEncoder 熱編碼
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

#把城市資料進行數字明確化
labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

#熱編碼,拿出來做陣列的編排
onehotencoder = OneHotEncoder()
X = onehotencoder.fit_transform(X).toarray()

#把結果資料進行城市化
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

執行,然後我們看下結果:

STEP5、資料分割

資料分割。是把資料分為兩組。一組A用來訓練,一組B是用來測試。 
然後通過測試資料的Y,用訓練組的模型得到的Y值進行比較。

就是比較B.Y 和 ResultA (B.X) 的值是否一樣,如果一樣或者差別不大,那麼我們做出來的模型就是可靠的。

#資料分割
from sklearn.cross_validation import train_test_split

#0 取一次就好了,不要每次都取兩組隨機的數字
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size = 0.2,random_state = 0)
  • 1
  • 2
  • 3
  • 4
  • 5

我們就可以看到分割好的兩組資料。 
X_train、Y_train 
X_test 、Y_test

STEP6、資料縮放

資料縮放把這些資料,規範在一個範圍中。 
如果不這麼做的話,比如 0 ,0.001, 0.2, 99… 這類資料非常不易看。

from sklearn.preprocessing import StandardScaler

#縮放
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)
Y_train = sc_X.fit_transform(Y_train)
Y_test = sc_X.fit_transform(Y_test)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我們開啟X_train,然後format調成小數一位。結果如下。

以上就是資料預處理的幾步了。

END 完整程式碼

#資料預處理 data preprocessing

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#import dataset
dataset = pd.read_csv('Data.csv')

#Matrix of feature
X = dataset.iloc[:,:-1].values
Y = dataset.iloc[:,3].values

#預處理impoter
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])

#資料明確
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

onehotencoder = OneHotEncoder()
X = onehotencoder.fit_transform(X).toarray()

labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)

#資料分割
from sklearn.cross_validation import train_test_split

#0 取一次就好了,不要每次都取兩組隨機的數字
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size = 0.2,random_state = 0)

#縮放X
from sklearn.preprocessing import StandardScaler

sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)
Y_train = sc_X.fit_transform(Y_train)
Y_test = sc_X.fit_transform(Y_test)