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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

负数如何归一化处理_机器学习之数据预处理

發(fā)布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 负数如何归一化处理_机器学习之数据预处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第一節(jié):前言

數(shù)據(jù)和特征決定了機器學(xué)習(xí)的上限,而模型和算法只是逼近這個上限而已。由此可見,特征工程在機器學(xué)習(xí)中占有相當(dāng)重要的地位。

特征工程:利用數(shù)據(jù)領(lǐng)域的相關(guān)知識來創(chuàng)建能夠使機器學(xué)習(xí)算法達(dá)到最佳性能的特征的過程。

特征工程包含了Data PreProcessing(數(shù)據(jù)預(yù)處理)、Feature Extraction(特征提取)、Feature Selection(特征選擇)和Feature construction(特征構(gòu)造)等子問題,而數(shù)據(jù)預(yù)處理又包括了數(shù)據(jù)清洗和特征預(yù)處理等子問題,本篇文章主要討論數(shù)據(jù)預(yù)處理的方法及實現(xiàn)。

下圖展示的是特征預(yù)處理的內(nèi)容:

第二節(jié):數(shù)值型特征無量綱化

2.1 為什么要做無量綱化處理?

在實際應(yīng)用中,樣本不同特征的單位不同,會在求距離時造成很大的影響。比如:在兩個樣本中腫瘤大小分別為1cm和5cm,發(fā)現(xiàn)時間分別為100天和200天,那么在求距離時,時間差為100、大小差為4,那么其結(jié)果會被時間所主導(dǎo),因為腫瘤大小的差距太小了。但是如果我們把時間用年做單位,0.27年與0.55年的差距又遠(yuǎn)小于腫瘤大小的差距,結(jié)果又會被大小所主導(dǎo)。

為了避免上述問題對結(jié)果造成影響,我們需要對數(shù)據(jù)做無量綱化處理。無量綱化不是說把天數(shù)變成年數(shù),而是說,無論是天數(shù)還是年數(shù),最后都會變成1,也就是沒有了單位。常見的無量綱化方法有標(biāo)準(zhǔn)化和歸一化兩種。

2.2數(shù)據(jù)標(biāo)準(zhǔn)化(Standardization)

前提:標(biāo)準(zhǔn)化的前提是特征值服從正態(tài)分布,標(biāo)準(zhǔn)化后,其轉(zhuǎn)換成標(biāo)準(zhǔn)正態(tài)分布。

定義:基于原始數(shù)據(jù)的均值(mean)和標(biāo)準(zhǔn)差(standarddeviation)進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化。將 A 的原始值 x 使用z-score標(biāo)準(zhǔn)化到x’。z-score標(biāo)準(zhǔn)化方法適用于屬性 A 的最大值和最小值未知的情況,或有超出取值范圍的離群數(shù)據(jù)的情況。

標(biāo)準(zhǔn)化公式如下

注意:均值和標(biāo)準(zhǔn)差都是在樣本集上定義的,而不是在單個樣本上定義的。標(biāo)準(zhǔn)化是針對某個屬性的,需要用到所有樣本在該屬性上的值。

接下來看一下標(biāo)準(zhǔn)化的效果吧:

優(yōu)點:

Z-Score最大的優(yōu)點就是簡單,容易計算,Z-Score能夠應(yīng)用于數(shù)值型的數(shù)據(jù),并且不受數(shù)據(jù)量級(數(shù)據(jù)多少)的影響,因為它本身的作用就是消除量級給分析帶來的不便。

缺點:

  • 估算Z-Score需要總體的平均值與方差,但是這一值在真實的分析與挖掘中很難得到,大多數(shù)情況下是用樣本的均值與標(biāo)準(zhǔn)差替代。
  • Z-Score對于數(shù)據(jù)的分布有一定的要求,正態(tài)分布是最有利于Z-Score計算的。
  • Z-Score消除了數(shù)據(jù)具有的實際意義,屬性A的Z-Score與屬性B的Z-Score與他們各自的分?jǐn)?shù)不再有關(guān)系,因此Z-Score的結(jié)果只能用于比較數(shù)據(jù)間的結(jié)果,數(shù)據(jù)的真實意義還需要還原原值。
  • 在存在異常值時無法保證平衡的特征尺度。

