本文主要記錄使用sklearn庫對數據集進行預處理的相關操作,通過了解相關知識,運行已有的代碼來進行新內容的學習
- standardization
標準化,我們通常會忽略分佈的形狀而僅僅通過去除每個特徵分量的均值將數據變換到中心,然後通過除以特徵值的標準差對數據進行尺度縮放variance scaling
標準化不易受到異常值的影響。
from sklearn import preprocessing
import numpy as np
x = np.array([[1, -1, 2],
[2, 0, 0],
[0, 1, -1]])
x_1 = preprocessing.scale(x)
print(x_1)
print(x_1.mean(axis=1))
preprocessing模塊提供了一個standardscaler類,實現變換器的api用於計算訓練數據集的均值和標準差,然後將結果用於測試數據集中去。
from sklearn import preprocessing
import numpy as np
x = np.array([[1, -1, 2],
[2, 0, 0],
[0, 1, -1]])
x_1 = preprocessing.StandardScaler().fit(x)
print(x_1)
print(x_1.mean_)
print(x_1.transform(x))
StandardScaler(copy=True, with_mean=True, with_std=True)
[1. 0. 0.33333333]
[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
#會使用訓練集的均值和方差進行變換操作
print(x_1.transform([[2,1,2]]))
[[1.22474487 1.22474487 1.33630621]]
#矩陣尺度縮放到(0,1)之間
#歸一化操作
from sklearn import preprocessing
import numpy as np
x = np.array([[1, -1, 2],
[2, 0, 0],
[0, 1, -1]])
x_1 = preprocessing.MinMaxScaler(feature_range=(1,2))
#feature_range=(0,1)是默認的我們可以設置數據集到固定的區間
x_1_1 = x_1.fit_transform(x)
print(x_1_1)
x_test = np.array([[-3, -1, 4]])
x_text_1 = x_1.fit_transform(x_test)
print(x_text_1)
[[0.5 0. 1. ]
[1. 0.5 0.33333333]
[0. 1. 0. ]]
[[0. 0. 0.]]
from sklearn import preprocessing
import numpy as np
x = np.array([[1., -1., 2.],
[2., 0., 0.],
[0., 1., -1.]])
x_1 = preprocessing.MaxAbsScaler()
#這個函數的作用是讓數據訓練區間變成【-1,1】,但是沒有feature_range的函數
x_train = x_1.fit_transform(x)
print(x_train)
x_text = np.array([[1., 2., 3.]])
x_text_1 = x_1.transform(x_text)
print(x_text_1)
print(x_1.scale_)
[[ 0.5 -1. 1. ]
[ 1. 0. 0. ]
[ 0. 1. -0.5]]
[[0.5 2. 1.5]]
[2. 1. 2.]
縮放稀疏數據
1.MaxAbsScaler和maxabs_scale都有專門設計的用於稀疏變換的功能,推薦使用
2.sacle和standarscaler可以接受scipy.sparse矩陣爲輸入,只要參數with_mean=false被顯示的傳入構造函數裏面去就可以了
3.robustscaler不接受稀疏輸入,但可以使用transoform methond來處理稀疏輸入數據
如果數據存在很多誤差,那麼可以使用robust_scale和RobustScaler來增加數據的可靠性。
- normalization
標準化是將單個樣本的特徵變爲具有單位長度的特徵向量的過程。用於兩個樣本的相似性時,很有作用。
normalize提供了快速簡單的方法使l1和l2範數執行規範化操作,l2爲歐氏距離。
from sklearn.preprocessing import normalize
x = [[1, 2, 3],
[2, 2, 3],
[3, 3, 3]]
x_normalize1 = normalize(x, norm="l2")
x_normalize2 = normalize(x, norm="l1")
print(x_normalize1)
print(x_normalize2)
[[0.26726124 0.53452248 0.80178373]
[0.48507125 0.48507125 0.72760688]
[0.57735027 0.57735027 0.57735027]]
[[0.16666667 0.33333333 0.5 ]
[0.28571429 0.28571429 0.42857143]
[0.33333333 0.33333333 0.33333333]]
#分別使用L1和L2範數的不同結果
該變換是一個變換器,所以具有transformer Api包括fit等,但是不存在在所有樣本上的統計學習過程
normalize=preprocessing.Normalizer().fit()
normalize.transform([[1,2,3]])
Out[8]: array([[0.26726124, 0.53452248, 0.80178373]])
無論normalize和Nomarlizer函數都接受scipy.sparse作爲輸入,對於稀疏輸入,都會轉換爲CSR格式,爲了避免不必要的內存拷貝,推薦使用CSR格式(scipy.sparse.csr_matrix)
- binarization
將數值型特徵閾值化轉變爲布爾型特徵值,這一過程主要爲概率型學習器提供與處理機制。
概率型學習器假定輸入數據服從多變量伯努利分佈。
在文本處理中也普遍使用二至特徵簡化概率推斷過程。
同normalize一樣用於pipeline的早期。
from sklearn.preprocessing import Binarizer
x = [[1, 2, 3],
[2, -1, 3],
[3, 3, 3]]
x_binarize = Binarizer(threshold=1).fit(x)#threshold爲設置閾值,小於等於1爲0,大於1爲1,變成一個二值結果
print(x_binarize.transform(x))
[[0 1 1]
[1 0 1]
[1 1 1]]
4.標稱特徵編碼
特徵在一定情況下是離散的,對於整數型特徵,無法被skLearn的學習器使用,一種變換標稱型特徵的方法事故one-of-k和one-hot編碼
from sklearn import preprocessing
x = [[0, 1, 1],
[0, 0, 2],
[0, 2, 1],
[1, 0, 2]]
enc = preprocessing.OneHotEncoder()
enc.fit(x)
print(enc.transform([[0,2,2]]).toarray())
[[1. 0. 0. 0. 1. 0. 1.]]
因爲我們在fit之後,編碼器就仿照了x的格式,第一列有0,1兩個結果,所以維度爲2,第二列有0,1,2三個結果,維度爲3,第三列爲1,2兩個結果所以維度爲2,最後的輸出
1,0爲0
0,0,1爲2
0,1爲2
from sklearn import preprocessing
#因爲我們可能無法全部寫出所以的可能,但是可以通過
#n_value來指定所以列的可能性
x = [[1, 2, 3],
[0, 1, 0]]
enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4])
enc.fit(x)
print(enc.transform([[0, 1, 1]]).toarray())
[[1. 0. 0. 1. 0. 0. 1. 0. 0.]]
#編碼器在fit適應之後,我們爲其指定維度分別爲2,3,4
#最後的輸入是0,1,1
#第一個有兩個維度,從0開始,有0,1,所以1,0表示0
#第二個有3各維度,1表示第二個,所以是0,1,0
#第三個4各維度,所以輸出應爲,0,1,0,0
5.缺失值填充
第一種是,如果某個行或列值不存在,則把整行或整列都刪掉,這種有可能會造成數據有效性的缺失。
另外一種是用相鄰數據的相關性來對缺失值進行填補,sklearn提供了三種補全策略,使用一行或一列的均值,中值,出現次數最多的值進行補充。
import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN',
strategy='mean',
axis=0)
imp.fit([[1, 2],
[np.nan, 3],
[7, 6]])
print(imp.transform([[np.nan, 2],
[6, np.nan],
[7, 6]]))
[[4. 2. ]
[6. 3.66666667]
[7. 6. ]]
#這裏缺失值的補充使用fit之後矩陣的均值來對我們transform的矩陣進行填補
#imputer支持稀疏矩陣輸入
from sklearn.preprocessing import Imputer
import scipy.sparse as sp
imp = Imputer(missing_values=0,
strategy='mean',
axis=0)
x = sp.csc_matrix([[1, 2],
[0, 3],
[7, 6]])
imp.fit(x)
x_test = sp.csc_matrix([[0, 2],
[6, 0],
[7, 6]])
print(imp.transform(x_test))
[[4. 2. ]
[6. 3.66666667]
[7. 6. ]]
6.多項式特徵
爲輸入數據添加非線性特徵可以增加模型複雜度
(x1,x2)拓寬到(1,x1,x2,x1²,x1,x2,x2²)
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
x = np.arange(6).reshape(3, 2)
print(x)
poly = PolynomialFeatures(2)
print(poly.fit_transform(x))
[[0 1]
[2 3]
[4 5]]
[[ 1. 0. 1. 0. 0. 1.]
[ 1. 2. 3. 4. 6. 9.]
[ 1. 4. 5. 16. 20. 25.]]
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
x = np.arange(9).reshape(3, 3)
print(x)
poly = PolynomialFeatures(degree=3,interaction_only=True)
print(poly.fit_transform(x))
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ 1. 0. 1. 2. 0. 0. 2. 0.]
[ 1. 3. 4. 5. 12. 15. 20. 60.]
[ 1. 6. 7. 8. 42. 48. 56. 336.]]
#我們只想得到輸入的每個數據相互之間的乘積關係
7.自定義變換器
from sklearn.preprocessing import FunctionTransformer
import numpy as np
t = FunctionTransformer(func=np.sin)
x = np.arange(6).reshape(2,3)
print(x)
print(t.transform(x))
[[0 1 2]
[3 4 5]]
[[ 0. 0.84147098 0.90929743]
[ 0.14112001 -0.7568025 -0.95892427]]
#定義一個sin變換器,輸入的結果每一位都進行sin正弦變換
8.數據降維(維度:降低特徵的數量)