python實(shí)現(xiàn)邏輯回歸

邏輯回歸是一種常見的分類算法败去,通常用來處理二分類問題放航。邏輯回歸名字中帶有回歸兩個(gè)字烈拒,卻用于處理分類問題厂僧,是因?yàn)檫壿嫽貧w利用了回歸的思想彤蔽,先利用回歸思想計(jì)算出一個(gè)預(yù)測值销凑,再將該預(yù)測值轉(zhuǎn)化為分為某一類別的概率文兢。利用回歸方法算出來的預(yù)測值的值域是從負(fù)無窮到正無窮的捺球,而概率P的值域是從0到1吕粗,那么如何將預(yù)測值轉(zhuǎn)化為一個(gè)概率值呢债蜜,這里就要利用到sigmoid函數(shù)了梨州,該函數(shù)的表達(dá)式為:


image.png

先來簡單看一下該函數(shù)的圖像

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(t):
    return 1. / (1. + np.exp(-t))
x_plot = np.linspace(-10., 10., 5000)
y_plot = sigmoid(x_plot)
plt.plot(x_plot, y_plot)
plt.show()
image.png

從圖中可以看出祖秒,sigmoid函數(shù)將(-10诞吱, 10)中的元素映射到了區(qū)間(0舟奠, 1)中,實(shí)際上房维,sigmoid函數(shù)能將(?∞沼瘫,+∞)的元素都映射到(0, 1)中咙俩。因此耿戚,想要利用邏輯回歸解決分類問題,我們只需要先利用回歸思想獲得一個(gè)處于(?∞阿趁,+∞)的預(yù)測值膜蛔,再利用sigmoid函數(shù)轉(zhuǎn)化為處于(0, 1)的概率脖阵,再根據(jù)概率值對(duì)樣本進(jìn)行分類皂股。在處理二分類問題時(shí),我們認(rèn)為當(dāng)sigmoid(t)的值大于0.5時(shí)独撇,將該樣本分類為1的概率大于0.5屑墨,因此將改樣本分類為1,當(dāng)sigmoid(t)的值小于0.5時(shí)纷铣,將該樣本分類為0卵史。sigmoid(t)可以看做是樣本 t 分類為1的概率。

利用sigmoid函數(shù)我們就將邏輯回歸的分類問題轉(zhuǎn)化為了回歸問題的求解搜立。依然是利用梯度下降法對(duì)損失函數(shù)求極小值以躯,數(shù)學(xué)推導(dǎo)過程在這里略去。直接上結(jié)論:
J(θ) = -(y*(ln(σ(Xθ))) + (1-y)(1-ln(σ(Xθ)))) / m
其中的 σ 代表sigmoid函數(shù),m代表樣本數(shù)量
▽J(θ) = (X.T(σ(Xθ) - y)) / m
其中X.T代表X矩陣的轉(zhuǎn)置

得到了損失函數(shù)J(θ)以及損失函數(shù)對(duì)θ的偏導(dǎo)數(shù)之后啄踊,就可以用梯度下降法來實(shí)現(xiàn)邏輯回歸了

使用的示例數(shù)據(jù)是sklearn中的鳶尾花數(shù)據(jù)集

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets

# 鳶尾花數(shù)據(jù)集有三種花忧设,因此舍棄分類為2的花,用來進(jìn)行二分類
iris = datasets.load_iris()
x = iris.data
y = iris.target
X = x[y<2, :]
y = y[y < 2]
# 進(jìn)行訓(xùn)練驗(yàn)證數(shù)據(jù)集分割
X = np.hstack((np.ones((X.shape[0],1)), X))
X_train, X_test, y_train, y_test = train_test_split(X, y)
initial_theta = np.zeros(X.shape[1])

定義sigmoid函數(shù)

def sigmoid(t):
    return 1. / (1.+np.exp(-t))

定義損失函數(shù):

def j(X, y, theta):
    return -(y.dot(np.log(sigmoid(X.dot(theta)))) + (1-y).dot(1-np.log(sigmoid(X.dot(theta))))) / len(y)

