负数如何归一化处理_机器学习之数据预处理
第一節:前言
數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。由此可見,特征工程在機器學習中占有相當重要的地位。
特征工程:利用數據領域的相關知識來創建能夠使機器學習算法達到最佳性能的特征的過程。
特征工程包含了Data PreProcessing(數據預處理)、Feature Extraction(特征提取)、Feature Selection(特征選擇)和Feature construction(特征構造)等子問題,而數據預處理又包括了數據清洗和特征預處理等子問題,本篇文章主要討論數據預處理的方法及實現。
下圖展示的是特征預處理的內容:
第二節:數值型特征無量綱化
2.1 為什么要做無量綱化處理?
在實際應用中,樣本不同特征的單位不同,會在求距離時造成很大的影響。比如:在兩個樣本中腫瘤大小分別為1cm和5cm,發現時間分別為100天和200天,那么在求距離時,時間差為100、大小差為4,那么其結果會被時間所主導,因為腫瘤大小的差距太小了。但是如果我們把時間用年做單位,0.27年與0.55年的差距又遠小于腫瘤大小的差距,結果又會被大小所主導。
為了避免上述問題對結果造成影響,我們需要對數據做無量綱化處理。無量綱化不是說把天數變成年數,而是說,無論是天數還是年數,最后都會變成1,也就是沒有了單位。常見的無量綱化方法有標準化和歸一化兩種。
2.2數據標準化(Standardization)
前提:標準化的前提是特征值服從正態分布,標準化后,其轉換成標準正態分布。
定義:基于原始數據的均值(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的結果只能用于比較數據間的結果,數據的真實意義還需要還原原值。
- 在存在異常值時無法保證平衡的特征尺度。
那么我們什么時候需要對數據進行標準化呢?
- 某些算法要求樣本具有零均值和單位方差。
- 需要消除樣本不同屬性具有不同量級(大小)時的影響。
- 歸一化有可能提高精度。
數量級的差異將導致量級較大的屬性占據主導地位,從而與實際情況相悖(比如這時實際情況是值域范圍小的特征更重要)。 - 數量級的差異將導致迭代收斂速度減慢。
當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂。 - 依賴于樣本距離的算法對于數據的數量級非常敏感。
- 歸一化有可能提高精度。
代碼:
from sklearn.preprocessing import StandardScaler #標準化,返回值為標準化后的數據 standardScaler = StandardScaler().fit(X_train) standardScaler.transform(X_train)2.3數據歸一化
2.3.1MinMax歸一化
定義:區間縮放法利用了邊界值信息,將屬性縮放到[0,1]區間。
公式如下:
效果如下:
代碼:
from sklearn.preprocessing import MinMaxScaler #區間縮放,返回值為縮放到[0, 1]區間的數據 minMaxScaler = MinMaxScaler().fit(X_train) minMaxScaler.transform(X_train)缺點:
- 這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義。
- MinMaxScaler對異常值的存在非常敏感。
2.3.2MaxAbs歸一化
定義:單獨地縮放和轉換每個特征,使得訓練集中的每個特征的最大絕對值將為1.0,將屬性縮放到[-1,1]。它不會移動/居中數據,因此不會破壞任何稀疏性。
公式如下:
效果如下:
缺點:
- 這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義;
- MaxAbsScaler與先前的縮放器不同,絕對值映射在[-1,1]范圍內。
在僅有正數據時,該縮放器的行為MinMaxScaler與此類似,因此也存在大的異常值。
代碼:
from sklearn.preprocessing import MaxAbsScaler maxAbsScaler = MaxAbsScaler().fit(X_train) maxAbsScaler.transform(X_train)2.4正態分布化(Normalization)(也是一種歸一化)
定義:正則化的過程是將每個樣本縮放到單位范數(每個樣本的范數為1)。Normalization主要思想是對每個樣本計算其p-范數,然后對該樣本中每個元素除以該范數,這樣處理的結果是使得每個處理后樣本的p-范數(l1-norm,l2-norm)等于1。
適用情形:如果要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。該方法是文本分類和聚類分析中經常使用的向量空間模型(Vector Space Model)的基礎。
規則為l2的公式如下:
效果如下:
可以在上面的兩個圖中看到所有樣本都映射到單位圓上。在我們的示例中,兩個選定的特征僅具有正值, 因此,轉換后的數據僅位于正象限中。如果某些原始特征具有正值和負值的混合,則情況并非如此。
代碼:
from sklearn.preprocessing import Normalizer #正態歸一化,返回值為正態歸一化后的數據 normalizer = Normalizer(norm='l2').fit(X_train) normalizer.transform(X_train)2.5標準化與歸一化對比
相同點:
它們的相同點在于都能取消由于量綱不同引起的誤差,都是一種線性變換,都是對向量X按照比例壓縮再進行平移。
不同點:
- 目的不同,歸一化是為了消除綱量壓縮到[0,1]區間。
標準化只是調整特征整體的分布。 - 歸一化與最大,最小值有關。
標準化與均值,標準差有關。 - 歸一化輸出在[0,1]之間。
標準化無限制。
適用情形:
- 如果對輸出結果范圍有要求,用歸一化。
- 如果數據較為穩定,不存在極端的最大最小值,用歸一化。
- 如果數據存在異常值和較多噪音,用標準化,可以間接通過中心化避免異常值和極端值的影響。
應用場景:
- 在分類、聚類算法中,需要使用距離來度量相似性的時候(如SVM、KNN)、或者使用PCA技術進行降維的時候,標準化(Z-score standardization)表現更好。
- 不涉及距離度量、協方差計算,數據不符合正太分布時,可以使用區間縮放的歸一化方法或其他歸一化方法。
比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0,255]的范圍。 - 基于樹的方法不需要進行特征的歸一化。
例如隨機森林,bagging與boosting等方法。
如果是基于參數的模型或者基于距離的模型,因為需要對參數或者距離進行計算,都需要進行歸一化。
小結:
一般來說,建議優先使用標準化。對于輸出有要求時再嘗試其他方法,如歸一化或者更加復雜的方法。很多方法都可以將輸出范圍調整到[0, 1],如果我們對于數據的分布有假設的話,更加有效的方法是使用相對應的概率密度函數來轉換。除上述介紹的方法外,還有一些相對不怎么常用的處理方法:RobustScaler、PowerTransformer、QuantileTransformer和QuantileTransformer等。
第三節:數值型特征特征分箱(數據離散化)
定義:離散化是數值型特征非常重要的一種處理方式,主要作用就是要將數值型數據轉化成類別型數據。連續值的取值范圍可能是無窮的,為了便于表示和在模型中處理,需要對連續值特征進行離散化處理。
分箱的重要性及其優勢:
- 離散特征的增加和減少都很容易,易于模型的快速迭代。
- 稀疏向量內積乘法運算速度快,計算結果方便存儲,容易擴展。
- 離散化后的特征對異常數據有很強的魯棒性。
比如一個特征是年齡>30是1,否則0。如果特征沒有離散化,一個異常數據“年齡300歲”會給模型造成很大的干擾。 - 對于線性模型,表達能力受限。
單變量離散化為N個后,每個變量有單獨的權重,相當于模型引入了非線性,能夠提升模型表達能力,加大擬合。 - 離散化后可以進行特征交叉,由M+N個變量變為M*N個變量,進一步引入非線性,提升表達能力。
- 特征離散化后,模型會更穩定。
比如如果對用戶年齡離散化,20-30作為一個區間,不會因為一個用戶年齡長了一歲就變成一個完全不同的人。當然處于區間相鄰處的樣本會剛好相反,所以如何劃分區間很重要。 - 特征離散化以后,起到了簡化邏輯回歸模型的作用,降低了模型過擬合的風險。
- 可以將缺失作為獨立的一類帶入模型。
- 將所有變量變換到相似的尺度上。
3.1無監督分箱法
3.1.1自定義分箱
定義:自定義分箱,是根據業務經驗或者常識等自行設定劃分的區間,然后將原始數據歸類到各個區間中。
3.1.2等距分箱
定義:按照相同寬度將數據分成幾等份。從最小值到最大值之間,均分為 N 等份, 這樣, 如果 A,B 為最小最大值, 則每個區間的長度為 W=(B?A)/N , 則區間邊界值為A+W,A+2W,….A+(N?1)W 。這里只考慮邊界,每個等份里面的實例數量可能不等。
缺點:受異常值的影響比較大。
代碼:
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'] = pd.cut(df['age'],3) #新增一列存儲等距劃分的分箱特征 print(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]3.1.3等頻分箱
定義:將數據分成幾等份,每等份數據里面的數據個數是相同的。區間的邊界值要經過選擇,使得每個區間包含大致相等的實例數量。比如說 N=10 ,每個區間應該包含大約10%的實例。
代碼:
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'] = pd.qcut(df['age'],3) #新增一列存儲等頻劃分的分箱特征 print(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]3.1.4聚類分箱
定義:基于k均值聚類的分箱方法,k均值聚類法將觀測值聚為k類,但在聚類過程中需要保證分箱的有序性,第一個分箱中所有觀測值都要小于第二個分箱中的觀測值,第二個分箱中所有觀測值都要小于第三個分箱中的觀測值,以此類推。
實現步驟:
- Step 0:
對預處理后的數據進行歸一化處理。 - Step 1:
將歸一化處理過的數據,應用k-means聚類算法,劃分為多個區間:
采用等距法設定k-means聚類算法的初始中心,得到聚類中心。 - Step 2:
在得到聚類中心后將相鄰的聚類中心的中點作為分類的劃分點,將各個對象加入到距離最近的類中,從而將數據劃分為多個區間。 - Step 3:
重新計算每個聚類中心,然后重新劃分數據,直到每個聚類中心不再變化,得到最終的聚類結果。
代碼:
from sklearn.cluster import KMeans kmodel=KMeans(n_clusters=k) #k為聚成幾類 kmodel.fit(data.reshape(len(data),1))) #訓練模型 c=pd.DataFrame(kmodel.cluster_centers_) #求聚類中心 c=c.sort_values(by=’列索引') #排序 w=pd.rolling_mean(c,2).iloc[1:] #用滑動窗口求均值的方法求相鄰兩項求中點,作為邊界點 w=[0] +list(w[0] + [ data.max() ] #把首末邊界點加上 d3= pd.cut(data,w,labels=range(k)) #cut函數3.1.5二值化(Binarization)
定義:二值化可以將數值型(numerical)的特征進行閥值化得到boolean型數據。這對于下游的概率估計來說可能很有用(比如:數據分布為Bernoulli分布時)。
公式:定量特征二值化的核心在于設定一個閾值,大于閾值的賦值為1,小于等于閾值的賦值為0。
代碼:
from sklearn.preprocessing import Binarizer # Binarizer函數也可以設定一個閾值,結果數據值大于閾值的為1,小于閾值的為0 binarizer = Binarizer(threshold=0.0).fit(X_train) binarizer.transform(X_train)3.2有監督分箱法
3.2.1卡方分箱法
定義:自底向上的(即基于合并的)數據離散化方法。它依賴于卡方檢驗:具有最小卡方值的相鄰區間合并在一起,直到滿足確定的停止準則。
基本思想:對于精確的離散化,相對類頻率在一個區間內應當完全一致。因此,如果兩個相鄰的區間具有非常類似的類分布,則這兩個區間可以合并,否則,它們應當保持分開。而低卡方值表明它們具有相似的類分布。
實現步驟:
- Step 0:
預先定義一個卡方的閾值。 - Step 1:
初始化。
根據要離散的屬性對實例進行排序,每個實例屬于一個區間。 - Step 2:
合并區間。- 計算每一對相鄰區間的卡方值。
- 將卡方值最小的一對區間合并。
Aij:第i區間第j類的實例的數量。 Eij:Aij的期望頻率(=(Ni*Cj)/N),N是總樣本數,Ni是第i組的樣本數,Cj是第j類樣本在全體中的比例
閾值的意義:
類別和屬性獨立時,有90%的可能性,計算得到的卡方值會小于4.6。大于閾值4.6的卡方值就說明屬性和類不是相互獨立的,不能合并。如果閾值選的大,區間合并就會進行很多次,離散后的區間數量少、區間大。
注意:
- ChiMerge算法推薦使用0.90、0.95、0.99置信度,最大區間數取10到15之間。
- 也可以不考慮卡方閾值,此時可以考慮最小區間數或者最大區間數。
指定區間數量的上限和下限,最多幾個區間,最少幾個區間。 - 對于類別型變量,需要分箱時需要按照某種方式進行排序。
代碼:
可以借鑒以下代碼 https://github.com/tatsumiw/ChiMerge/blob/master/ChiMerge.py
3.2.2最小熵法分箱
定義:需要使總熵值達到最小,也就是使分箱能夠最大限度地區分因變量的各類別。也就是統計學中所說的類內相似性越小越好。類間相似性越大越好。
熵是信息論中數據無序程度的度量標準,提出信息熵的基本目的是找出某種符號系統的信息量和冗余度之間的關系,以便能用最小的成本和消耗來實現最高效率的數據存儲、管理和傳遞。
數據集的熵越低,說明數據之間的差異越小,最小熵劃分就是為了使每箱中的數據具有最好的相似性。給定箱的個數,如果考慮所有可能的分箱情況,最小熵方法得到的箱應該是具有最小熵的分箱。
代碼:暫時沒有,后面補。
第四節:統計變換
作用:數據分布的傾斜有很多負面的影響。我們可以使用特征工程技巧,利用統計或數學變換來減輕數據分布傾斜的影響。使原本密集的區間的值盡可能的分散,原本分散的區間的值盡量的聚合。
這些變換函數都屬于冪變換函數簇,通常用來創建單調的數據變換。它們的主要作用在于它能幫助穩定方差,始終保持分布接近于正態分布并使得數據與分布的平均值無關。
4.1.Log變換
定義:Log變換通常用來創建單調的數據變換。它的主要作用在于幫助穩定方差,始終保持分布接近于正態分布并使得數據與分布的平均值無關。
Log 變換屬于冪變換函數簇。公式如下:
自然對數 b=e,e=2.71828。通常在十進制系統中使用的b=10 作為底數。
當應用于傾斜分布時 Log 變換是很有用的,因為Log變換傾向于拉伸那些落在較低的幅度范圍內自變量值的范圍,傾向于壓縮或減少更高幅度范圍內的自變量值的范圍。從而使得傾斜分布盡可能的接近正態分布。
作用:
針對一些數值連續型特征的方差不穩定,特征值重尾分布我們需要采用Log化來調整整個數據分布的方差,屬于方差穩定型數據轉換。比如在詞頻統計中,有些介詞的出現數量遠遠高于其他詞,這種詞頻分布的特征就會出現有些詞頻特征值極不協調的狀況,拉大了整個數據分布的方差。這個時候,可以考慮Log化。尤其在問本分析領域,時間序列分析領域,Log化非常常見, 其目標是讓方差穩定,把目標關注在其波動之上。
效果如下:
代碼:
df['Income_log'] = np.log((1+df['Income'])) #sklearn中 import numpy as np from sklearn.preprocessing import FunctionTransformer transformer = FunctionTransformer(np.log1p, validate=True) X = np.array([[0, 1], [2, 3]]) transformer.transform(X) #輸出 array([[0. , 0.69314718],[1.09861229, 1.38629436]])4.2.Box-Cox變換
定義:Box-Cox 變換是另一種流行的冪變換函數簇中的一個函數。該函數有一個前提條件,即數值型數值必須先變換為正數(與 log 變換所要求的一樣)。如果數值是負的,可以利用常數對數值進行偏移。
公式如下:
生成的變換后的輸出y是輸入 x 和變換參數的函數;當 λ=0 時,該變換就是自然對數 log 變換。λ 的最佳取值通常由最大似然或最大對數似然確定。
作用:
Box-Cox變換是Box和Cox在1964年提出的一種廣義冪變換方法,是統計建模中常用的一種數據變換,用于連續型變量不滿足正態分布的情況。Box-Cox變換之后,在一定程度上可以減小不可觀測的誤差和預測變量的相關性。Box-Cox變換的主要特點是引入一個參數,通過數據本身估計該參數進而確定應采取的數據變換形式,Box-Cox變換可以明顯地改善數據的正態性、對稱性和方差相等性,對許多實際數據都是行之有效的方法。
效果如下:
代碼:
import scipy.stats as spstats # 從數據分布中移除非零值 income = np.array(df['Income']) income_clean = income[~np.isnan(income)] # 計算最佳λ值 l, opt_lambda = spstats.boxcox(income_clean) print('Optimal lambda value:', opt_lambda) # 進行Box-Cox變換 df['Income_boxcox_lambda_opt'] = spstats.boxcox(df['Income'],lmbda=opt_lambda) #sklearn中 import numpy as np from sklearn.preprocessing import PowerTransformer pt = PowerTransformer() data = [[1, 2], [3, 2], [4, 5]] print(pt.fit(data)) PowerTransformer(copy=True, method='yeo-johnson', standardize=True) print(pt.lambdas_) #輸出 [ 1.386... -3.100...] print(pt.transform(data)) #輸出 [[-1.316... -0.707...] [ 0.209... -0.707...] [ 1.106... 1.414...]]第五節:類別特征編碼
5.1標簽編碼(LabelEncode)
定義:LabelEncoder是對不連續的數字或者文本進行編號,編碼值介于0和n_classes-1之間的標簽。
優點:相對于OneHot編碼,LabelEncoder編碼占用內存空間小,并且支持文本特征編碼。
缺點:它隱含了一個假設:不同的類別之間,存在一種順序關系。在具體的代碼實現里,LabelEncoder會對定性特征列中的所有獨特數據進行一次排序,從而得出從原始輸入到整數的映射。應用較少,一般在樹模型中可以使用。
代碼:
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() le.fit(["paris", "paris", "tokyo", "amsterdam"]) print('特征:{}'.format(list(le.classes_))) # 輸出 特征:['amsterdam', 'paris', 'tokyo'] print('轉換標簽值:{}'.format(le.transform(["tokyo", "tokyo", "paris"]))) # 輸出 轉換標簽值:array([2, 2, 1]...) print('特征標簽值反轉:{}'.format(list(le.inverse_transform([2, 2, 1])))) # 輸出 特征標簽值反轉:['tokyo', 'tokyo', 'paris']5.2.獨熱編碼(OneHotEncode)
定義:OneHotEncoder用于將表示分類的數據擴維。最簡單的理解就是與位圖類似,設置一個個數與類型數量相同的全0數組,每一位對應一個類型,如該位為1,該數字表示該類型。OneHotEncode只能對數值型變量二值化,無法直接對字符串型的類別變量編碼。
為什么要使用獨熱編碼?
獨熱編碼是因為大部分算法是基于向量空間中的度量來進行計算的,為了使非偏序關系的變量取值不具有偏序性,并且到圓點是等距的。使用one-hot編碼,將離散特征的取值擴展到了歐式空間,離散特征的某個取值就對應歐式空間的某個點。將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。
為什么特征向量要映射到歐式空間?
將離散特征通過one-hot編碼映射到歐式空間,是因為,在回歸、分類、聚類等機器學習算法中,特征之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算。
優點:獨熱編碼解決了分類器不好處理屬性數據的問題,在一定程度上也起到了擴充特征的作用。它的值只有0和1,不同的類型存儲在垂直的空間。
缺點:當類別的數量很多時,特征空間會變得非常大。在這種情況下,一般可以用PCA來減少維度。而且one hot encoding+PCA這種組合在實際中也非常有用。
代碼:
from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder() enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) # fit來學習編碼 enc.transform([[0, 1, 3]]).toarray() # 進行編碼 # 輸出:array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])5.3標簽二值化(LabelBinarizer)
定義:功能與OneHotEncoder一樣,但是OneHotEncode只能對數值型變量二值化,無法直接對字符串型的類別變量編碼,而LabelBinarizer可以直接對字符型變量二值化。
代碼:
from sklearn.preprocessing import LabelBinarizer lb = LabelBinarizer() lb.fit([1, 2, 6, 4, 2]) print(lb.classes_) # 輸出 array([1, 2, 4, 6]) print(lb.transform([1, 6])) # 輸出 array([[1, 0, 0, 0],[0, 0, 0, 1]]) print(lb.fit_transform(['yes', 'no', 'no', 'yes'])) # 輸出 array([[1],[0],[0],[1]])5.4多標簽二值化(MultiLabelBinarizer)
定義:用于label encoding,生成一個(n_examples * n_classes)大小的0~1矩陣,每個樣本可能對應多個label。
適用情形:
- 每個特征中有多個文本單詞。
- 用戶興趣特征(如特征值:”健身 電影 音樂”)適合使用多標簽二值化,因為每個用戶可以同時存在多種興趣愛好。
- 多分類類別值編碼的情況。
- 電影分類標簽中(如:[action, horror]和[romance, commedy])需要先進行多標簽二值化,然后使用二值化后的值作為訓練數據的標簽值。
代碼:
from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer() print(mlb.fit_transform([(1, 2), (3,)])) # 輸出 array([[1, 1, 0],[0, 0, 1]]) print(mlb.classes_) # 輸出:array([1, 2, 3]) print(mlb.fit_transform([{'sci-fi', 'thriller'}, {'comedy'}])) # 輸出:array([[0, 1, 1],[1, 0, 0]]) print(list(mlb.classes_)) # 輸出:['comedy', 'sci-fi', 'thriller']5.5平均數編碼(Mean Encoding)
定義:平均數編碼(mean encoding)的編碼方法,在貝葉斯的架構下,利用所要預測的因變量(target variable),有監督地確定最適合這個定性特征的編碼方式。
適用情形:平均數編碼(mean encoding),針對高基數 類別特征的有監督編碼。當一個類別特征列包括了極多不同類別時(如家庭地址,動輒上萬)時,可以采用。
為什么要用平均數編碼?
- 如果某一個特征是定性的(categorical),而這個特征的可能值非常多(高基數),那么平均數編碼(mean encoding)是一種高效的編碼方式。在實際應用中,這類特征工程能極大提升模型的性能。
- 因為定性特征表示某個數據屬于一個特定的類別,所以在數值上,定性特征值通常是從0到n的離散整數。例子:花瓣的顏色(紅、黃、藍)、性別(男、女)、地址、某一列特征是否存在缺失值(這種NA 指示列常常會提供有效的額外信息)。
- 一般情況下,針對定性特征,我們只需要使用sklearn的OneHotEncoder或LabelEncoder進行編碼,這類簡單的預處理能夠滿足大多數數據挖掘算法的需求。定性特征的基數(cardinality)指的是這個定性特征所有可能的不同值的數量。在高基數(high cardinality)的定性特征面前,這些數據預處理的方法往往得不到令人滿意的結果。
優點:
和獨熱編碼相比,節省內存、減少算法計算時間、有效增強模型表現。
代碼:
參考:https://zhuanlan.zhihu.com/p/26308272
5.5參考資料
- 機器學習小組公眾號《數據科學家聯盟》
- https://blog.csdn.net/jliang3/article/details/99416330
- https://zhuanlan.zhihu.com/p/26308272
十分感謝上述文章作者的分享,本人受益良多。
期待你我的共同進步!
若喜歡小編的分享,歡迎關注小編的公眾號哦,小編會一直認真學習,認真分享筆記的~~~
總結
以上是生活随笔為你收集整理的负数如何归一化处理_机器学习之数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUUCTF-Reverse:hello
- 下一篇: 赢在微点答案专区英语_少儿英语课堂 语法