1. 程式人生 > >sklearn 中的preprocessing資料預處理

sklearn 中的preprocessing資料預處理

1. sklearn preprocessing

Standardization即標準化,儘量將資料轉化為均值為零,方差為一的資料,形如標準正態分佈(高斯分佈)。實際中我們會忽略資料的分佈情況,僅僅是通過改變均值來集中資料,然後將非連續特徵除以他們的標準差。

1.1 標準化:去均值,方差規模化

Standardization標準化:將特徵資料的分佈調整成標準正太分佈,也叫高斯分佈,也就是使得資料的均值為0,方差為1.
標準化的原因在於如果有些特徵的方差過大,則會主導目標函式從而使引數估計器無法正確地去學習其他特徵。
標準化的過程為兩步:去均值的中心化(均值變為0);方差的規模化(方差變為1)。

(1) 在sklearn.preprocessing中提供了一個scale的方法

In [149]: from sklearn import preprocessing

In [150]: import numpy as np

In [151]: X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])

In [152]: X_scaled = preprocessing.scale(X)

In [153]: X_scaled 
Out[153]: 
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124
], [-1.22474487, 1.22474487, -1.06904497]]) #scaled之後的資料零均值,單位方差 In [154]: X_scaled.mean(axis=0) Out[154]: array([0., 0., 0.]) # # axis=1表示對每一行去做這個操作,axis=0表示對每一列做相同的這個操作 In [155]: X_scaled.std(axis=0) Out[155]: array([1., 1., 1.])

(2) StandardScaler計算訓練集的平均值和標準差,以便測試資料集使用相同的變換

preprocessing這個模組還提供了一個實用類StandarScaler,它可以在訓練資料集上做了標準轉換操作之後,把相同的轉換應用到測試訓練集中。
這樣就可以對訓練資料,測試資料應用相同的轉換,以後有新的資料進來也可以直接呼叫,不用再重新把資料放在一起再計算一次了。

>>> from sklearn.preprocessing import StandardScaler
>>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]
>>> scaler = StandardScaler()
>>> print(scaler.fit(data))  # 呼叫fit方法,根據已有的訓練資料建立一個標準化的轉換器
StandardScaler(copy=True, with_mean=True, with_std=True)
>>> print(scaler.mean_)
[0.5 0.5]
>>> print(scaler.transform(data))  # 使用上面這個轉換器去轉換資料data,呼叫transform方法
[[-1. -1.]
 [-1. -1.]
 [ 1.  1.]
 [ 1.  1.]]
>>> print(scaler.transform([[2, 2]])) # 對於新來的一組樣本,也想得到相同的轉換
[[3. 3.]]

注 :
1)StandardScaler()中可以傳入兩個引數:with_mean,with_std.這兩個都是布林型的引數,預設情況下都是true,但也可以自定義成false.即不要均值中心化或者不要方差規模化為1.
2)scale和StandardScaler可以用於迴歸模型中的目標值處理。

(3) 將資料特徵縮放至某一範圍(from sklearn.preprocessing import MinMaxScaler)

也就是使得特徵的分佈是在一個給定最小值和最大值的範圍內的。一般情況下是在[0,1]之間,或者是特徵中絕對值最大的那個數為1,其他數以此維標準分佈在[[-1,1]之間
以上兩者分別可以通過MinMaxScaler 或者 MaxAbsScaler方法來實現。
之所以需要將特徵規模化到一定的[0,1]範圍內,是為了對付那些標準差相當小的特徵並且保留下稀疏資料中的0值。

MinMaxScaler(最小最大值標準化)

X_std=(XX.min(axis=0))(X.max(axis=0)X.min(axis=0))X\_std = \frac{ (X - X.min(axis=0))}{(X.max(axis=0) - X.min(axis=0))}
X_scaler=Xstd(maxmin)+minX\_scaler =\frac {X_std} {(max - min)} + min

In [159]: from sklearn import preprocessing

# 將資料縮放至[0, 1]間。訓練過程: fit_transform()
In [160]: X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])

In [161]: min_max_scaler = preprocessing.MinMaxScaler()

