1. 程式人生 > >sklearn庫學習筆記1——preprocessing庫

sklearn庫學習筆記1——preprocessing庫

form 選擇 nump 情況 std ble 範圍 tail 給定

本次主要學習sklearn的preprocessing庫:用來對數據預處理,包括無量綱化,特征二值化,定性數據量化等。

先看下這個庫所包含的類及方法:

技術分享圖片

主要包括14大類,為訓練集數據的預處理提供接口,每個類都提供了fit(填充數據,獲取數據上的特征信息並保存),transform(將fit保存的信息應用到其它數據集上,對其它數據集進行轉換),fit_transform(填充數據並對數據進行轉換)。如果計算是一次性的,不需創建類,可直接調用與類相對應的方法。本次主要利用iris數據測試

  1. from sklearn.datasets import load_iris
  2. iris=load_iris()

無量綱化:

1.標準化:(x-列均值)/ 列標準差

  1. from sklearn.preprocessing import StandardScaler
  2. StandardScaler().fit_transform(iris.data)

或使用scaler方法,既可按列,又可按行標準化

  1. from sklearn.preprocessing import scale
  2. a=np.array([[1,2,3],[3,2,1]])
  3. res=scale(a,axis=0) #按列標準化
  4. res.mean(axis=0) #查看列均值
  5. res.std(axis=0) #查看列標準差
  6. res2=scale(a,axis=1) #按行標準化

這裏要註意大寫開頭的StandarScaler與scale的區別,scale是一個方法,可直接調用,而StandarScaler是一個類,為計算訓練集上的平均值和標準差提供的接口,通過fit方法,存儲訓練集上的均值和標準差,通過transform(x_test)方法,可用同樣的標準處理測試集。也可直接用fit_transform方法,填充並轉換,有點類似模型裏邊的fit。

2.區間縮放:

1)(x-列最小值)/ (列最大值-列最小值), value在0-1直接

  1. from sklearn.preprocessing import MinMaxScaler
  2. MinMaxScaler().fit_transform(iris.data)

同樣,如果不想創建一個類,可使用方法minmax_scale

2) x / 列最大值的絕對值, value在[-1,1]。(稀疏矩陣推薦使用)

  1. >>> X_train = np.array([[ 1., -1., 2.],
  2. ... [ 2., 0., 0.],
  3. ... [ 0., 1., -1.]])
  4. ...
  5. >>> max_abs_scaler = preprocessing.MaxAbsScaler()
  6. >>> X_train_maxabs = max_abs_scaler.fit_transform(X_train)
  7. >>> X_train_maxabs # doctest +NORMALIZE_WHITESPACE^
  8. array([[ 0.5, -1. , 1. ],
  9. [ 1. , 0. , 0. ],
  10. [ 0. , 1. , -0.5]])
  11. >>> X_test = np.array([[ -3., -1., 4.]])
  12. >>> X_test_maxabs = max_abs_scaler.transform(X_test)
  13. >>> X_test_maxabs
  14. array([[-1.5, -1. , 2. ]])
  15. >>> max_abs_scaler.scale_
  16. array([ 2., 1., 2.])

二者區別,除值域不一樣外,後者不會改變矩陣的稀疏性,是0的還是0,而前者會改變。

3)根據四分位數來縮放數據。對於數據有較多異常值的情況,使用均值和方差來標準化顯然不合適,按中位數,一、四分位數縮放效果要好,但沒怎麽明白縮放原理,有時間細看下。

  1. from sklearn.preprocessing import RobustScaler
  2. RobustScaler().fit_transform(iris.data)

3.歸一化: x /(根號下(x所在行的值的平方和))

  1. from sklearn.preprocessing import Normalizer
  2. Normalizer(norm=‘l2‘).fit_transform(iris.data)

norm參數[‘l1’,‘l2‘,‘max‘], 默認norm為l2,即第二範數,也就是二維距離,l1是第一範數,即差的絕對值。

特征二值化:

  1. import numpy as np
  2. from sklearn.preprocessing import Binarizer
  3. a=np.array([[1,2,3],[3,2,1]])
  4. Binarizer(threshold=2).fit_transform(a)

輸出:array([[0, 0, 1],
[1, 0, 0]])

大於閥值轉為1,小於等於閥值為0

當需要轉換的數據是一列時,也可用pandas很快計算

  1. import pandas as pd
  2. df=pd.DataFrame({‘name1‘:[1,2,3]})
  3. df[df<=2]=0
  4. df[df>2]=1
  5. print df

定性變量的量化:

1. onehot編碼

