機器學(xué)習(xí)中的特征工程(四)---- 特征離散化處理方法

簡介

特征離散化指的是將連續(xù)特征劃分離散的過程:將原始定量特征的一個區(qū)間一一映射到單一的值壮莹。離散化過程也被表述成分箱(Binning)的過程。特征離散化常應(yīng)用于邏輯回歸和金融領(lǐng)域的評分卡中腾供,同時在規(guī)則提取,特征分類中也有對應(yīng)的應(yīng)用價值。本文主要介紹幾種常見的分箱方法户盯,包括等寬分箱询枚、等頻分箱违帆、信息熵分箱、基于決策樹分箱金蜀、卡方分箱等刷后。

分箱原理介紹

數(shù)據(jù)分箱是一種數(shù)據(jù)預(yù)處理技術(shù),用于減少次要觀察誤差的影響渊抄,是一種將多個連續(xù)值分為相對較少的若干分組的方法尝胆。下面舉個例子來具體說明一下,假設(shè)我們有下面一組數(shù)據(jù)护桦,表示花瓣的寬度含衔,分布如下:
花瓣寬度分布

可以看到花瓣寬度范圍區(qū)間是0.1~2.5,看起來劃分的有點細了,有的時候我們不需要那么精細贪染,比如我們希望將花瓣寬度劃分到(‘很窄’缓呛,‘窄’、‘正澈枷叮’哟绊、‘寬’、‘很寬’)這5個范圍里寺渗,那么我們可以將花瓣寬度重新劃分為5個區(qū)間匿情,將落在對應(yīng)區(qū)間的花瓣寬度映射到之前指定的5個范圍內(nèi),如下如所示信殊。
分箱
可以看到在分箱之后炬称,數(shù)據(jù)被規(guī)約和簡化,有利于理解和解釋涡拘×崆總來說特征離散化,即 分箱之后會帶來如下優(yōu)勢:
  • 有助于模型部署和應(yīng)用鳄乏,加快模型迭代
  • 增強模型魯棒性
  • 增加非線性表達能力:連續(xù)特征不同區(qū)間對模型貢獻或者重要程度不一樣時跷车,分箱后不同的權(quán)重能直接體現(xiàn)這種差異,離散化后的特征再進行特征 交叉衍生能力會進一步加強橱野。
  • 提升模型的泛化能力
  • 擴展數(shù)據(jù)在不同各類型算法中的應(yīng)用范圍

當然特征離散化也有其缺點朽缴,總結(jié)如下:

  • 分箱操作必定會導(dǎo)致一定程度的信息損失
  • 增加流程:建模過程中加入了額外的的離散化步驟
  • 影響模型穩(wěn)定性: 當一個特征值處于分箱點的邊緣時,此時微小的偏差會造成該特征值的歸屬從一箱躍遷到另外一箱水援,影響模型的穩(wěn)定性密强。

特征離散化(分箱)可以從不同的角度來進行劃分。當分箱方法使用了目標y的信息蜗元,那么該分箱方法就屬于有監(jiān)督的分箱方法或渤,反之為無監(jiān)督的分箱方法。
這里選擇sklearn中自帶的乳腺癌數(shù)據(jù)集奕扣,下文提及的分箱方法大多是基于此數(shù)據(jù)集薪鹦,主要是取其中的‘mean radius’字段,如下:

import seaborn as sns
from sklearn.datasets import load_breast_cancer

bc = load_breast_cancer()
df = pd.DataFrame.from_records(data=bc.data, columns=bc.feature_names)
df['target'] = bc.target
sns.distplot(df['mean radius'], kde=False)
原始特征分布

等寬分箱(Equal-Width Binning)

