python sklearn 归一化_数据分析|Python特征工程(5)
OX00 引言
數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。由此可見,特征工程在機器學習中占有相當重要的地位。在實際應用當中,可以說特征工程是機器學習成功的關鍵。
特征做不好,調參調到老。重視調參,少走彎路!特征工程又包含了Data PreProcessing(數據預處理)、Feature Extraction(特征提取)、Feature Selection(特征選擇)和Feature construction(特征構造)等子問題,而數據預處理又包括了數據清洗和特征預處理等子問題。
OX01 標準化、歸一化與正態分布化
sklearn中的IRIS(鳶尾花)數據集來對特征處理功能進行說明:
from sklearn.datasets import load_iris #導入IRIS數據集 iris = load_iris() #特征矩陣 iris.data #目標向量 iris.targetarray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])在sklearn中專門的用來數據歸一化的方法:StandardScaler。
from無量綱化使不同規格的數據轉換到同一規格。常見的無量綱化方法有標準化和歸一化。
1.1 歸一化
最大最小【0,1】歸一化
區間縮放法利用了邊界值信息,將屬性縮放到[0,1]。
缺點:
- 這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義;
- MinMaxScaler對異常值的存在非常敏感。
Python自帶的【0,1】歸一化
from sklearn import preprocessing import numpy as np # 初始化數據,每一行表示一個樣本,每一列表示一個特征 x = np.array([[ 0., -3., 1.],[ 3., 1., 2.],[ 0., 1., -1.]]) # 將數據進行 [0,1] 規范化 min_max_scaler = preprocessing.MinMaxScaler() minmax_x = min_max_scaler.fit_transform(x) print (minmax_x)[[0. 0. 0.66666667][1. 1. 1. ][0. 1. 0. ]]MaxAbs歸一化
單獨地縮放和轉換每個特征,使得訓練集中的每個特征的最大絕對值將為1.0,將屬性縮放到[-1,1]。它不會移動/居中數據,因此不會破壞任何稀疏性。
缺點:
- 這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義;
- MaxAbsScaler與先前的縮放器不同,絕對值映射在[0,1]范圍內。
在僅有正數據時,該縮放器的行為MinMaxScaler與此類似,因此也存在大的異常值。
1.2 標準化
標準化(也叫Z-score standardization,均值為0方差為1)(對列向量處理)
標準化的前提是特征值服從正態分布,標準化后,其轉換成標準正態分布。
基于原始數據的均值(mean)和標準差(standarddeviation)進行數據的標準化。將A的原始值x使用z-score標準化到x’。z-score標準化方法適用于屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數據的情況。
優點:
Z-Score最大的優點就是簡單,容易計算,Z-Score能夠應用于數值型的數據,并且不受數據量級的影響,因為它本身的作用就是消除量級給分析帶來的不便。
缺點:
- 估算Z-Score需要總體的平均值與方差,但是這一值在真實的分析與挖掘中很難得到,大多數情況下是用樣本的均值與標準差替代;
- Z-Score對于數據的分布有一定的要求,正態分布是最有利于Z-Score計算的;
- Z-Score消除了數據具有的實際意義,A的Z-Score與B的Z-Score與他們各自的分數不再有關系,因此Z-Score的結果只能用于比較數據間的結果,數據的真實意義還需要還原原值;
- 在存在異常值時無法保證平衡的特征尺度。
數據標準化的原因:
- 某些算法要求樣本具有零均值和單位方差;
- 需要消除樣本不同屬性具有不同量級時的影響。
- 歸一化有可能提高精度; 數量級的差異將導致量級較大的屬性占據主導地位,從而與實際情況相悖(比如這時實際情況是值域范圍小的特征更重要);
- 數量級的差異將導致迭代收斂速度減慢; 當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;
- 依賴于樣本距離的算法對于數據的數量級非常敏感。
1.3 標準化與歸一化對比
相同點:
它們的相同點在于都能取消由于量綱不同引起的誤差;都是一種線性變換,都是對向量X按照比例壓縮再進行平移。
不同點:
- 目的不同,歸一化是為了消除綱量壓縮到[0,1]區間;
標準化只是調整特征整體的分布; - 歸一化與最大,最小值有關;
標準化與均值,標準差有關; - 歸一化輸出在[0,1]之間;
標準化無限制。
什么時候用歸一化?什么時候用標準化?
- 如果對輸出結果范圍有要求,用歸一化;
- 如果數據較為穩定,不存在極端的最大最小值,用歸一化;
- 如果數據存在異常值和較多噪音,用標準化,可以間接通過中心化避免異常值和極端值的影響。
歸一化與標準化的應用場景
- 在分類、聚類算法中,需要使用距離來度量相似性的時候(如SVM、KNN)、或者使用PCA技術進行降維的時候,標準化(Z-score standardization)表現更好;
- 在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用歸一化方法。
比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍; - 基于樹的方法不需要進行特征的歸一化。
例如隨機森林,bagging與boosting等方法。
如果是基于參數的模型或者基于距離的模型,因為需要對參數或者距離進行計算,都需要進行歸一化。
除了上面介紹的方法外,還有一些相對沒這么常用的處理方法:RobustScaler、PowerTransformer、QuantileTransformer和QuantileTransformer等。
1.4 正態分布化
正態分布化 -Normalizer,將同一行數據的不同特征進行規范化,這樣一個數據的不同特征具有相同的量綱
正則化的過程是將每個樣本縮放到單位范數(每個樣本的范數為1),如果要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。
該方法是文本分類和聚類分析中經常使用的向量空間模型(Vector Space Model)的基礎。
Normalization主要思想是對每個樣本計算其p-范數,然后對該樣本中每個元素除以該范數,這樣處理的結果是使得每個處理后樣本的p-范數(l1-norm,l2-norm)等于1。
from sklearn.preprocessing import Normalizer #歸一化,返回值為歸一化后的數據 Normalizer().fit_transform(iris.data)array([[0.80377277, 0.55160877, 0.22064351, 0.0315205 ],[0.82813287, 0.50702013, 0.23660939, 0.03380134],[0.80533308, 0.54831188, 0.2227517 , 0.03426949],[0.80003025, 0.53915082, 0.26087943, 0.03478392],[0.790965 , 0.5694948 , 0.2214702 , 0.0316386 ],#normalizer = Normalizer(norm='l2').fit(X_train) #normalizer.transform(X_train)from sklearn.preprocessing import Normalizer import math data = np.array([[1,2],[3,4],[5,6]]).reshape(3,2) print(data)print (data[0][0]/math.sqrt((data[0][0])**2 + (data[0][1])**2)) # 計算第一個元素L2正則化后的值 # 規范化 Normalizer().fit_transform(data)[[1 2][3 4][5 6]] 0.4472135954999579 Out[27]:array([[0.4472136 , 0.89442719],[0.6 , 0.8 ],[0.6401844 , 0.76822128]]) 參考鏈接:騰訊文檔OX02 數值型特征分箱(數據離散化)
離散化是數值型特征非常重要的一個處理,其實就是要將數值型數據轉化成類別型數據。連續值的取值空間可能是無窮的,為了便于表示和在模型中處理,需要對連續值特征進行離散化處理。
分箱的重要性及其優勢:
- 離散特征的增加和減少都很容易,易于模型的快速迭代;
- 稀疏向量內積乘法運算速度快,計算結果方便存儲,容易擴展;
- 離散化后的特征對異常數據有很強的魯棒性;
比如一個特征是年齡>30是1,否則0。
如果特征沒有離散化,一個異常數據“年齡300歲”會給模型造成很大的干擾; - 對于線性模型,表達能力受限;
單變量離散化為N個后,每個變量有單獨的權重,相當于模型引入了非線性,能夠提升模型表達能力,加大擬合; - 離散化后可以進行特征交叉,由M+N個變量變為M*N個變量,進一步引入非線性,提升表達能力;
- 特征離散化后,模型會更穩定;
比如如果對用戶年齡離散化,20-30作為一個區間,不會因為一個用戶年齡長了一歲就變成一個完全不同的人。
當然處于區間相鄰處的樣本會剛好相反,所以怎么劃分區間是門學問; - 特征離散化以后,起到了簡化了邏輯回歸模型的作用,降低了模型過擬合的風險;
- 可以將缺失作為獨立的一類帶入模型;
- 將所有變量變換到相似的尺度上。
2.1 無監督分箱法
自定義分箱
自定義分箱,是指根據業務經驗或者常識等自行設定劃分的區間,然后將原始數據歸類到各個區間中。
等距分箱
按照相同寬度將數據分成幾等份。
import pandas as pd df = pd.DataFrame([[22,1],[13,1],[33,1],[52,0],[16,0],[42,1],[53,1],[39,1],[26,0],[66,0]],columns=['age','Y']) df['age_bin_2'] = pd.cut(df['age'],3) #新增一列存儲等距劃分的分箱特征 display(df) # 輸出age Y age_bin 0 22 1 (12.947, 30.667] 1 13 1 (12.947, 30.667] 2 33 1 (30.667, 48.333] 3 52 0 (48.333, 66.0] 4 16 0 (12.947, 30.667] 5 42 1 (30.667, 48.333] 6 53 1 (48.333, 66.0] 7 39 1 (30.667, 48.333] 8 26 0 (12.947, 30.667] 9 66 0 (48.333, 66.0]等頻分箱
將數據分成幾等份,每等份數據里面的個數是一樣的。
import pandas as pd df = pd.DataFrame([[22,1],[13,1],[33,1],[52,0],[16,0],[42,1],[53,1],[39,1],[26,0],[66,0]],columns=['age','Y']) df['age_bin_1'] = pd.qcut(df['age'],3) #新增一列存儲等頻劃分的分箱特征 display(df) # 輸出age Y age_bin 0 22 1 (12.999, 26.0] 1 13 1 (12.999, 26.0] 2 33 1 (26.0, 42.0] 3 52 0 (42.0, 66.0] 4 16 0 (12.999, 26.0] 5 42 1 (26.0, 42.0] 6 53 1 (42.0, 66.0] 7 39 1 (26.0, 42.0] 8 26 0 (12.999, 26.0] 9 66 0 (42.0, 66.0]聚類分箱
基于k均值聚類的分箱:k均值聚類法將觀測值聚為k類,但在聚類過程中需要保證分箱的有序性:第一個分箱中所有觀測值都要小于第二個分箱中的觀測值,第二個分箱中所有觀測值都要小于第三個分箱中的觀測值,等等。
實現步驟
- Step 0:
對預處理后的數據進行歸一化處理; - Step 1:
將歸一化處理過的數據,應用k-means聚類算法,劃分為多個區間:
采用等距法設定k-means聚類算法的初始中心,得到聚類中心; - Step 2:
在得到聚類中心后將相鄰的聚類中心的中點作為分類的劃分點,將各個對象加入到距離最近的類中,從而將數據劃分為多個區間; - Step 3:
重新計算每個聚類中心,然后重新劃分數據,直到每個聚類中心不再變化,得到最終的聚類結果。
2.2 二值化
二值化可以將數值型(numerical)的feature進行閥值化得到boolean型數據。這對于下游的概率估計來說可能很有用(比如:數據分布為Bernoulli分布時)。
對定量特征二值化(對列向量處理)
''' 定性與定量區別 定性:博主很胖,博主很瘦 定量:博主有80kg,博主有60kg '''from sklearn.preprocessing import Binarizer #二值化,閾值設置為3,返回值為二值化后的數據 ;>3顯示為1,否則為0 print(iris.data) Binarizer(threshold=3).fit_transform(iris.data)對定性特征啞編碼(對列向量處理)
from sklearn.preprocessing import OneHotEncoder #啞編碼,對IRIS數據集的目標值,返回值為啞編碼后的數據 print(OneHotEncoder().fit_transform(iris.target.reshape((-1,1))))2.3 有監督分箱法
2.3.1 卡方分箱法
自底向上的(即基于合并的)數據離散化方法。它依賴于卡方檢驗:具有最小卡方值的相鄰區間合并在一起,直到滿足確定的停止準則。
https://github.com/tatsumiw/ChiMerge/blob/master/ChiMerge.py2.3.2 最小熵法分箱
需要使總熵值達到最小,也就是使分箱能夠最大限度地區分因變量的各類別。
熵是信息論中數據無序程度的度量標準,提出信息熵的基本目的是找出某種符號系統的信息量和冗余度之間的關系,以便能用最小的成本和消耗來實現最高效率的數據存儲、管理和傳遞。
數據集的熵越低,說明數據之間的差異越小,最小熵劃分就是為了使每箱中的數據具有最好的相似性。給定箱的個數,如果考慮所有可能的分箱情況,最小熵方法得到的箱應該是具有最小熵的分箱。
2.4 小結
LabelEncode、OneHotEncode或LabelBinarizer等。
OX03 其它特征變換方法
多項式變換(對行向量處理)
''' 在多元回歸分析中, 當特征不滿足線性,可以多特征進行多項式變換'''from sklearn.preprocessing import PolynomialFeatures#多項式轉換 #參數degree為度,默認值為2 PolynomialFeatures().fit_transform(iris.data)from numpy import log1p from sklearn.preprocessing import FunctionTransformer #自定義轉換函數為對數函數的數據變換 #第一個參數是單變元函數 FunctionTransformer(log1p).fit_transform(iris.data)Box-Cox變換(對因變量處理)
from scipy.stats import boxcox_normmax from scipy.special import boxcox1p lambda_2=boxcox_normmax(test.B) print(lambda_2) test.B=boxcox1p(test.B,lambda_2) print(test) print(test.skew(axis=0))OUT: 0.9999999595600494A B c 0 1 5.033370 4 1 2 17.332385 5 2 3 26.623161 6 3 4 5.033370 7 A 0.000000 B 0.633103 c 0.000000 dtype: float64 特征工程這篇文檔比較全面:sklearn中的數據預處理和特征工程 - 是安醬和菜菜呀 - 博客園11種降維方法(未寫)
特征選擇方法(待補充)
選擇特征的角度很多:變量的預測能力,變量之間的相關性,變量的簡單性(容易生成和使用),變量的強壯性(不容易被繞過),變量在業務上的可解釋性(被挑戰時可以解釋的通)等等。但是,其中最主要和最直接的衡量標準是變量的預測能力。
預測能力衡量:IV值,信息增益,基尼系數等;
1、 特征選擇:特征發散,如果一個特征不發散,方差為0,說明樣本在這個特征上基本沒有差異,這個特征對于樣本區分基本沒用2、 特征選擇:考慮特征與目標的相關性,優先選擇與目標相關性高的特征!
3、 根據方差選擇特征:計算各個特征的方差,選擇方差大于閾值的特征
4、 單變量特征選擇:計算每個特征與y的相關性;對于回歸問題或分類問題可以采用卡方檢驗的方式對特征進行檢測
5、 皮爾遜相關系數(適用于回歸問題即y連續),簡單實用
6、 基于模型的特征融合方法:主成分分析,聚類,支持向量機,隨機森林都可以作為篩選特征的方法
未完待續……
最后,歡迎關注我的數據分析專欄,目前已經超過1000+小伙伴聚集在這里學習了
數據分析?zhuanlan.zhihu.com 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python sklearn 归一化_数据分析|Python特征工程(5)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 100篇范文(7)
- 下一篇: 计算机应用技术专业课程改革方案,【计算机