那么我們什么時候需要對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化呢?

  • 某些算法要求樣本具有零均值和單位方差。
  • 需要消除樣本不同屬性具有不同量級(大小)時的影響。
    • 歸一化有可能提高精度。
      數(shù)量級的差異將導(dǎo)致量級較大的屬性占據(jù)主導(dǎo)地位,從而與實際情況相悖(比如這時實際情況是值域范圍小的特征更重要)。
    • 數(shù)量級的差異將導(dǎo)致迭代收斂速度減慢。
      當(dāng)使用梯度下降法尋求最優(yōu)解時,很有可能走“之字型”路線(垂直等高線走),從而導(dǎo)致需要迭代很多次才能收斂。
    • 依賴于樣本距離的算法對于數(shù)據(jù)的數(shù)量級非常敏感。

代碼:

from sklearn.preprocessing import StandardScaler #標(biāo)準(zhǔn)化,返回值為標(biāo)準(zhǔn)化后的數(shù)據(jù) standardScaler = StandardScaler().fit(X_train) standardScaler.transform(X_train)

2.3數(shù)據(jù)歸一化

2.3.1MinMax歸一化

定義:區(qū)間縮放法利用了邊界值信息,將屬性縮放到[0,1]區(qū)間。

公式如下:

效果如下:

代碼:

from sklearn.preprocessing import MinMaxScaler #區(qū)間縮放,返回值為縮放到[0, 1]區(qū)間的數(shù)據(jù) minMaxScaler = MinMaxScaler().fit(X_train) minMaxScaler.transform(X_train)

缺點:

  • 這種方法有一個缺陷就是當(dāng)有新數(shù)據(jù)加入時,可能導(dǎo)致max和min的變化,需要重新定義。
  • MinMaxScaler對異常值的存在非常敏感。

2.3.2MaxAbs歸一化

定義:單獨地縮放和轉(zhuǎn)換每個特征,使得訓(xùn)練集中的每個特征的最大絕對值將為1.0,將屬性縮放到[-1,1]。它不會移動/居中數(shù)據(jù),因此不會破壞任何稀疏性。

公式如下:

效果如下:

缺點:

  • 這種方法有一個缺陷就是當(dāng)有新數(shù)據(jù)加入時,可能導(dǎo)致max和min的變化,需要重新定義;
  • MaxAbsScaler與先前的縮放器不同,絕對值映射在[-1,1]范圍內(nèi)。
    在僅有正數(shù)據(jù)時,該縮放器的行為MinMaxScaler與此類似,因此也存在大的異常值。

代碼:

from sklearn.preprocessing import MaxAbsScaler maxAbsScaler = MaxAbsScaler().fit(X_train) maxAbsScaler.transform(X_train)

2.4正態(tài)分布化(Normalization)(也是一種歸一化)

定義:正則化的過程是將每個樣本縮放到單位范數(shù)(每個樣本的范數(shù)為1)。Normalization主要思想是對每個樣本計算其p-范數(shù),然后對該樣本中每個元素除以該范數(shù),這樣處理的結(jié)果是使得每個處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。

適用情形:如果要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。該方法是文本分類和聚類分析中經(jīng)常使用的向量空間模型(Vector Space Model)的基礎(chǔ)。

規(guī)則為l2的公式如下:

效果如下:

可以在上面的兩個圖中看到所有樣本都映射到單位圓上。在我們的示例中,兩個選定的特征僅具有正值, 因此,轉(zhuǎn)換后的數(shù)據(jù)僅位于正象限中。如果某些原始特征具有正值和負(fù)值的混合,則情況并非如此。

代碼:

from sklearn.preprocessing import Normalizer #正態(tài)歸一化,返回值為正態(tài)歸一化后的數(shù)據(jù) normalizer = Normalizer(norm='l2').fit(X_train) normalizer.transform(X_train)

2.5標(biāo)準(zhǔn)化與歸一化對比

相同點:

它們的相同點在于都能取消由于量綱不同引起的誤差,都是一種線性變換,都是對向量X按照比例壓縮再進(jìn)行平移。