等寬分箱指的是每個分隔點或者劃分點的距離一樣惯豆,即等寬池磁。實踐中一般指定分隔的箱數(shù),等分計算后得到每個分隔點楷兽。例如將數(shù)據(jù)序列分為n份框仔,則 分隔點的寬度計算公式為:
w = \frac {max - min} {n}
這樣就將原始數(shù)據(jù)劃分成了n個等寬的子區(qū)間,一般情況下拄养,分箱后每個箱內(nèi)的樣本數(shù)量是不一致的离斩。使用pandas中的cut函數(shù)來實現(xiàn)等寬分箱银舱,代碼如下:

value, cutoff = pd.cut(df['mean radius'], bins=4, retbins=True, precision=2)
cutoff
分隔點

可以輕易計算得出任意兩個相鄰分隔點之間的距離為5.30。按照上述分隔點對數(shù)據(jù)進行劃分后跛梗,數(shù)據(jù)的分布如下:

df1 = value.to_frame()
df1.columns = ['bins']
sns.countplot(df1['bins'])
特征分箱后數(shù)據(jù)分布

等寬分箱計算簡單寻馏,但是當數(shù)值方差較大時,即數(shù)據(jù)離散程度很大核偿,那么很可能出現(xiàn)沒有任何數(shù)據(jù)的分箱诚欠,這個問題可以通過自適應(yīng)數(shù)據(jù)分布的分箱方法--等頻分箱來避免

等頻分箱(Equal-Frequency Binning)

顧名思義,等頻分箱理論上分隔后的每個箱內(nèi)得到數(shù)據(jù)量大小一致漾岳,但是當某個值出現(xiàn)次數(shù)較多時轰绵,會出現(xiàn)等分邊界是同一個值,導(dǎo)致同一數(shù)值分到不同的箱內(nèi)尼荆,這是不正確的左腔。具體的實現(xiàn)可以去除分界處的重復(fù)值,但這也導(dǎo)致每箱的數(shù)量不一致捅儒。如下代碼:

s1 = pd.Series([1,2,3,4,5,6])
value, cutoff = pd.qcut(s1, 3, retbins=True)
sns.countplot(value)
等頻分箱

每個區(qū)間分別是2個數(shù)液样,這沒有問題,但是如果某個數(shù)字出現(xiàn)的次數(shù)較多巧还,則可能出現(xiàn)下面的情況:

s1 = pd.Series([1,2,3,4,5,6,6,6,6])
value, cutoff = pd.qcut(s1, 3, duplicates='drop', retbins=True)
sns.countplot(value)
等頻分箱合并

本來是要分成3個箱子的鞭莽,但是由于出現(xiàn)同一個數(shù)值被分到了不同的箱子里,因此被合并了麸祷,所以最后只有2個箱子澎怒。
同樣,我們對乳腺癌數(shù)據(jù)進行等頻分箱阶牍,該數(shù)據(jù)分布正常丹拯,等頻分箱后每箱數(shù)量基本一致。

value, cutoff = pd.qcut(df['mean radius'], 4, duplicates='drop', retbins=True)
sns.countplot(value)
等頻分箱

上述的等寬和等頻分箱容易出現(xiàn)的問題是每箱中信息量變化不大荸恕。例如,等寬分箱不太適合分布不均勻的數(shù)據(jù)集死相、離群值融求;等頻方法不太適合特定的值占比過多的數(shù)據(jù)集,如長尾分布算撮。

信息熵分箱

