多分類問(wèn)題的交叉熵計(jì)算

多分類問(wèn)題的交叉熵

??在多分類問(wèn)題中,損失函數(shù)(loss function)為交叉熵(cross entropy)損失函數(shù)粥帚。對(duì)于樣本點(diǎn)(x,y)來(lái)說(shuō),y是真實(shí)的標(biāo)簽,在多分類問(wèn)題中岖赋,其取值只可能為標(biāo)簽集合labels. 我們假設(shè)有K個(gè)標(biāo)簽值,且第i個(gè)樣本預(yù)測(cè)為第k個(gè)標(biāo)簽值的概率為p_{i,k}瓮孙, 即p_{i,k} = \operatorname{Pr}(t_{i,k} = 1), 一共有N個(gè)樣本唐断,則該數(shù)據(jù)集的損失函數(shù)為

L_{\log}(Y, P) = -\log \operatorname{Pr}(Y|P) = - \frac{1}{N} \sum_{i=0}^{N-1} \sum_{k=0}^{K-1} y_{i,k} \log p_{i,k}

一個(gè)例子

??在Python的sklearn模塊中,提供了一個(gè)函數(shù)log_loss()來(lái)計(jì)算多分類問(wèn)題的交叉熵杭抠。再根據(jù)我們?cè)诓┛?a target="_blank" rel="nofollow">Sklearn中二分類問(wèn)題的交叉熵計(jì)算對(duì)log_loss()函數(shù)的源代碼的分析脸甘,我們不難利用上面的計(jì)算公式用自己的方法來(lái)實(shí)現(xiàn)交叉熵的求值。
??我們給出的例子如下:

y_true = ['1', '4', '5'] # 樣本的真實(shí)標(biāo)簽
y_pred = [[0.1, 0.6, 0.3, 0, 0, 0, 0, 0, 0, 0],
          [0, 0.3, 0.2, 0, 0.5, 0, 0, 0, 0, 0],
          [0.6, 0.3, 0, 0, 0, 0.1, 0, 0, 0, 0]
         ]               # 樣本的預(yù)測(cè)概率
labels = ['0','1','2','3','4','5','6','7','8','9'] # 所有標(biāo)簽

在這個(gè)例子中偏灿,一個(gè)有3個(gè)樣本丹诀,標(biāo)簽為1,4,5,一共是10個(gè)標(biāo)簽翁垂,y_pred是對(duì)每個(gè)樣本的所有標(biāo)簽的預(yù)測(cè)值铆遭。
??接下來(lái)我們將會(huì)用log_loss()函數(shù)和自己的方法分別來(lái)實(shí)現(xiàn)這個(gè)例子的交叉熵的計(jì)算,完整的Python代碼如下:

from sklearn.metrics import log_loss
from sklearn.preprocessing import LabelBinarizer
from math import log

y_true = ['1', '4', '5'] # 樣本的真實(shí)標(biāo)簽
y_pred = [[0.1, 0.6, 0.3, 0, 0, 0, 0, 0, 0, 0],
          [0, 0.3, 0.2, 0, 0.5, 0, 0, 0, 0, 0],
          [0.6, 0.3, 0, 0, 0, 0.1, 0, 0, 0, 0]
         ]               # 樣本的預(yù)測(cè)概率
labels = ['0','1','2','3','4','5','6','7','8','9'] # 所有標(biāo)簽


# 利用sklearn中的log_loss()函數(shù)計(jì)算交叉熵
sk_log_loss = log_loss(y_true, y_pred, labels=labels)
print("Loss by sklearn is:%s." %sk_log_loss)

# 利用公式實(shí)現(xiàn)交叉熵
# 交叉熵的計(jì)算公式網(wǎng)址為:
# http://scikit-learn.org/stable/modules/model_evaluation.html#log-loss