當一個特征變量不能用一個數值表示,而是一個分類值時,我們可以考慮使用onehot編碼。如一個特征是某人最喜歡的水果,特征值為【‘蘋果’,‘梨’,‘葡萄’,‘都不是’】,通常情況下,我們會把它轉換為數字[1,2,3,4]。但機器學習裏的數字默認都是有序的,4比3大等等,而我們的蘋果和梨都是等價的。這時就是onehot編碼發揮作用的時候了。也就是把每一個選項都當作一列特征了,選擇該選項則對應特征值為1否則為0.

  1. In [202]: from sklearn.preprocessing import OneHotEncoder
  2. In [203]: fruit=[[0],[1],[0],[2],[0],[3]]
  3. In [204]: res=OneHotEncoder().fit(fruit)
  4. In [205]: res.transform(fruit).toarray()
  5. Out[205]:
  6. array([[ 1., 0., 0., 0.],
  7. [ 0., 1., 0., 0.],
  8. [ 1., 0., 0., 0.],
  9. [ 0., 0., 1., 0.],
  10. [ 1., 0., 0., 0.],
  11. [ 0., 0., 0., 1.]])


2.順帶提下pandas裏對字符型變量的量化為數字

1) dummy

直接將字符串的變量轉換為onehot編碼了,如kaggle的入門訓練Titanic中的上船地點取值為‘s‘,‘q‘,‘c‘ 。 但是它只適應於變量取值較少的情況,對於變量取值範圍較廣的字符串,還是先使用factorize再用onehot編碼較好。

  1. In [215]: emarked=pd.DataFrame([‘s‘,‘s‘,‘q‘,‘q‘,‘c‘,‘s‘])
  2. In [216]: pd.get_dummies(emarked)
  3. Out[216]:
  4. 0_c 0_q 0_s
  5. 0 0.0 0.0 1.0
  6. 1 0.0 0.0 1.0
  7. 2 0.0 1.0 0.0
  8. 3 0.0 1.0 0.0
  9. 4 1.0 0.0 0.0
  10. 5 0.0 0.0 1.0

2) factorize

將相同的字符串映射為同一個數字,然後再用onehot啦。

  1. In [214]: import pandas as pd
  2. data=pd.DataFrame({‘name‘:[‘py‘,‘ws‘,‘py‘,‘zs‘,‘zs‘,‘ls‘,‘py‘]})
  3. ...: pd.factorize(data.name)
  4. ...:
  5. Out[214]:
  6. (array([0, 1, 0, 2, 2, 3, 0]),
  7. Index([u‘py‘, u‘ws‘, u‘zs‘, u‘ls‘], dtype=‘object‘))


缺失值處理:

sklearn提供了Imputer對缺失值進行處理,用均值,中位數,眾數代替,通過strategy控制,取值為[‘mean‘,‘median‘,‘most_frequent‘]

  1. In [223]: a=[[1,2,3],[np.nan,2,4]]
  2. In [224]: Imputer(strategy=‘mean‘).fit_transform(a)
  3. Out[224]:
  4. array([[ 1., 2., 3.],
  5. [ 1., 2., 4.]])

按指定函數處理數據:

preprocessing庫還提供了FunctionTransformer函數,傳入一個指定的函數提取數據的特征並轉換,以對數轉換為例:

  1. from numpy import log1p
  2. from sklearn.preprocessing import FunctionTransformer
  3. #自定義轉換函數為對數函數的數據變換
  4. #第一個參數是單變元函數
  5. FunctionTransformer(log1p).fit_transform(iris.data)



總結表:

功能 說明
StandardScaler 無量綱化 標準化,基於特征矩陣的列,將特征值轉換至服從標準正態分布
MinMaxScaler 無量綱化 區間縮放,基於最大最小值,將特征值轉換到[0, 1]區間上
Normalizer 歸一化 基於特征矩陣的行,將樣本向量轉換為“單位向量”
Binarizer 二值化 基於給定閾值,將定量特征按閾值劃分
OneHotEncoder 啞編碼 將定性數據編碼為定量數據
Imputer 缺失值計算 計算缺失值,缺失值可填充為均值等
dummy,factorize pandas庫中的字符串處理 將字符型變量用onehot編碼,將多字符變量映射為數字
FunctionTransformer 自定義單元數據轉換 使用單變元的函數來轉換數據

fit 數據填充 獲取數據特征並存儲
transform 數據轉換 將存儲的標準應用到新的數據集上
fit_transform 數據填充並轉換 獲取數據的特征並轉換數據,轉換後得到的是一個copy的新變量,不會改變原數據




參考:

http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing

http://www.cnblogs.com/jasonfreak/p/5448385.html

轉自https://blog.csdn.net/wateryouyo/article/details/53898332

sklearn庫學習筆記1——preprocessing庫