sklearn庫學習筆記1——preprocessing庫
本次主要學習sklearn的preprocessing庫:用來對數據預處理,包括無量綱化,特征二值化,定性數據量化等。
先看下這個庫所包含的類及方法:
主要包括14大類,為訓練集數據的預處理提供接口,每個類都提供了fit(填充數據,獲取數據上的特征信息並保存),transform(將fit保存的信息應用到其它數據集上,對其它數據集進行轉換),fit_transform(填充數據並對數據進行轉換)。如果計算是一次性的,不需創建類,可直接調用與類相對應的方法。本次主要利用iris數據測試
- from sklearn.datasets import load_iris
- iris=load_iris()
無量綱化:
1.標準化:(x-列均值)/ 列標準差
- from sklearn.preprocessing import StandardScaler
- StandardScaler().fit_transform(iris.data)
或使用scaler方法,既可按列,又可按行標準化
- from sklearn.preprocessing import scale
- a=np.array([[1,2,3],[3,2,1]])
- res=scale(a,axis=0) #按列標準化
-
res.mean(axis=0) #查看列均值
- res.std(axis=0) #查看列標準差
- res2=scale(a,axis=1) #按行標準化
這裏要註意大寫開頭的StandarScaler與scale的區別,scale是一個方法,可直接調用,而StandarScaler是一個類,為計算訓練集上的平均值和標準差提供的接口,通過fit方法,存儲訓練集上的均值和標準差,通過transform(x_test)方法,可用同樣的標準處理測試集。也可直接用fit_transform方法,填充並轉換,有點類似模型裏邊的fit。
2.區間縮放:
1)(x-列最小值)/ (列最大值-列最小值), value在0-1直接
- from sklearn.preprocessing import MinMaxScaler
- MinMaxScaler().fit_transform(iris.data)
同樣,如果不想創建一個類,可使用方法minmax_scale
2) x / 列最大值的絕對值, value在[-1,1]。(稀疏矩陣推薦使用)
- ...
- array([[ 0.5, -1. , 1. ],
- [ 1. , 0. , 0. ],
- [ 0. , 1. , -0.5]])
- array([[-1.5, -1. , 2. ]])
- array([ 2., 1., 2.])
二者區別,除值域不一樣外,後者不會改變矩陣的稀疏性,是0的還是0,而前者會改變。
3)根據四分位數來縮放數據。對於數據有較多異常值的情況,使用均值和方差來標準化顯然不合適,按中位數,一、四分位數縮放效果要好,但沒怎麽明白縮放原理,有時間細看下。
- from sklearn.preprocessing import RobustScaler
- RobustScaler().fit_transform(iris.data)
3.歸一化: x /(根號下(x所在行的值的平方和))
- from sklearn.preprocessing import Normalizer
- Normalizer(norm=‘l2‘).fit_transform(iris.data)
norm參數[‘l1’,‘l2‘,‘max‘], 默認norm為l2,即第二範數,也就是二維距離,l1是第一範數,即差的絕對值。
特征二值化:
- import numpy as np
- from sklearn.preprocessing import Binarizer
- a=np.array([[1,2,3],[3,2,1]])
- Binarizer(threshold=2).fit_transform(a)
輸出:array([[0, 0, 1],
[1, 0, 0]])
大於閥值轉為1,小於等於閥值為0
當需要轉換的數據是一列時,也可用pandas很快計算
- import pandas as pd
- df=pd.DataFrame({‘name1‘:[1,2,3]})
- df[df<=2]=0
- df[df>2]=1
- print df
定性變量的量化:
1. onehot編碼
當一個特征變量不能用一個數值表示,而是一個分類值時,我們可以考慮使用onehot編碼。如一個特征是某人最喜歡的水果,特征值為【‘蘋果’,‘梨’,‘葡萄’,‘都不是’】,通常情況下,我們會把它轉換為數字[1,2,3,4]。但機器學習裏的數字默認都是有序的,4比3大等等,而我們的蘋果和梨都是等價的。這時就是onehot編碼發揮作用的時候了。也就是把每一個選項都當作一列特征了,選擇該選項則對應特征值為1否則為0.
- In [202]: from sklearn.preprocessing import OneHotEncoder
- In [203]: fruit=[[0],[1],[0],[2],[0],[3]]
- In [204]: res=OneHotEncoder().fit(fruit)
- In [205]: res.transform(fruit).toarray()
- Out[205]:
- array([[ 1., 0., 0., 0.],
- [ 0., 1., 0., 0.],
- [ 1., 0., 0., 0.],
- [ 0., 0., 1., 0.],
- [ 1., 0., 0., 0.],
- [ 0., 0., 0., 1.]])
2.順帶提下pandas裏對字符型變量的量化為數字
1) dummy
直接將字符串的變量轉換為onehot編碼了,如kaggle的入門訓練Titanic中的上船地點取值為‘s‘,‘q‘,‘c‘ 。 但是它只適應於變量取值較少的情況,對於變量取值範圍較廣的字符串,還是先使用factorize再用onehot編碼較好。
- In [215]: emarked=pd.DataFrame([‘s‘,‘s‘,‘q‘,‘q‘,‘c‘,‘s‘])
- In [216]: pd.get_dummies(emarked)
- Out[216]:
- 0_c 0_q 0_s
- 0 0.0 0.0 1.0
- 1 0.0 0.0 1.0
- 2 0.0 1.0 0.0
- 3 0.0 1.0 0.0
- 4 1.0 0.0 0.0
- 5 0.0 0.0 1.0
2) factorize
將相同的字符串映射為同一個數字,然後再用onehot啦。
- In [214]: import pandas as pd
- data=pd.DataFrame({‘name‘:[‘py‘,‘ws‘,‘py‘,‘zs‘,‘zs‘,‘ls‘,‘py‘]})
- ...: pd.factorize(data.name)
- ...:
- Out[214]:
- (array([0, 1, 0, 2, 2, 3, 0]),
- Index([u‘py‘, u‘ws‘, u‘zs‘, u‘ls‘], dtype=‘object‘))
缺失值處理:
sklearn提供了Imputer對缺失值進行處理,用均值,中位數,眾數代替,通過strategy控制,取值為[‘mean‘,‘median‘,‘most_frequent‘]
- In [223]: a=[[1,2,3],[np.nan,2,4]]
- In [224]: Imputer(strategy=‘mean‘).fit_transform(a)
- Out[224]:
- array([[ 1., 2., 3.],
- [ 1., 2., 4.]])
按指定函數處理數據:
preprocessing庫還提供了FunctionTransformer函數,傳入一個指定的函數提取數據的特征並轉換,以對數轉換為例:
- from numpy import log1p
- from sklearn.preprocessing import FunctionTransformer
- #自定義轉換函數為對數函數的數據變換
- #第一個參數是單變元函數
- 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庫