上面介紹的分箱方法對建模的優(yōu)化有限生宛。如果分箱后箱內(nèi)樣本對y的區(qū)分度好,那么這是一個好的分箱肮柜。通過信息論理論陷舅,我們可知信息熵衡量了這種區(qū)分能力。當特征按照某個分隔點劃分為上下兩部分后能達到最大的信息增益审洞,那么這就是一個好的分隔點莱睁。由上可知待讳,信息熵分箱是有監(jiān)督的分箱方法。其實決策樹的節(jié)點分裂原理也是基于信息熵仰剿。
首先我們需要明確信息熵和信息增益的計算方式创淡,分別如下:
Entropy(y) = - \sum_{i=1}^m p_i log_2{p_i} \\ Gain(x) = Entropy(y) - Info_{split}(x)
在二分類問題中,m=2南吮。
信息增益的物理含義表達為:x的分隔帶來的信息對y的不確定性帶來的增益琳彩。
對于二值化的單點分隔,如果我們找到一個分隔點將數(shù)據(jù)一分為二部凑,分成P_1P_2兩部分露乏,那么劃分后的信息熵的計算方式為:
Info_{split}(x) = P1_{ratio}Entropy(x_{p1}) + P2_{ratio}Entropy(x_{p2})
下面以一個實例來介紹一下信息熵分箱的計算過程,假如我們有以下數(shù)據(jù)涂邀,我們以特征'x=3'來作為特征x的分隔點瘟仿,則其帶來的信息增益為0.420,如下:

data = [[1,0],[2,1],[3,0],[4,1],[5,1]]
df = pd.DataFrame(data, columns=['x','y'])
df

原始數(shù)據(jù)
接下來我們來計算信息增益必孤,先計算分隔前的信息熵猾骡,如下:
Entroy(y) = -\lbrace \frac {2}{5} * log_2 \frac {2}{5} + \frac {3}{5} * log_2 \frac {3}{5} \rbrace = 0.971
接下來計算劃分后的信息熵:
Info_{split}(x) = P_1Entropy(x < 3) + P_2Entropy(x \ge 3) \\ P_1Entropy(x < 3) = \frac {3}{5} * -\lbrace \frac {2}{3} * log_2 \frac {2}{3} + \frac {1}{3} * log_2 \frac {1}{3} \rbrace = 0.551\\ P_2Entropy(x \ge 3) = \frac {2}{5} * -\lbrace \frac {2}{2} * log_2 \frac {2}{2} + \frac {0}{2} * log_2 \frac {0}{2} \rbrace = 0
故信息增益為:
Gain(x) = 0.971 - 0.551 = 0.420
類似的可以計算其他分隔點的信息增益,最終選取信息增益最大時對應(yīng)的分隔點敷搪。同時也可以看出兴想,當分箱后,某個箱中的標簽y的類別(0或者1)的比例相等時赡勘,其熵值最大嫂便,表明此特征劃分幾乎沒有區(qū)分度。而當某個箱中的數(shù)據(jù)的標簽y為單個類別時闸与,那么該箱的熵值達到最小的0毙替,即純度最純,最具區(qū)分度践樱。從結(jié)果上來看厂画,最大信息增益對應(yīng)分箱后的總熵值最小。

決策樹分箱

其實上一節(jié)中已經(jīng)說到拷邢,由于決策樹的結(jié)點選擇和劃分也是根據(jù)信息熵來計算的袱院,因此我們其實可以利用決策樹算法來進行特征選擇,具體做法如下:
還是以乳腺癌數(shù)據(jù)為例瞭稼,首先取其中‘mean radius’字段忽洛,和標簽字段‘target’來擬合一棵決策樹,代碼如下:

from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier(criterion='entropy', max_depth=3) # 樹最大深度為3
dt.fit(df['mean radius'].values.reshape(-1, 1), df['target'])

接著我們?nèi)〕鲞@課決策樹的所有葉節(jié)點的分割點的閾值环肘,如下:

qts = dt.tree_.threshold[np.where(dt.tree_.children_left > -1)]
qts = np.sort(qts)
res = [np.round(x, 3) for x in qts.tolist()]
res
決策樹分割點閾值

注意這里只給出了6個點欲虚,但是相當于分了7個箱子,分別設(shè)為a-g,我們可以將劃分后的效果繪制出來:

l = df['mean radius'].values.tolist()

r = []
for i in l:
    if i < res[0]:
        r.append('a')
    elif i >= res[-1]:
        r.append('g')
    else:
        for j in range(0, 5):
            if i > res[j] and i <= res[j+1]:
                r.append(chr(98+j))
                break