不同點:

  • 目的不同,歸一化是為了消除綱量壓縮到[0,1]區(qū)間。
    標(biāo)準(zhǔn)化只是調(diào)整特征整體的分布。
  • 歸一化與最大,最小值有關(guān)。
    標(biāo)準(zhǔn)化與均值,標(biāo)準(zhǔn)差有關(guān)。
  • 歸一化輸出在[0,1]之間。
    標(biāo)準(zhǔn)化無限制。

適用情形:

  • 如果對輸出結(jié)果范圍有要求,用歸一化。
  • 如果數(shù)據(jù)較為穩(wěn)定,不存在極端的最大最小值,用歸一化。
  • 如果數(shù)據(jù)存在異常值和較多噪音,用標(biāo)準(zhǔn)化,可以間接通過中心化避免異常值和極端值的影響。

應(yīng)用場景:

  • 在分類、聚類算法中,需要使用距離來度量相似性的時候(如SVM、KNN)、或者使用PCA技術(shù)進(jìn)行降維的時候,標(biāo)準(zhǔn)化(Z-score standardization)表現(xiàn)更好。
  • 不涉及距離度量、協(xié)方差計算,數(shù)據(jù)不符合正太分布時,可以使用區(qū)間縮放的歸一化方法或其他歸一化方法。
    比如圖像處理中,將RGB圖像轉(zhuǎn)換為灰度圖像后將其值限定在[0,255]的范圍。
  • 基于樹的方法不需要進(jìn)行特征的歸一化。
    例如隨機森林,bagging與boosting等方法。
    如果是基于參數(shù)的模型或者基于距離的模型,因為需要對參數(shù)或者距離進(jìn)行計算,都需要進(jìn)行歸一化。

小結(jié):

一般來說,建議優(yōu)先使用標(biāo)準(zhǔn)化。對于輸出有要求時再嘗試其他方法,如歸一化或者更加復(fù)雜的方法。很多方法都可以將輸出范圍調(diào)整到[0, 1],如果我們對于數(shù)據(jù)的分布有假設(shè)的話,更加有效的方法是使用相對應(yīng)的概率密度函數(shù)來轉(zhuǎn)換。除上述介紹的方法外,還有一些相對不怎么常用的處理方法:RobustScaler、PowerTransformer、QuantileTransformer和QuantileTransformer等。

第三節(jié):數(shù)值型特征特征分箱(數(shù)據(jù)離散化)

定義:離散化是數(shù)值型特征非常重要的一種處理方式,主要作用就是要將數(shù)值型數(shù)據(jù)轉(zhuǎn)化成類別型數(shù)據(jù)。連續(xù)值的取值范圍可能是無窮的,為了便于表示和在模型中處理,需要對連續(xù)值特征進(jìn)行離散化處理。

分箱的重要性及其優(yōu)勢:

  • 離散特征的增加和減少都很容易,易于模型的快速迭代。
  • 稀疏向量內(nèi)積乘法運算速度快,計算結(jié)果方便存儲,容易擴展。
  • 離散化后的特征對異常數(shù)據(jù)有很強的魯棒性。
    比如一個特征是年齡>30是1,否則0。如果特征沒有離散化,一個異常數(shù)據(jù)“年齡300歲”會給模型造成很大的干擾。
  • 對于線性模型,表達(dá)能力受限。
    單變量離散化為N個后,每個變量有單獨的權(quán)重,相當(dāng)于模型引入了非線性,能夠提升模型表達(dá)能力,加大擬合。
  • 離散化后可以進(jìn)行特征交叉,由M+N個變量變?yōu)镸*N個變量,進(jìn)一步引入非線性,提升表達(dá)能力。
  • 特征離散化后,模型會更穩(wěn)定。
    比如如果對用戶年齡離散化,20-30作為一個區(qū)間,不會因為一個用戶年齡長了一歲就變成一個完全不同的人。當(dāng)然處于區(qū)間相鄰處的樣本會剛好相反,所以如何劃分區(qū)間很重要。
  • 特征離散化以后,起到了簡化邏輯回歸模型的作用,降低了模型過擬合的風(fēng)險。
  • 可以將缺失作為獨立的一類帶入模型。
  • 將所有變量變換到相似的尺度上。

3.1無監(jiān)督分箱法

3.1.1自定義分箱

