機(jī)器學(xué)習(xí)蝦扯淡之Logostic回歸
0x00 前言
大家好我是小蕉。上一次我們說(shuō)完了線性回歸。不知道小伙伴有沒(méi)有什么意見(jiàn)建議,是不是發(fā)現(xiàn)每個(gè)字都看得懂,但是全篇都不知道在說(shuō)啥?哈哈哈哈哈哈,那就對(duì)了。
這次我們來(lái)聊聊,有小伙伴說(shuō),那我如果我么想把結(jié)果分為兩撥,就這樣的,咋辦?
大蕉大筆一揮。啊這不是分好了嗎?
我敢說(shuō),現(xiàn)在百分之很多十(目測(cè)七八十)說(shuō)自己在做人工智能的,都只是用Logistic回歸在做分析。
“就你事多。我不會(huì)分。”
“想學(xué)啊你?我教你啊。”
0x01 Logistic是啥玩意
想法大概是這樣。把數(shù)據(jù)映射到Logistic函數(shù)上邊,大于0.5我們就認(rèn)為是類別y1 = 0,小于0.5我們認(rèn)為是類別y2 = 1。
- y ∈ {0 , 1}
這個(gè)函數(shù)長(zhǎng)啥樣?就長(zhǎng)下面這樣。
- π (x) = 1 / ( 1 + exp (-x))
所以我們?cè)谶@種情況下,觀察到各個(gè)樣本的概率長(zhǎng)下面這樣。
- P( Y = 1 | x ) = 1 / ( 1 + exp (-x))
- P( Y = 0 | x ) = 1 / ( 1 + exp (x))
所以比值比ODD 長(zhǎng)這樣
- odd = P( Y = 1 | x ) / P( Y = 0 | x ) = exp (x)
對(duì)數(shù)比值比剛剛好
- ln odd = x
你說(shuō)神不神奇!!當(dāng)然我們不僅僅只有一個(gè)參數(shù)是吧?所以對(duì)原始數(shù)據(jù)變成
- g(x) = θ.T * x + b
其中θ是一個(gè)N維的向量,跟每一個(gè)樣本X的維度保持一致這樣。
所以LR的映射函數(shù)做一下線性變換就變成這樣了。
- π (x) = 1 / ( 1 + exp (-g(x)))
到這里,我們已經(jīng)知道Logistic回歸是什么鳥(niǎo)了,其實(shí)就是把數(shù)據(jù)映射到Logistic函數(shù)上,根據(jù)概率來(lái)進(jìn)行分類。
0x02 極大似然估計(jì)
那我們要怎么得到損失函數(shù)loss呢?不要急跟大蕉一步一步來(lái)。
上面我們已經(jīng)看到了每個(gè)樣本的概率?,F(xiàn)在說(shuō)一下極大似然估計(jì)是什么東西。極大似然估計(jì),就是我們裝作這些個(gè)參數(shù)啊,我們老早就知道了,然后借此來(lái)估計(jì)現(xiàn)在這些樣本被觀察到的概率。你腦子wata啦?既然這些樣本都已經(jīng)發(fā)現(xiàn)了,所以實(shí)際概率肯定是***啊!!概率要越大越好越大越好,而又只是一個(gè)估計(jì)值,所以我們就叫它極大似然估計(jì)啦。
所以我們觀察到樣本的概率是
- P = (p ^ Y) * (( 1 - p) ^ ( 1 - Y ))
怎么容易一點(diǎn)去理解這行蜈蚣一樣的公式呢?把Y的值0跟1代進(jìn)去就行了,你就懂了,Y等于0的時(shí)候就是(1 - p ),y等于1時(shí)就是 p。就是這么簡(jiǎn)單。
下面是重點(diǎn)。敲黑板,劃重點(diǎn)!!!我就是卡在這里想了很多天,完全不知道損失函數(shù)怎么來(lái)的!
因?yàn)樗袠颖径际窍嗷オ?dú)立的,所以他們的聯(lián)合概率分布是他們的概率乘積。
- L(θ) = ∏ (p ^ yi) * ( (1 - p) ^ (1 - yi))
yi是每個(gè)樣本的實(shí)際Y值。我們這里要求***值嘛,那要變成損失函數(shù)咋變?我們知道這個(gè)值永遠(yuǎn)是 ( 0 , 1)的,所以直接加個(gè)負(fù)號(hào),本來(lái)求***就變成求最小了。
- ∴ loss = - L(θ)
當(dāng)然我們習(xí)慣這樣加,看起來(lái)比較高端,m是樣本的個(gè)數(shù)
- ∴ loss = - 1/m * L(θ)
無(wú)所謂,原理一樣的。
乘法是很消耗資源的,我們可以把它轉(zhuǎn)換成對(duì)數(shù),這樣所有的乘法都變成加法啦!!而且而且函數(shù)的性質(zhì)不變。所以最終的損失函數(shù)長(zhǎng)這樣。
- loss(θ) = - log L(θ)
下面開(kāi)始我們用Andrew NG大大的方式變換一下好了,僅僅是為了后面比較好算而已。
- P = p ^ (y + 1) / 2 * (1 - p) ^ - (y - 1) / 2
- Y ∈ {-1,1}
跟上面沒(méi)什么本質(zhì)的差別,只是把Y的值域變成-1跟1了。下面就是普通的公式變換。
0x03 損失函數(shù)咋來(lái)的
- l(θ) = - ∑ ln(p ^ (yi + 1) / 2 * (1 - p) ^ - (yi - 1) / 2)
進(jìn)行l(wèi)og變換,冪乘變成乘法。
- = - ∑ (yi + 1) / 2 * lnp - (yi - 1) / 2 * ln(1 - p) )
把p代進(jìn)去,也就是把把負(fù)號(hào)放到P里邊了。變成直接取倒數(shù)。就得到下面這個(gè)
- = ∑ (yi + 1) / 2 * ln(1 + exp (-g(xi)) - (yi - 1) / 2 * ln( 1 + exp (g(xi)))
觀察一下,就可以看出來(lái)。自己代進(jìn)去就知道啦。
- ∴ 當(dāng)yi = 1 時(shí),l(θ) = ∑ ln(1 + exp ( - g(xi))
當(dāng)yi = -1 時(shí),l(θ) = ∑ ln(1 + exp ( g(xi))
所以最終的損失函數(shù)長(zhǎng)這樣。
- l(θ) = ∑ ln(1 + exp ( - yi * g(xi))
好了,到這里我們的推導(dǎo)就結(jié)束了,接下來(lái)就按照梯度下降算法去求最小值就好啦。
0x04 怎么用呢
然后我們就可以用最終得到的參數(shù)進(jìn)行預(yù)測(cè),大于0就當(dāng)成類別Y1 ,即Y = 1,小于0當(dāng)成類別Y1,即Y = -1。當(dāng)然,這只能用于二分類。
那這玩意有什么用呢?應(yīng)用場(chǎng)景比比皆是。
用戶點(diǎn)擊還是不點(diǎn)擊?客戶是欺詐還是沒(méi)欺詐?客戶逾期還是不逾期?這個(gè)產(chǎn)品是推薦還是不推薦?
傳說(shuō)中的人工智能預(yù)測(cè)高端引擎就出來(lái)了,小伙伴自己試試看把。
0x05 結(jié)束語(yǔ)
今天就醬,掰~跪在地上求不掉粉。
【本文為51CTO專欄作者“大蕉”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)“一名叫大蕉的程序員”獲取授權(quán)】