定義損失函數(shù)的梯度:

def dj(X, y, theta):
    return (X.T.dot(sigmoid(X.dot(theta)) - y)) / len(y)

梯度下降過程:

def gd(X, y, theta=initial_theta, eta=0.1, n_iters=1e4, epsilon=1e-8):
    cur_iters = 0
    theta = initial_theta

    while cur_iters < n_iters:
        next_theta = theta - eta*dj(X, y, theta)
        if abs(j(X, y, theta) - j(X, y, next_theta)) < epsilon:
            break
        else:
            theta = next_theta
            cur_iters += 1
    return theta

通過梯度下降過程颠通,我們就能找到一個(gè)最優(yōu)的theta向量

best_theta = gd(X_train, y_train)

看看模型在訓(xùn)練數(shù)據(jù)集以及驗(yàn)證數(shù)據(jù)集中的準(zhǔn)確度,首先定義一個(gè)預(yù)測函數(shù)

def predict(X, best_theta=best_theta):
    temp = X.dot(best_theta)
    y_predict = np.array(temp>0, dtype=int)
    return y_predict

y_train_predict = predict(X_train, best_theta)
train_score = np.sum(y_train_predict==y_train)/len(y_train)

y_test_predict = predict(X_test, best_theta)
test_score = np.sum(y_test_predict==y_test)/len(y_test)

print('在訓(xùn)練數(shù)據(jù)集的準(zhǔn)確度為{}, 在驗(yàn)證數(shù)據(jù)集的準(zhǔn)確度為{}'.format(train_score, test_score))

結(jié)果如下

在訓(xùn)練數(shù)據(jù)集的準(zhǔn)確度為1.0, 在驗(yàn)證數(shù)據(jù)集的準(zhǔn)確度為1.0

可以看到址晕,通過對(duì)75個(gè)樣本的訓(xùn)練,我們對(duì)剩下25個(gè)樣本的預(yù)測準(zhǔn)確率達(dá)到了100%顿锰,其實(shí)在實(shí)際應(yīng)用中一般不會(huì)有這么高的準(zhǔn)確率谨垃,因?yàn)轼S尾花數(shù)據(jù)集比較好區(qū)分而且有四個(gè)特征所以才能達(dá)到100%的準(zhǔn)確率。但是通過這個(gè)例子也可以很好的學(xué)習(xí)到邏輯回歸的思路硼控。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刘陶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牢撼,更是在濱河造成了極大的恐慌匙隔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熏版,死亡現(xiàn)場離奇詭異纷责,居然都是意外死亡捍掺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門再膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乡小,“玉大人,你說我怎么就攤上這事饵史÷樱” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵胳喷,是天一觀的道長湃番。 經(jīng)常有香客問我,道長吭露,這世上最難降的妖魔是什么吠撮? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮讲竿,結(jié)果婚禮上泥兰,老公的妹妹穿的比我還像新娘。我一直安慰自己题禀,他們只是感情好鞋诗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迈嘹,像睡著了一般削彬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秀仲,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天融痛,我揣著相機(jī)與錄音,去河邊找鬼神僵。 笑死雁刷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的保礼。 我是一名探鬼主播沛励,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼氓英!你這毒婦竟也來了侯勉?” 一聲冷哼從身側(cè)響起鹦筹,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤铝阐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铐拐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徘键,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡练对,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吹害。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟凭。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖它呀,靈堂內(nèi)的尸體忽然破棺而出螺男,到底是詐尸還是另有隱情,我是刑警寧澤纵穿,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布下隧,位于F島的核電站,受9級(jí)特大地震影響谓媒,放射性物質(zhì)發(fā)生泄漏淆院。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一句惯、第九天 我趴在偏房一處隱蔽的房頂上張望土辩。 院中可真熱鬧,春花似錦抢野、人聲如沸拷淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辕棚。三九已至,卻和暖如春邓厕,著一層夾襖步出監(jiān)牢的瞬間逝嚎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工详恼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留补君,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓昧互,卻偏偏與公主長得像挽铁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敞掘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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