定義:自定義分箱,是根據(jù)業(yè)務(wù)經(jīng)驗或者常識等自行設(shè)定劃分的區(qū)間,然后將原始數(shù)據(jù)歸類到各個區(qū)間中。

3.1.2等距分箱

定義:按照相同寬度將數(shù)據(jù)分成幾等份。從最小值到最大值之間,均分為 N 等份, 這樣, 如果 A,B 為最小最大值, 則每個區(qū)間的長度為 W=(B?A)/N , 則區(qū)間邊界值為A+W,A+2W,….A+(N?1)W 。這里只考慮邊界,每個等份里面的實例數(shù)量可能不等。

缺點:受異常值的影響比較大。

代碼:

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等頻分箱

定義:將數(shù)據(jù)分成幾等份,每等份數(shù)據(jù)里面的數(shù)據(jù)個數(shù)是相同的。區(qū)間的邊界值要經(jīng)過選擇,使得每個區(qū)間包含大致相等的實例數(shù)量。比如說 N=10 ,每個區(qū)間應(yīng)該包含大約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類,但在聚類過程中需要保證分箱的有序性,第一個分箱中所有觀測值都要小于第二個分箱中的觀測值,第二個分箱中所有觀測值都要小于第三個分箱中的觀測值,以此類推。

實現(xiàn)步驟:

  • Step 0:
    對預(yù)處理后的數(shù)據(jù)進(jìn)行歸一化處理。
  • Step 1:
    將歸一化處理過的數(shù)據(jù),應(yīng)用k-means聚類算法,劃分為多個區(qū)間:
    采用等距法設(shè)定k-means聚類算法的初始中心,得到聚類中心。
  • Step 2:
    在得到聚類中心后將相鄰的聚類中心的中點作為分類的劃分點,將各個對象加入到距離最近的類中,從而將數(shù)據(jù)劃分為多個區(qū)間。
  • Step 3:
    重新計算每個聚類中心,然后重新劃分?jǐn)?shù)據(jù),直到每個聚類中心不再變化,得到最終的聚類結(jié)果。

代碼:

from sklearn.cluster import KMeans kmodel=KMeans(n_clusters=k) #k為聚成幾類 kmodel.fit(data.reshape(len(data),1))) #訓(xùn)練模型 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函數(shù)

3.1.5二值化(Binarization)

定義:二值化可以將數(shù)值型(numerical)的特征進(jìn)行閥值化得到boolean型數(shù)據(jù)。這對于下游的概率估計來說可能很有用(比如:數(shù)據(jù)分布為Bernoulli分布時)。

公式:定量特征二值化的核心在于設(shè)定一個閾值,大于閾值的賦值為1,小于等于閾值的賦值為0。

代碼:

from sklearn.preprocessing import Binarizer # Binarizer函數(shù)也可以設(shè)定一個閾值,結(jié)果數(shù)據(jù)值大于閾值的為1,小于閾值的為0 binarizer = Binarizer(threshold=0.0).fit(X_train) binarizer.transform(X_train)

3.2有監(jiān)督分箱法

3.2.1卡方分箱法

定義:自底向上的(即基于合并的)數(shù)據(jù)離散化方法。它依賴于卡方檢驗:具有最小卡方值的相鄰區(qū)間合并在一起,直到滿足確定的停止準(zhǔn)則。

基本思想:對于精確的離散化,相對類頻率在一個區(qū)間內(nèi)應(yīng)當(dāng)完全一致。因此,如果兩個相鄰的區(qū)間具有非常類似的類分布,則這兩個區(qū)間可以合并,否則,它們應(yīng)當(dāng)保持分開。而低卡方值表明它們具有相似的類分布。

實現(xiàn)步驟:

  • Step 0:
    預(yù)先定義一個卡方的閾值。
  • Step 1:
    初始化。
    根據(jù)要離散的屬性對實例進(jìn)行排序,每個實例屬于一個區(qū)間。
  • Step 2:
    合并區(qū)間。
    • 計算每一對相鄰區(qū)間的卡方值。
    • 將卡方值最小的一對區(qū)間合并。

Aij:第i區(qū)間第j類的實例的數(shù)量。 Eij:Aij的期望頻率(=(Ni*Cj)/N),N是總樣本數(shù),Ni是第i組的樣本數(shù),Cj是第j類樣本在全體中的比例