In [162]: X_train_minmax = min_max_scaler.fit_transform(X_train)

In [163]: X_train_minmax
Out[163]: 
array([[0.5       , 0.        , 1.        ],
       [1.        , 0.5       , 0.33333333],
       [0.        , 1.        , 0.        ]])

# 將上述得到的scale引數應用至測試資料
In [164]: X_test= np.array([[ -3., -1., 4.]])

In [165]: X_test_minmax = min_max_scaler.transform(X_test)

In [166]: X_test_minmax
Out[166]: array([[-1.5       ,  0.        ,  1.66666667]])

# 可以用以下方法檢視scaler的屬性
In [167]: min_max_scaler.scale_
Out[167]: array([0.5       , 0.5       , 0.33333333])

In [168]: min_max_scaler.min_
Out[168]: array([0.        , 0.5       , 0.33333333])

MaxAbsScaler(絕對值最大標準化)

與上述標準化方法相似,但是它通過除以最大值將訓練集縮放至[-1,1]。這意味著資料已經以0為中心或者是含有非常多0的稀疏資料。

In [169]: X_train = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])

In [170]: max_abs_scaler = preprocessing.MaxAbsScaler()

In [171]: X_train_maxabs =max_abs_scaler.fit_transform(X_train)

In [172]: X_train_maxabs
Out[172]: 
array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])

In [173]: X_test = np.array([[ -3., -1.,  4.]])

In [174]: X_test_maxabs = max_abs_scaler.transform(X_test)

In [175]: X_test_maxabs
Out[175]: array([[-1.5, -1. ,  2. ]])

In [176]: max_abs_scaler.scale_
Out[176]: array([2., 1., 2.])

(4) 規模化稀疏資料

對稀疏資料進行去均值的中心化會破壞稀疏的資料結構。此時可以用其他方法對稀疏的輸入資料進行轉換,特別是那些特徵之間的資料規模不一樣的資料。MaxAbsScaler 和 maxabs_scale這兩個方法是專門為稀疏資料的規模化所設計的。

(5) 規模化有異常值的資料

如果資料有許多異常值,那麼使用資料的均值與方差去做標準化就不行了
在這裡,你可以使用robust_scale 和 RobustScaler這兩個方法。它會根據中位數或者四分位數去中心化資料。

1.2 正則化Normalization
正則化是將樣本在向量空間模型上的一個轉換,經常被使用在分類與聚類中。

函式normalize 提供了一個快速有簡單的方式在一個單向量上來實現這正則化的功能。正則化有l1,l2等,這些都可以用上:

In [42]: import numpy as np

# # 建立一組特徵資料,每一行表示一個樣本,每一列表示一個特徵
In [43]: x = np.array([[1., -1., 2.],[2., 0., 0.],[0., 1., -1.]])

In [44]: from sklearn import preprocessing

In [45]: x_normalized = preprocessing.normalize(x, norm='l2')

In [46]: x
Out[46]: 
array([[ 1., -1.,  2.],
       [ 2.,  0.,  0.],
       [ 0.,  1., -1.]])

In [47]: x_normalized
Out[47]: 
array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])

# preprocessing這個模組還提供了一個實用類Normalizer,實用transform方法同樣也可以對新的資料進行同樣的轉換
In [48]: normalizer = preprocessing.Normalizer().fit(x)

In [49]: normalizer 
Out[49]: Normalizer(copy=True, norm='l2')

#  對訓練資料進行正則
In [50]: normalizer.transform(x)
Out[50]: 
array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])

# 對新的測試資料進行正則
In [51]: normalizer.transform([[-1., 1., 0.]])
Out[51]: array([[-0.70710678,  0.70710678,  0.        ]])

normalize和Normalizer都既可以用在密集陣列也可以用在稀疏矩陣(scipy.sparse)中

1.3 特徵的二值化

特徵的二值化是指將數值型的特徵資料轉換成布林型別的值。可以使用使用類Binarizer。

In [52]: binarizer = preprocessing.Binarizer().fit(x)

In [53]: binarizer.transform(x) # 預設是根據0來二值化,大於0的都標記為1,小於等於0的都標記為0
Out[53]: 
array([[1., 0., 1.],
       [1., 0., 0.],
       [0., 1., 0.]])