ax = sns.countplot(r)
ax
劃分后的數(shù)據(jù)分布

卡方分箱

在了解卡方分箱之前悔雹,我們需要先了解幾個關(guān)鍵概念复哆,比如卡方分布欣喧,卡方檢驗等。
卡方分布是概率統(tǒng)計常見的一種概率分布寂恬,是卡方檢驗的基礎(chǔ)续誉。
卡方分布定義為:若n個獨立的隨機變量Z_1, Z_2, ...,Z_k滿足標準正態(tài)分布N(0,1),則n個隨機變量的平方和X=\sum_{i=0}^k Z_i^2為服從自由度為k的卡方分布初肉,記為X \sim \chi^2酷鸦。參數(shù)n稱為自由度(樣本中獨立或能自由變化的自變量的個數(shù)),不同的自由度是不同的分布牙咏。例如臼隔,一個標準正態(tài)分布的平方就是自由度為1的卡方分布⊥卡方分布的概率密度函數(shù)如下:

卡方分布
卡方檢驗 :卡方檢驗屬于非參數(shù)假設(shè)檢驗的一種摔握,其本質(zhì)都是度量頻數(shù)之間的差異。其假設(shè)為:觀察頻數(shù)與期望頻數(shù)無差異或者兩組變量相互獨立不相關(guān)丁寄。
\chi^2 = \sum \frac {(O-E)^2}{E}

  • 卡方擬合 優(yōu)度檢驗:用于檢驗樣本是否來自于某一個分布氨淌,比如檢驗?zāi)硺颖臼欠駷檎龖B(tài)分布
  • 獨立性卡方檢驗,查看兩組類別變量分布是否有差異或者相關(guān)伊磺,以列聯(lián)表的形式比較盛正。以列聯(lián)表形式的卡方檢驗中,卡方統(tǒng)計量由上式給出屑埋。

其中豪筝,O表示觀察到的頻數(shù)(即實際出現(xiàn)的次數(shù)),E表示期望的頻數(shù)摘能。很明顯续崖,越小的卡方值,表明兩者相差越小团搞,反之严望,越大的卡方值表明兩者差異越大。下面以一個具體的例子來說明卡方值的計算方式逻恐。
下面是觀察到的兩組樣本分布:

觀察 bad good 合計
組一 25 50 75
組二 30 15 45
合計 55 65 120

接著是期望頻數(shù)的計算過程:

期望 bad good
組一 55*(75/120)=34.375 65*(75/120)=40.625
組二 55*(45/120)=20.625 65*(45/120)=24.375

最后是卡方值的計算過程:

a = [25, 50, 30, 15]
b = [34.375, 40.625, 20.625, 24.375]
r= []
for i in zip(a,b):
    r.append((i[0]-i[1])**2 / i[1])
np.sum(r)
卡方值

科學(xué)計算庫SciPy中包含了卡方檢驗的實現(xiàn)像吻,例子如下:

from scipy.stats import chi2_contingency
obs = np.array([[25,50],[30,15]])
chi2, p, dof, ex = chi2_contingency(obs, correction=False)
chi2
卡方值

其中dof代表自由度,ex代表期望概率梢莽。在得到卡方值以后查詢卡方分布表并比較p_value值,繼而做出接受或者拒絕原假設(shè)的判斷奸披。下段代碼是輸出卡方分布表的實現(xiàn):

from scipy.stats import chi2

def chi2_table(freedom=10, alpha=None):
    if alpha is None:
        alpha = [0.99, 0.95, 0.9, 0.5, 0.1, 0.05, 0.025, 0.01, 0.005]
    df = pd.DataFrame([chi2.isf(alpha, df=i) for i in range(1, freedom)])
    df.columns = alpha
    df.index = df.index + 1
    return df
chi2_table()
卡方分布表