閾值的意義:

類別和屬性獨立時,有90%的可能性,計算得到的卡方值會小于4.6。大于閾值4.6的卡方值就說明屬性和類不是相互獨立的,不能合并。如果閾值選的大,區(qū)間合并就會進(jìn)行很多次,離散后的區(qū)間數(shù)量少、區(qū)間大。

注意:

  • ChiMerge算法推薦使用0.90、0.95、0.99置信度,最大區(qū)間數(shù)取10到15之間。
  • 也可以不考慮卡方閾值,此時可以考慮最小區(qū)間數(shù)或者最大區(qū)間數(shù)。
    指定區(qū)間數(shù)量的上限和下限,最多幾個區(qū)間,最少幾個區(qū)間。
  • 對于類別型變量,需要分箱時需要按照某種方式進(jìn)行排序。

代碼:

可以借鑒以下代碼 https://github.com/tatsumiw/ChiMerge/blob/master/ChiMerge.py

3.2.2最小熵法分箱

定義:需要使總熵值達(dá)到最小,也就是使分箱能夠最大限度地區(qū)分因變量的各類別。也就是統(tǒng)計學(xué)中所說的類內(nèi)相似性越小越好。類間相似性越大越好。

熵是信息論中數(shù)據(jù)無序程度的度量標(biāo)準(zhǔn),提出信息熵的基本目的是找出某種符號系統(tǒng)的信息量和冗余度之間的關(guān)系,以便能用最小的成本和消耗來實現(xiàn)最高效率的數(shù)據(jù)存儲、管理和傳遞。

數(shù)據(jù)集的熵越低,說明數(shù)據(jù)之間的差異越小,最小熵劃分就是為了使每箱中的數(shù)據(jù)具有最好的相似性。給定箱的個數(shù),如果考慮所有可能的分箱情況,最小熵方法得到的箱應(yīng)該是具有最小熵的分箱。

代碼:暫時沒有,后面補。

第四節(jié):統(tǒng)計變換

作用:數(shù)據(jù)分布的傾斜有很多負(fù)面的影響。我們可以使用特征工程技巧,利用統(tǒng)計或數(shù)學(xué)變換來減輕數(shù)據(jù)分布傾斜的影響。使原本密集的區(qū)間的值盡可能的分散,原本分散的區(qū)間的值盡量的聚合。

這些變換函數(shù)都屬于冪變換函數(shù)簇,通常用來創(chuàng)建單調(diào)的數(shù)據(jù)變換。它們的主要作用在于它能幫助穩(wěn)定方差,始終保持分布接近于正態(tài)分布并使得數(shù)據(jù)與分布的平均值無關(guān)。

4.1.Log變換

定義:Log變換通常用來創(chuàng)建單調(diào)的數(shù)據(jù)變換。它的主要作用在于幫助穩(wěn)定方差,始終保持分布接近于正態(tài)分布并使得數(shù)據(jù)與分布的平均值無關(guān)。

Log 變換屬于冪變換函數(shù)簇。公式如下:

自然對數(shù) b=e,e=2.71828。通常在十進(jìn)制系統(tǒng)中使用的b=10 作為底數(shù)。

當(dāng)應(yīng)用于傾斜分布時 Log 變換是很有用的,因為Log變換傾向于拉伸那些落在較低的幅度范圍內(nèi)自變量值的范圍,傾向于壓縮或減少更高幅度范圍內(nèi)的自變量值的范圍。從而使得傾斜分布盡可能的接近正態(tài)分布。

作用:

針對一些數(shù)值連續(xù)型特征的方差不穩(wěn)定,特征值重尾分布我們需要采用Log化來調(diào)整整個數(shù)據(jù)分布的方差,屬于方差穩(wěn)定型數(shù)據(jù)轉(zhuǎn)換。比如在詞頻統(tǒng)計中,有些介詞的出現(xiàn)數(shù)量遠(yuǎn)遠(yuǎn)高于其他詞,這種詞頻分布的特征就會出現(xiàn)有些詞頻特征值極不協(xié)調(diào)的狀況,拉大了整個數(shù)據(jù)分布的方差。這個時候,可以考慮Log化。尤其在問本分析領(lǐng)域,時間序列分析領(lǐng)域,Log化非常常見, 其目標(biāo)是讓方差穩(wěn)定,把目標(biāo)關(guān)注在其波動之上。

