日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sklearn 中的preprocessing数据预处理

發布時間:2024/9/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sklearn 中的preprocessing数据预处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. sklearn preprocessing

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

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

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

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

In [149]: from sklearn import preprocessingIn [150]: import numpy as npIn [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=(X?X.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_std=(X.max(axis=0)?X.min(axis=0))(X?X.min(axis=0))?
X_scaler=Xstd(max?min)+minX\_scaler =\frac {X_std} {(max - min)} + minX_scaler=(max?min)Xs?td?+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這兩個方法。它會根據中位數或者四分位數去中心化數據。

更多的數據預處理方法參考官方文檔:http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling

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 preprocessingIn [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., 0., 1., 0., 0., 0.]])

特征1中有(0,1)兩個值,特征2中有(0,1,2)3個值,特征3中有(0,1,2,3)4個值,所以編碼之后總共有9個二元特征。

但也會存在這樣的情況,某些特征中可能對一些值有缺失,比如明明有男女兩個性別,樣本數據中都是男性,這樣就會默認被判別為只有一類值。這個時候我們可以向OneHotEncoder傳如參數n_values,用來指明每個特征中的值的總個數,如上enc = preprocessing.OneHotEncoder(n_values=[2,3,4])

1.5 彌補缺失數據

在scikit-learn的模型中都是假設輸入的數據是數值型的,并且都是有意義的,如果有缺失數據是通過NAN,或者空值表示的話,就無法識別與計算了。

要彌補缺失值,可以使用均值,中位數,眾數等等。Imputer這個類可以實現。

In [67]: from sklearn.preprocessing import ImputerIn [68]: imp = Imputer(missing_values='NaN', strategy='mean', axis=0)In [69]: imp.fit([[1, 2], [np.nan, 3], [7, 6]]) Out[69]: Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)In [70]: x = [[np.nan, 2], [6, np.nan], [7, 6]]In [71]: imp.transform(x) Out[71]: array([[4. , 2. ],[6. , 3.66666667],[7. , 6. ]])In [72]: import scipy.sparse as sp # Imputer類同樣也可以支持稀疏矩陣,以下例子將0作為了缺失值,為其補上均值In [73]: x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]]) # 創建一個稀疏矩陣In [74]: x Out[74]: <3x2 sparse matrix of type '<class 'numpy.int64'>'with 5 stored elements in Compressed Sparse Column format>In [75]: imp = Imputer(missing_values=0, strategy='mean', verbose=0)In [76]: imp.fit(x) Out[76]: Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)In [77]: x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])In [78]: imp.transform(x_test) Out[78]: array([[4. , 2. ],[6. , 3.66666667],[7. , 6. ]])

1.6 創建多項式特征
有的時候線性的特征并不能做出美的模型,于是我們會去嘗試非線性。非線性是建立在將特征進行多項式地展開上的。

比如將兩個特征 (X1,X2)(X_1, X_2)(X1?,X2?),它的平方展開式便轉換成5個特征(1,X1,X2,X12,X1X2,X22)(1, X_1, X_2, X_1^2, X_1X_2, X_2^2)(1,X1?,X2?,X12?,X1?X2?,X22?),其中1是Bias:

In [79]: import numpy as npIn [80]: from sklearn.preprocessing import PolynomialFeaturesIn [81]: x = np.arange(6).reshape(3, 2)In [82]: x Out[82]: array([[0, 1],[2, 3],[4, 5]])In [83]: poly = PolynomialFeatures(2)In [84]: poly.fit_transform(x) Out[84]: array([[ 1., 0., 1., 0., 0., 1.],[ 1., 2., 3., 4., 6., 9.],[ 1., 4., 5., 16., 20., 25.]])In [85]: x = np.arange(9).reshape(3, 3)In [86]: poly = PolynomialFeatures(degree=3, interaction_only=True)In [87]: poly.fit_transform(x) Out[87]: array([[ 1., 0., 1., 2., 0., 0., 2., 0.],[ 1., 3., 4., 5., 12., 15., 20., 60.],[ 1., 6., 7., 8., 42., 48., 56., 336.]])

也可以自定義選擇只要保留特征相乘的項: 即將(X1,X2,X3)(X_1, X_2, X_3)(X1?,X2?,X3?) 轉換成
(1,X1,X2,X3,X1X2,X1X3,X2X3,X1X2X3)(1, X_1, X_2, X_3, X_1X_2, X_1X_3, X_2X_3, X_1X_2X_3)(1,X1?,X2?,X3?,X1?X2?,X1?X3?,X2?X3?,X1?X2?X3?),如上所示。

1.7 自定義特征的轉換函數
把原始的特征放進一個函數中做轉換,這個函數出來的值作為新的特征。比如說將特征數據做log轉換,做倒數轉換等等。FunctionTransformer 可以實現這個功能

from sklearn.preprocessing import FunctionTransformertransformer = FunctionTransformer(np.log1p)x = np.array([[0, 1], [2, 3]])transformer.transform(x) Out[91]: array([[0. , 0.69314718],[1.09861229, 1.38629436]])

總結:當我們拿到一批原始的數據

  • 首先要明確有多少特征,哪些是連續的,哪些是類別的。
  • 檢查有沒有缺失值,對確實的特征選擇恰當方式進行彌補,使數據完整。
  • 對連續的數值型特征進行標準化,使得均值為0,方差為1。
  • 對類別型的特征進行one-hot編碼。
  • 將需要轉換成類別型數據的連續型數據進行二值化。
  • 為防止過擬合或者其他原因,選擇是否要將數據進行正則化。
  • 在對數據進行初探之后發現效果不佳,可以嘗試使用多項式方法,尋找非線性的關系。
  • 根據實際問題分析是否需要對特征進行相應的函數轉換。
  • 2. numpy.random.shuffle打亂順序函數

    In [2]: import numpy as npIn [3]: arr = np.arange(10)In [4]: arr Out[4]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In [5]: np.random.shuffle(arr)In [6]: arr Out[6]: array([6, 8, 3, 7, 5, 4, 1, 2, 0, 9])In [7]: arr = np.arange(9).reshape((3, 3))In [8]: arr Out[8]: array([[0, 1, 2],[3, 4, 5],[6, 7, 8]]) # 多維矩陣中,只對第一維(行)做打亂順序操作 In [9]: np.random.shuffle(arr)In [10]: arr Out[10]: array([[0, 1, 2],[6, 7, 8],[3, 4, 5]])

    參考:
    https://blog.csdn.net/csmqq/article/details/51461696
    https://blog.csdn.net/sinat_33761963/article/details/53433799

    總結

    以上是生活随笔為你收集整理的sklearn 中的preprocessing数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。