In [54]: binarizer = preprocessing.Binarizer(threshold=1.5) # 也可以自己設定這個閥值,只需傳出引數threshold即可

In [55]: binarizer.transform(x)
Out[55]: 
array([[0., 0., 1.],
       [1., 0., 0.],
       [0., 0., 0.]])

binarize and Binarizer都可以用在密集向量和稀疏矩陣上。

1.4 類別特徵編碼
我們知道特徵可能是連續型的也可能是類別型的變數,比如說:
特徵一的特徵值:[“male”, “female”],
特徵二的特徵值:[“from Europe”, “from US”, “from Asia”],
特徵三的特徵值:[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”].

這些類別特徵無法直接進入模型,它們需要被轉換成整數來表徵,比如:
[“male”, “from US”, “uses Internet Explorer”] 對應的編碼 [0, 1, 3]
[“female”, “from Asia”, “uses Chrome”] 對應的編碼 [1, 2, 1].
......

然而上面這種表徵的方式仍然不能直接為scikit-learn的模型所用,因為模型會把它們當成序列型的連續變數。

要想使得類別型的變數能最終被模型直接使用,可以使用one-of-k編碼或者one-hot編碼。這些都可以通過OneHotEncoder實現,它可以將有n種值的一個特徵變成n個二元的特徵。

In [61]: enc = preprocessing.OneHotEncoder()

In [62]: enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
Out[62]: 
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)

In [63]: enc.transform([[0,1,3]]).toarray()
Out[63]: array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])

In [64]: enc = preprocessing.OneHotEncoder(n_values=[2,3,4])

In [65]: enc.fit([[1, 2, 3], [0, 2, 0]])
Out[65]: 
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
       handle_unknown='error', n_values=[2, 3, 4], sparse=True)

