Python数据预处理数据的方法总结(使用sklearn-preprocessing)
文章目錄
- 數據預處理思路
- 數據預處理方法
- 1 標準化:去均值,方差規模化
- 2 規模化稀疏數據
- 3 規模化有異常值的數據
- 4 正則化Normalization
- 5 二值化–特征的二值化
- 6 類別特征編碼
- 7 彌補缺失數據
- 7 創建多項式特征
數據預處理思路
1.首先要明確有多少特征,哪些是連續的,哪些是類別的。
2.檢查有沒有缺失值,對確實的特征選擇恰當方式進行彌補,使數據完整。
3.對連續的數值型特征進行標準化,使得均值為0,方差為1。
4.對類別型的特征進行one-hot編碼。
5.將需要轉換成類別型數據的連續型數據進行二值化。
6.為防止過擬合或者其他原因,選擇是否要將數據進行正則化。
7.在對數據進行初探之后發現效果不佳,可以嘗試使用多項式方法,尋找非線性的關系。
8.根據實際問題分析是否需要對特征進行相應的函數轉換。
數據預處理方法
1 標準化:去均值,方差規模化
Standardization標準化:將特征數據的分布調整成標準正太分布,也叫高斯分布,也就是使得數據的均值為0,方差為1.標準化的原因在于如果有些特征的方差過大,則會主導目標函數從而使參數估計器無法正確地去學習其他特征。標準化的過程為兩步:去均值的中心化(均值變為0);方差的規模化(方差變為1)。
在sklearn.preprocessing中提供了一個scale的方法,可以實現以上功能:
preprocessing這個模塊還提供了一個實用類StandarScaler,它可以在訓練數據集上做了標準轉換操作之后,把相同的轉換應用到測試訓練集中。
這是相當好的一個功能。可以對訓練數據,測試數據應用相同的轉換,以后有新的數據進來也可以直接調用,不用再重新把數據放在一起再計算一次了。
調用fit方法,根據已有的訓練數據創建一個標準化的轉換器# 另外,StandardScaler()中可以傳入兩個參數:with_mean,with_std.這兩個都是布爾型的參數,
默認情況下都是true,但也可以自定義成false.即不要均值中心化或者不要方差規模化為1.
MaxAbsScaler
原理與上面的很像,只是數據會被規模化到[-1,1]之間。也就是特征中,所有數據都會除以最大值。這個方法對那些已經中心化均值維0或者稀疏的數據有意義。
2 規模化稀疏數據
如果對稀疏數據進行去均值的中心化就會破壞稀疏的數據結構。雖然如此,我們也可以找到方法去對稀疏的輸入數據進行轉換,特別是那些特征之間的數據規模不一樣的數據。
MaxAbsScaler 和maxabs_scale這兩個方法是專門為稀疏數據的規模化所設計的。
3 規模化有異常值的數據
如果你的數據有許多異常值,那么使用數據的均值與方差去做標準化就不行了。在這里,你可以使用robust_scale 和 RobustScaler這兩個方法。它會根據中位數或者四分位數去中心化數據。
4 正則化Normalization
正則化是將樣本在向量空間模型上的一個轉換,經常被使用在分類與聚類中。
函數normalize 提供了一個快速有簡單的方式在一個單向量上來實現這正則化的功能。正則化有l1,l2等,這些都可以用上:
preprocessing這個模塊還提供了一個實用類Normalizer,實用transform方法同樣也可以對新的數據進行同樣的轉換
# preprocessing這個模塊還提供了一個實用類Normalizer,實用transform方法同樣也可以對新的數據進行同樣的轉換 # 根據訓練數據創建一個正則器 normalizer =preprocessing.Normalizer().fit(x) normalizer # 對訓練數據進行正則 normalizer.transform(x) # 對新的測試數據進行正則 normalizer.transform([[-1., 1., 0.]]) # normalize和Normalizer都既可以用在密集數組也可以用在稀疏矩陣(scipy.sparse)中 # 對于稀疏的輸入數據,它會被轉變成維亞索的稀疏行表征(具體請見scipy.sparse.csr_matrix)5 二值化–特征的二值化
特征的二值化是指將數值型的特征數據轉換成布爾類型的值。可以使用實用類Binarizer。
# 特征的二值化是指將數值型的特征數據轉換成布爾類型的值。可以使用實用類Binarizer # 默認是根據0來二值化,大于0的都標記為1,小于等于0的都標記為0。 from sklearn import preprocessing import numpy as np # 創建一組特征數據,每一行表示一個樣本,每一列表示一個特征 x = np.array([[1., -1., 2.], [2., 0., 0.], [0.,1., -1.]]) binarizer =preprocessing.Binarizer().fit(x) binarizer.transform(x) #當然也可以自己設置這個閥值,只需傳出參數threshold即可 binarizer =preprocessing.Binarizer(threshold=1.5) binarizer.transform(x)6 類別特征編碼
OneHotEncoder獨熱編碼
獨熱編碼(啞變量 dummy variable)是因為大部分算法是基于向量空間中的度量來進行計算的,為了使非偏序關系的變量取值不具有偏序性,并且到圓點是等距的。使用one-hot編碼,將離散特征的取值擴展到了歐式空間,離散特征的某個取值就對應歐式空間的某個點。將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。離散特征進行one-hot編碼后,編碼后的特征,其實每一維度的特征都可以看做是連續的特征。就可以跟對連續型特征的歸一化方法一樣,對每一維特征進行歸一化。比如歸一化到[-1,1]或歸一化到均值為0,方差為1。
什么情況下(不)用獨熱編碼?
用:獨熱編碼用來解決類別型數據的離散值問題,
不用:將離散型特征進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特征是離散的,并且不用one-hot編碼就可以很合理的計算出距離,那么就沒必要進行one-hot編碼。有些基于樹的算法在處理變量時,并不是基于向量空間度量,數值只是個類別符號,即沒有偏序關系,所以不用進行獨熱編碼。 Tree Model不太需要one-hot編碼:對于決策樹來說,one-hot的本質是增加樹的深度。
總的來說,要是one hot encoding的類別數目不太多,建議優先考慮。
什么情況下(不)需要歸一化?
需要: 基于參數的模型或基于距離的模型,都是要進行特征的歸一化。
不需要:基于樹的方法是不需要進行特征的歸一化,例如隨機森林,bagging 和 boosting等。
要想使得類別型的變量能最終被模型直接使用,可以使用one-of-k編碼或者one-hot編碼。這些都可以通過OneHotEncoder實現,它可以將有n種值的一個特征變成n個二元的特征。
7 彌補缺失數據
在scikit-learn的模型中都是假設輸入的數據是數值型的,并且都是有意義的,如果有缺失數據是通過NAN,或者空值表示的話,就無法識別與計算了。
要彌補缺失值,可以使用均值,中位數,眾數等等。Imputer這個類可以實現。請看:
# 彌補缺失數據# 在scikit-learn的模型中都是假設輸入的數據是數值型的,并且都是有意義的,如果有缺失數據是通過NAN,或者空值表示的話,就無法識別與計算了。 # 要彌補缺失值,可以使用均值,中位數,眾數等等。Imputer這個類可以實現。請看: 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]]) x = [[np.nan, 2], [6, np.nan], [7, 6]] imp.transform(x)# Imputer類同樣也可以支持稀疏矩陣,以下例子將0作為了缺失值,為其補上均值 import scipy.sparse as sp # 創建一個稀疏矩陣 x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]]) imp = Imputer(missing_values=0, strategy='mean', verbose=0) imp.fit(x) x_test = sp.csc_matrix([[0, 2], [6, 0], [7,6]]) imp.transform(x_test)7 創建多項式特征
有的時候線性的特征并不能做出美的模型,于是我們會去嘗試非線性。非線性是建立在將特征進行多項式地展開上的。
比如將兩個特征 (X_1, X_2),它的平方展開式便轉換成5個特征(1, X_1, X_2, X_1^2, X_1X_2, X_2^2). 代碼案例如下
import numpy as np from sklearn.preprocessing import PolynomialFeatures # 自建一組3*2的樣本 x = np.arange(6).reshape(3, 2) # 創建2次方的多項式 # 比如將兩個特征 (X_1, X_2),它的平方展開式便轉換成5個特征(1, X_1, X_2, X_1^2, X_1X_2, X_2^2). 代碼案例如下: poly = PolynomialFeatures(2) poly.fit_transform(x) # 也可以自定義選擇只要保留特征相乘的項。 # 即將 (X_1, X_2, X_3) 轉換成 (1, X_1, X_2, X_3, X_1X_2, X_1X_3, X_2X_3, X_1X_2X_3). x = np.arange(9).reshape(3, 3) poly = PolynomialFeatures(degree=3, interaction_only=True) poly.fit_transform(x)#自定義特征的轉換函數 # 通俗的講,就是把原始的特征放進一個函數中做轉換,這個函數出來的值作為新的特征。 # 比如說將特征數據做log轉換,做倒數轉換等等。 # FunctionTransformer 可以實現這個功能 import numpy as np from sklearn.preprocessing import FunctionTransformer transformer = FunctionTransformer(np.log1p) x = np.array([[0, 1], [2, 3]]) transformer.transform(x) 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Python数据预处理数据的方法总结(使用sklearn-preprocessing)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java发送outlook邮件_通过Ja
- 下一篇: websocket python爬虫_p