由表可知昏名,當自由度為1、置信水平為0.05時阵面,對應(yīng)的卡方值為3.84轻局,而上述例子計算出來的卡方值為12.587洪鸭,大于3.841。說明在0.05的顯著性水平是可以拒絕原假設(shè)的仑扑,即觀察頻數(shù)與期望頻數(shù)有差異览爵。換個角度描述卡方檢驗的物理含義:當兩個分箱中,好壞(正負)分布是一致時镇饮,卡方為0蜓竹,相似是接近0,對應(yīng)到卡方分箱算法中储藐,應(yīng)該合并這兩個分箱俱济。

卡方分箱步驟

卡方分箱是自底向上的(即基于合并的)數(shù)據(jù)離散化方法。它依賴于卡方檢驗:具有最小卡方值的相鄰區(qū)間合并在一起,直到滿足確定的停止準則钙勃≈肼担基本思想: 對于精確的離散化,相對類頻率在一個區(qū)間內(nèi)應(yīng)當完全一致辖源。因此,如果兩個相鄰的區(qū)間具有非常類似的類分布蔚携,則這兩個區(qū)間可以合并;否則克饶,它們應(yīng)當保持分開酝蜒。而低卡方值表明它們具有相似的類分布。
卡方檢驗可以用來評估兩個分布的相似性彤路,因此可以將這個特性用到數(shù)據(jù)分箱的過程中秕硝。

理想的分箱是在同一個區(qū)間內(nèi)標簽的分布是相同的≈拮穑卡方分箱就是不斷的計算相鄰區(qū)間的卡方值(卡方值越小表示分布越相似)远豺,將分布相似的區(qū)間(卡方值最小的)進行合并,直到相鄰區(qū)間的分布不同坞嘀,達到一個理想的分箱結(jié)果躯护。下面用一個例子來解釋:
由上圖,第一輪中初始化是5個區(qū)間丽涩,分別計算相鄰區(qū)間的卡方值棺滞。找到1.2是最小的,合并2矢渊、3區(qū)間继准,為了方便,將合并后的記為第2區(qū)間矮男,因此得到4個區(qū)間移必。第二輪中,由于合并了區(qū)間毡鉴,影響該區(qū)間與前面的和后面的區(qū)間的卡方值崔泵,因此重新計算1和2,2和4的卡方值秒赤,由于4和5區(qū)間沒有影響,因此不需要重新計算憎瘸,這樣就得到了新的卡方值列表入篮,找到最小的取值2.5,因此該輪會合并2幌甘、4區(qū)間潮售,并重復(fù)這樣的步驟,一直到滿足終止條件含潘。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饲做,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遏弱,更是在濱河造成了極大的恐慌盆均,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漱逸,死亡現(xiàn)場離奇詭異泪姨,居然都是意外死亡,警方通過查閱死者的電腦和手機饰抒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門肮砾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袋坑,你說我怎么就攤上這事仗处。” “怎么了枣宫?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵婆誓,是天一觀的道長。 經(jīng)常有香客問我也颤,道長洋幻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任翅娶,我火速辦了婚禮文留,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竭沫。我一直安慰自己燥翅,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布蜕提。 她就那樣靜靜地躺著森书,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拄氯,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音它浅,去河邊找鬼译柏。 笑死,一個胖子當著我的面吹牛姐霍,可吹牛的內(nèi)容都是我干的鄙麦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼镊折,長吁一口氣:“原來是場噩夢啊……” “哼胯府!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恨胚,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤骂因,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赃泡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寒波,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年升熊,在試婚紗的時候發(fā)現(xiàn)自己被綠了俄烁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡级野,死狀恐怖页屠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蓖柔,我是刑警寧澤辰企,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站渊抽,受9級特大地震影響蟆豫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懒闷,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一十减、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愤估,春花似錦帮辟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春蔓榄,著一層夾襖步出監(jiān)牢的瞬間并炮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工甥郑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逃魄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓澜搅,卻偏偏與公主長得像伍俘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勉躺,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容