效果如下:

代碼:

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 變換是另一種流行的冪變換函數(shù)簇中的一個函數(shù)。該函數(shù)有一個前提條件,即數(shù)值型數(shù)值必須先變換為正數(shù)(與 log 變換所要求的一樣)。如果數(shù)值是負(fù)的,可以利用常數(shù)對數(shù)值進(jìn)行偏移。

公式如下:

生成的變換后的輸出y是輸入 x 和變換參數(shù)的函數(shù);當(dāng) λ=0 時,該變換就是自然對數(shù) log 變換。λ 的最佳取值通常由最大似然或最大對數(shù)似然確定。

作用:

Box-Cox變換是Box和Cox在1964年提出的一種廣義冪變換方法,是統(tǒng)計建模中常用的一種數(shù)據(jù)變換,用于連續(xù)型變量不滿足正態(tài)分布的情況。Box-Cox變換之后,在一定程度上可以減小不可觀測的誤差和預(yù)測變量的相關(guān)性。Box-Cox變換的主要特點是引入一個參數(shù),通過數(shù)據(jù)本身估計該參數(shù)進(jìn)而確定應(yīng)采取的數(shù)據(jù)變換形式,Box-Cox變換可以明顯地改善數(shù)據(jù)的正態(tài)性、對稱性和方差相等性,對許多實際數(shù)據(jù)都是行之有效的方法。

效果如下:

代碼:

import scipy.stats as spstats # 從數(shù)據(jù)分布中移除非零值 income = np.array(df['Income']) income_clean = income[~np.isnan(income)] # 計算最佳λ值 l, opt_lambda = spstats.boxcox(income_clean) print('Optimal lambda value:', opt_lambda) # 進(jìn)行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...]]

第五節(jié):類別特征編碼

5.1標(biāo)簽編碼(LabelEncode)

定義:LabelEncoder是對不連續(xù)的數(shù)字或者文本進(jìn)行編號,編碼值介于0和n_classes-1之間的標(biāo)簽。

優(yōu)點:相對于OneHot編碼,LabelEncoder編碼占用內(nèi)存空間小,并且支持文本特征編碼。

缺點:它隱含了一個假設(shè):不同的類別之間,存在一種順序關(guān)系。在具體的代碼實現(xiàn)里,LabelEncoder會對定性特征列中的所有獨特數(shù)據(jù)進(jìn)行一次排序,從而得出從原始輸入到整數(shù)的映射。應(yīng)用較少,一般在樹模型中可以使用。

代碼:

from sklearn.preprocessing import LabelEncoder le = LabelEncoder() le.fit(["paris", "paris", "tokyo", "amsterdam"]) print('特征:{}'.format(list(le.classes_))) # 輸出 特征:['amsterdam', 'paris', 'tokyo'] print('轉(zhuǎn)換標(biāo)簽值:{}'.format(le.transform(["tokyo", "tokyo", "paris"]))) # 輸出 轉(zhuǎn)換標(biāo)簽值:array([2, 2, 1]...) print('特征標(biāo)簽值反轉(zhuǎn):{}'.format(list(le.inverse_transform([2, 2, 1])))) # 輸出 特征標(biāo)簽值反轉(zhuǎn):['tokyo', 'tokyo', 'paris']

5.2.獨熱編碼(OneHotEncode)

定義:OneHotEncoder用于將表示分類的數(shù)據(jù)擴維。最簡單的理解就是與位圖類似,設(shè)置一個個數(shù)與類型數(shù)量相同的全0數(shù)組,每一位對應(yīng)一個類型,如該位為1,該數(shù)字表示該類型。OneHotEncode只能對數(shù)值型變量二值化,無法直接對字符串型的類別變量編碼。

為什么要使用獨熱編碼?

獨熱編碼是因為大部分算法是基于向量空間中的度量來進(jìn)行計算的,為了使非偏序關(guān)系的變量取值不具有偏序性,并且到圓點是等距的。使用one-hot編碼,將離散特征的取值擴展到了歐式空間,離散特征的某個取值就對應(yīng)歐式空間的某個點。將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。