In [66]: enc.transform([[1,0,0]]).toarray()
Out[66]: array([[0., 1., 1., 0
            
           

相關推薦

sklearn資料處理

1.介紹 klearn.preprocessing提供了各種公共函式,來將raw feature vetor轉換成另外一種更適合評估器工作的格式。 2.標準化(Standardization)、平均移除法(mean removal)和方差歸一化(vari

機器學習資料處理sklearn preprocessing

Standardization即標準化,儘量將資料轉化為均值為零,方差為一的資料,形如標準正態分佈(高斯分佈)。實際中我們會忽略資料的分佈情況,僅僅是通過改變均值來集中資料,然後將非連續特徵除以他們的標準差。sklearn中 scale函式提供了簡單快速的singlearr

sklearn preprocessing資料處理

1. sklearn preprocessing Standardization即標準化,儘量將資料轉化為均值為零,方差為一的資料,形如標準正態分佈(高斯分佈)。實際中我們會忽略資料的分佈情況,僅僅是通過改變均值來集中資料,然後將非連續特徵除以他們的標準差。

sklearn preprocessing 資料處理 OneHotEncoder

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

機器學習資料處理

資料的預處理總共可以大致分為6步。 匯入需要的庫 這兩個是我們每次都需要匯入的庫 Numpy包含數學計算函式 Pandas用於匯入和管理資料集 匯入資料集 資料集通常是.csv格式。csv檔案以文字形式儲存表格資料。檔案的每一行是一條資料記錄。我們使用pandas的r

preprocessing資料處理模組使用指南

preprocessing 是sklearn庫的一個數據預處理模組,它提供了一些實用的資料預處理函式和預處理類。下邊就對這些功能進行一些簡單介紹,輔以一些例項,便於大家理解。 安裝: pip install scikit-learn 模組匯入並簡記為sp: import

計算機視覺資料處理

wikipedia資料集 預處理 from scipy.io import loadmat path_to_mat = "wikipedia_info/raw_features.mat" matstuff = loadmat(path_to_mat) I_tr = matstuff["I_tr

神經網路訓練影象資料處理的一些方式(一)

神經網路訓練中影象資料預處理的一些方式 1. crop 1. 1 對於有黑色背景的圖片,將資料crop在有效區域內 對於一些有黑色背景的圖片,如下圖: 這樣的圖片在做資料預處理的時候,黑色背景的無效區域,帶來了很大的運算量開銷。面對這種圖片,

sklearn資料處理(preprocessing)系列——類別以及特徵的編碼(Encoder)

  一、特徵編碼 1 類別的獨熱編碼(One-Hot Encoder) 關於什麼是獨熱編碼以及為什麼要進行獨熱編碼,這裡就不詳細介紹了,本文只介紹“具體實踐方式”,原理一筆帶過。 第一步:先對離散的數字、離散的文字、離散的類別進行編號,使用 LabelEncode

機器學習之 資料處理sklearn preprocessing

資料預處理(data preprocessing)是指在主要的處理以前對資料進行的一些處理。如對大部分地球物理面積性觀測資料在進行轉換或增強處理之前,首先將不規則分佈的測網經過插值轉換為規則網的處理,以利於計算機的運算。另外,對於一些剖面測量資料,如地震資料預處理有垂直疊加、

Python: sklearn資料處理函式fit_transform()和transform()的區別

敲《Python機器學習及實踐》上的code的時候,對於資料預處理中涉及到的fit_transform()函式和transform()函式之間的區別很模糊,查閱了很多資料,這裡整理一下:涉及到這兩個函式

Python:sklearn資料處理fit(),transform()與fit_transform()的區別

1 概述 注意這是資料預處理中的方法: Fit(): Method calculates the parameters μ and σ and saves them as internal objects. 解釋:簡單來說,就是求得訓練集X的均值啊,方差啊,最大值啊,最小

Preprocessing data-sklearn資料處理

1. Standardization, or mean removal and variance scaling Standardization即標準化,儘量將資料轉化為均值為零,方差為一的資料。 實際中我們會忽略資料的分佈情況,僅僅是通過改變均值來集中資料,然後將非

使用sklearnpreprocessing.Imputer實現對缺失值的處理

rep tran miss imp RoCE fit val 實現 pro from sklearn import preprocessing import numpy as np X = [[1, 2], [np.nan, 4], [2, 6]] y = [[np.nan

Python初探——sklearn數據處理函數fit_transform()和transform()的區別

splay process div 版權 合數 sin details display 含義 敲《Python機器學習及實踐》上的code的時候,對於數據預處理中涉及到的fit_transform()函數和transform()函數之間的區別很模糊,查閱了很多資料,這裏整理

python之sklearn常見資料處理歸一化方式解析

標準歸一化 歸一化到均值為0,方差為1 sklearn.preprocessing.scale函式:Standardize a dataset along any axis 先貼出主要的原始碼,乍一看,很亂,其實細看之下,就是多了一些判斷稀疏矩陣之類

機器學習資料處理sklearn庫系列函式)

【1】 sklearn.preprocessing.PolynomialFeatures PolynomialFeatures有三個引數 degree:控制多項式的度 interaction_

關於使用Sklearn進行資料處理 —— 缺失值(Missing Value)處理

關於缺失值(missing value)的處理 在sklearn的preprocessing包中包含了對資料集中缺失值的處理,主要是應用Imputer類進行處理。 首先需要說明的是,numpy的陣列中可以使用np.nan/np.NaN(Not A Number)來代替

【轉】關於使用sklearn進行資料處理 —— 歸一化/標準化/正則化

一、標準化(Z-Score),或者去除均值和方差縮放 公式為:(X-mean)/std  計算時對每個屬性/每列分別進行。 將資料按期屬性(按列進行)減去其均值,並處以其方差。得到的結果是,對於每個屬性/每列來說所有資料都聚集在0附近,方差為1。 實現時,有兩種不同的方式:

Python資料處理之---統計學的t檢驗,卡方檢驗以及均值,位數等

Python資料預處理過程:利用統計學對資料進行檢驗,對連續屬性檢驗正態分佈,針對正態分佈屬性繼續使用t檢驗檢驗方差齊次性,針對非正態分佈使用Mann-Whitney檢驗。針對分類變數進行卡方檢驗(涉及三種卡方的檢驗:Pearson卡方,校準卡方,精準卡方)等。