# 對(duì)樣本的真實(shí)標(biāo)簽進(jìn)行標(biāo)簽二值化
lb = LabelBinarizer()
lb.fit(labels)
transformed_labels = lb.transform(y_true)
# print(transformed_labels)

N = len(y_true)  # 樣本個(gè)數(shù)
K = len(labels)  # 標(biāo)簽個(gè)數(shù)

eps = 1e-15      # 預(yù)測(cè)概率的控制值
Loss = 0         # 損失值初始化

for i in range(N):
    for k in range(K):
        # 控制預(yù)測(cè)概率在[eps, 1-eps]內(nèi)沿猜,避免求對(duì)數(shù)時(shí)出現(xiàn)問(wèn)題
        if y_pred[i][k] < eps:
            y_pred[i][k] = eps
        if y_pred[i][k] > 1-eps:
            y_pred[i][k] = 1-eps
        # 多分類問(wèn)題的交叉熵計(jì)算公式
        Loss -= transformed_labels[i][k]*log(y_pred[i][k])

Loss /= N
print("Loss by equation is:%s." % Loss)

輸出的結(jié)果如下:

Loss by sklearn is:1.16885263244.
Loss by equation is:1.16885263244.

這說(shuō)明我們能夠用公式來(lái)自己實(shí)現(xiàn)交叉熵的計(jì)算了枚荣,是不是很神奇呢?
??多分類問(wèn)題的交叉熵計(jì)算是建立在二分類問(wèn)題的交叉熵計(jì)算的基礎(chǔ)上邢疙,有了我們對(duì)log_loss()函數(shù)的源代碼的研究棍弄,那就用自己的方法來(lái)實(shí)現(xiàn)多(二)分類問(wèn)題的交叉熵計(jì)算就不是問(wèn)題了~~
??本次分享到此結(jié)束望薄,歡迎大家交流~~

注意:本人現(xiàn)已開(kāi)通兩個(gè)微信公眾號(hào): 因?yàn)镻ython(微信號(hào)為:python_math)以及輕松學(xué)會(huì)Python爬蟲(chóng)(微信號(hào)為:easy_web_scrape), 歡迎大家關(guān)注哦~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呼畸,一起剝皮案震驚了整個(gè)濱河市痕支,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛮原,老刑警劉巖卧须,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異儒陨,居然都是意外死亡花嘶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蹦漠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椭员,“玉大人,你說(shuō)我怎么就攤上這事笛园“鳎” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵研铆,是天一觀的道長(zhǎng)埋同。 經(jīng)常有香客問(wèn)我,道長(zhǎng)棵红,這世上最難降的妖魔是什么凶赁? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮逆甜,結(jié)果婚禮上虱肄,老公的妹妹穿的比我還像新娘。我一直安慰自己忆绰,他們只是感情好浩峡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著错敢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缕粹。 梳的紋絲不亂的頭發(fā)上稚茅,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音平斩,去河邊找鬼亚享。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绘面,可吹牛的內(nèi)容都是我干的欺税。 我是一名探鬼主播侈沪,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晚凿!你這毒婦竟也來(lái)了亭罪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歼秽,失蹤者是張志新(化名)和其女友劉穎应役,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體燥筷,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箩祥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肆氓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袍祖。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谢揪,靈堂內(nèi)的尸體忽然破棺而出盲泛,到底是詐尸還是另有隱情,我是刑警寧澤键耕,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布寺滚,位于F島的核電站,受9級(jí)特大地震影響屈雄,放射性物質(zhì)發(fā)生泄漏村视。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一酒奶、第九天 我趴在偏房一處隱蔽的房頂上張望蚁孔。 院中可真熱鬧,春花似錦惋嚎、人聲如沸杠氢。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鼻百。三九已至,卻和暖如春摆尝,著一層夾襖步出監(jiān)牢的瞬間温艇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工堕汞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勺爱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓讯检,卻偏偏與公主長(zhǎng)得像琐鲁,于是被迫代替她去往敵國(guó)和親卫旱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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