為什么特征向量要映射到歐式空間?

將離散特征通過one-hot編碼映射到歐式空間,是因為,在回歸、分類、聚類等機器學(xué)習(xí)算法中,特征之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算。

優(yōu)點:獨熱編碼解決了分類器不好處理屬性數(shù)據(jù)的問題,在一定程度上也起到了擴充特征的作用。它的值只有0和1,不同的類型存儲在垂直的空間。

缺點:當(dāng)類別的數(shù)量很多時,特征空間會變得非常大。在這種情況下,一般可以用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來學(xué)習(xí)編碼 enc.transform([[0, 1, 3]]).toarray() # 進(jìn)行編碼 # 輸出:array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])

5.3標(biāo)簽二值化(LabelBinarizer)

定義:功能與OneHotEncoder一樣,但是OneHotEncode只能對數(shù)值型變量二值化,無法直接對字符串型的類別變量編碼,而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多標(biāo)簽二值化(MultiLabelBinarizer)

定義:用于label encoding,生成一個(n_examples * n_classes)大小的0~1矩陣,每個樣本可能對應(yīng)多個label。

適用情形:

  • 每個特征中有多個文本單詞。
  • 用戶興趣特征(如特征值:”健身 電影 音樂”)適合使用多標(biāo)簽二值化,因為每個用戶可以同時存在多種興趣愛好。
  • 多分類類別值編碼的情況。
  • 電影分類標(biāo)簽中(如:[action, horror]和[romance, commedy])需要先進(jìn)行多標(biāo)簽二值化,然后使用二值化后的值作為訓(xùn)練數(shù)據(jù)的標(biāo)簽值。

代碼:

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平均數(shù)編碼(Mean Encoding)

定義:平均數(shù)編碼(mean encoding)的編碼方法,在貝葉斯的架構(gòu)下,利用所要預(yù)測的因變量(target variable),有監(jiān)督地確定最適合這個定性特征的編碼方式。

適用情形:平均數(shù)編碼(mean encoding),針對高基數(shù) 類別特征的有監(jiān)督編碼。當(dāng)一個類別特征列包括了極多不同類別時(如家庭地址,動輒上萬)時,可以采用。

為什么要用平均數(shù)編碼?

  • 如果某一個特征是定性的(categorical),而這個特征的可能值非常多(高基數(shù)),那么平均數(shù)編碼(mean encoding)是一種高效的編碼方式。在實際應(yīng)用中,這類特征工程能極大提升模型的性能。
  • 因為定性特征表示某個數(shù)據(jù)屬于一個特定的類別,所以在數(shù)值上,定性特征值通常是從0到n的離散整數(shù)。例子:花瓣的顏色(紅、黃、藍(lán))、性別(男、女)、地址、某一列特征是否存在缺失值(這種NA 指示列常常會提供有效的額外信息)。
  • 一般情況下,針對定性特征,我們只需要使用sklearn的OneHotEncoder或LabelEncoder進(jìn)行編碼,這類簡單的預(yù)處理能夠滿足大多數(shù)數(shù)據(jù)挖掘算法的需求。定性特征的基數(shù)(cardinality)指的是這個定性特征所有可能的不同值的數(shù)量。在高基數(shù)(high cardinality)的定性特征面前,這些數(shù)據(jù)預(yù)處理的方法往往得不到令人滿意的結(jié)果。

優(yōu)點:

和獨熱編碼相比,節(jié)省內(nèi)存、減少算法計算時間、有效增強模型表現(xiàn)。

代碼:

參考:https://zhuanlan.zhihu.com/p/26308272

5.5參考資料

  • 機器學(xué)習(xí)小組公眾號《數(shù)據(jù)科學(xué)家聯(lián)盟》
  • https://blog.csdn.net/jliang3/article/details/99416330
  • https://zhuanlan.zhihu.com/p/26308272

十分感謝上述文章作者的分享,本人受益良多。


期待你我的共同進(jìn)步!

若喜歡小編的分享,歡迎關(guān)注小編的公眾號哦,小編會一直認(rèn)真學(xué)習(xí),認(rèn)真分享筆記的~~~

總結(jié)

以上是生活随笔為你收集整理的负数如何归一化处理_机器学习之数据预处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。