逻辑斯谛回归(Logistic回归)最详解
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Logistic回歸學(xué)習(xí)思路
一.邏輯回歸模型的原理與定義(主要思想)
邏輯斯諦回歸是經(jīng)典的分類方法,它屬于對(duì)數(shù)線性模型,原理是根據(jù)現(xiàn)有的數(shù)據(jù)對(duì)分類邊界線建立回歸公式,以此進(jìn)行分類。(主要思想)
定義:
在線性回歸模型的基礎(chǔ)上,使用Sigmoid函數(shù),將線性模型的結(jié)果壓縮到[0,1]之間,使其擁有概率意義,它可以將任意輸入映射到[0,1]區(qū)間,實(shí)現(xiàn)值到概率轉(zhuǎn)換。
- 屬于概率性判別式模型
- 線性分類算法
在學(xué)習(xí)邏輯回歸模型之前,先來(lái)看一下邏輯斯諦分布,因?yàn)槲覀兊倪壿嬎沟倌P途褪歉鶕?jù)邏輯斯蒂分布得到的;通過(guò)參數(shù)估計(jì)方法直接估計(jì)出參數(shù),從而得到P(Y|X)。
下面給出《統(tǒng)計(jì)學(xué)習(xí)方法》上邏輯斯蒂分布的定義:
二.邏輯回歸的推導(dǎo)過(guò)程
為了實(shí)現(xiàn)根據(jù)所有輸入預(yù)測(cè)出類別,為此引入了sigmoid函數(shù)p=1/(1+exp(-z)),sigmoid函數(shù)剛好也有二分類的功能。
1. 為什么要使用sigmoid函數(shù)作為假設(shè)?
因?yàn)榫€性回歸模型的預(yù)測(cè)值為一般為大于1的實(shí)數(shù),而樣本的類標(biāo)簽為(0,1),我們需要將分類任務(wù)的真實(shí)標(biāo)記y與線性回歸模型的預(yù)測(cè)值聯(lián)系起來(lái),也就是找到廣義線性模型中的聯(lián)系函數(shù)。如果選擇單位階躍函數(shù)的話,它是不連續(xù)的不可微。而如果選擇sigmoid函數(shù),它是連續(xù)的,而且能夠?qū)轉(zhuǎn)化為一個(gè)接近0或1的值。
當(dāng)z=0時(shí),p=0.5
當(dāng)z>0時(shí),p>0.5 ?歸為1類
當(dāng)z<0時(shí),p<0.5 ?歸為0類
確定了分類器的函數(shù)形式,最佳回歸系數(shù)是多少,如何確定?
sigmoid函數(shù)的輸入記為z,將線性模型結(jié)果賦值到z,即:
z=w0x0+w1x1+w2x2+w3x3...wnxn
如果采用向量的寫(xiě)法,
上述公式寫(xiě)成z=WT*X,
其中向量X是分類器的輸入數(shù)據(jù),即為特征值;向量W就是我們要找到的最佳參數(shù),從而使得分類器盡可能精確。
為了找出最佳的回歸系數(shù),所以我們可以對(duì)兩種損失函數(shù)進(jìn)行優(yōu)化算法
①均方差 (后面會(huì)介紹舍棄使用這種作為損失函數(shù))
②對(duì)數(shù)極大似然估計(jì)法
三.數(shù)學(xué)模型
二項(xiàng)邏輯斯蒂回歸模型
知道分布的定義和推導(dǎo)過(guò)程之后,就是給出我們的邏輯斯蒂模型了:
引用了李航的《統(tǒng)計(jì)學(xué)習(xí)方法》書(shū)中如下
注意:(1)最終的結(jié)果是通過(guò)比較P(Y=1|X)和P(Y=0|X)的大小來(lái)確定類別的(類似于樸素貝葉斯);
? ? ? ? ? (2)b在這里其實(shí)可以看做是w0x0,其中x0 = 1;
? ? ? ? ? (3)其實(shí)本質(zhì)上這個(gè)就是一個(gè)二項(xiàng)分布,所以遵循二項(xiàng)分布的分布律。
事件的對(duì)數(shù)幾率(log odds)
也就是說(shuō),如果我的模型是邏輯回歸模型,那么事件{Y=1|X}發(fā)生的對(duì)數(shù)幾率就是輸入X的線性函數(shù)(模型),反之,知道了這個(gè)推論,我們是可以反推出邏輯斯蒂模型的形式的
四.目標(biāo)函數(shù)
求目標(biāo)參數(shù),常用目標(biāo)函數(shù)的選取:
①損失函數(shù):均方差(標(biāo)準(zhǔn)值-預(yù)測(cè)值)
②對(duì)數(shù)似然函數(shù)
首先極大似然函數(shù)是一種確定模型參數(shù)的方法,它確定參數(shù)值的方法是通過(guò)找到最大化模型產(chǎn)生真實(shí)數(shù)據(jù)的那一組參數(shù)。
最大似然估計(jì)就是通過(guò)已知結(jié)果去反推最大概率導(dǎo)致該結(jié)果的參數(shù)。
極大似然估計(jì)是概率論在統(tǒng)計(jì)學(xué)中的應(yīng)用,它提供了一種給定觀察數(shù)據(jù)來(lái)評(píng)估模型參數(shù)的方法,即 “模型已定,參數(shù)未知”,通過(guò)若干次試驗(yàn),觀察其結(jié)果,利用實(shí)驗(yàn)結(jié)果得到某個(gè)參數(shù)值能夠使樣本出現(xiàn)的概率為最大,則稱為極大似然估計(jì)。邏輯回歸是一種監(jiān)督式學(xué)習(xí),是有訓(xùn)練標(biāo)簽的,就是有已知結(jié)果的,從這個(gè)已知結(jié)果入手,去推導(dǎo)能獲得最大概率的結(jié)果參數(shù),只要我們得出了這個(gè)參數(shù),那我們的模型就自然可以很準(zhǔn)確的預(yù)測(cè)未知的數(shù)據(jù)了。(對(duì)極大似然函數(shù)的詳細(xì)理解可以參考:https://blog.csdn.net/qq_44543774/article/details/109735754)
?
通過(guò)極大似然推導(dǎo)得出邏輯回歸的目標(biāo)函數(shù),這里我給出手寫(xiě)的推導(dǎo):
極大似然函數(shù)是概率論在統(tǒng)計(jì)學(xué)中的應(yīng)用,它提供了一種給定觀察數(shù)據(jù)來(lái)評(píng)估模型參數(shù)的方法,即 “模型已定,參數(shù)未知”,通過(guò)若干次試驗(yàn),觀察其結(jié)果,利用實(shí)驗(yàn)結(jié)果得到某個(gè)參數(shù)值能夠使樣本出現(xiàn)的概率為最大,則稱為極大似然估計(jì)。通過(guò)求極大似然函數(shù)來(lái)得到參數(shù)w的估計(jì)值。
以上就是通過(guò)極大似然函數(shù)作為目標(biāo)函數(shù),得出了參數(shù)向量w值
綜上logistic回歸模型的目標(biāo)函數(shù)是極大似然函數(shù)
五.算法源碼
源碼:
from sklearn.linear_model import LogisticRegression from math import exp from math import * from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from numpy import * import numpy as npclass LogisticRegressionClassifier(object):def __init__(self,eta=0.1,loop=30):self.eta=etaself.loop=loopdef sigmoid(self,x):return 1.0/(1+exp(-x))def data_tranforce(self,x_train):data=[]d=[]for x in x_train: #x因?yàn)槭菙?shù)組類型data.append([1.0,*x]) #將每一行數(shù)組增加一個(gè)1.0數(shù)值,*x是去掉[]符號(hào),形成一行數(shù)值#c=list(x) #將一維數(shù)組變成列表#c.insert(0, 1.0) #這種insert()方法必須是列表#print(list(x).insert(0,1.0))#d.append(c) #類似d=[[1.0,2,3],[1.0,3,4.8]]return datadef fit(self,x_train,y_train):data_mat=self.data_tranforce(x_train) #處理每個(gè)樣本的特征值n=shape(data_mat)[1] #求出data_mat對(duì)應(yīng)參數(shù)的個(gè)數(shù)self.weight=ones((n,1)) #初始化參數(shù)w數(shù)組cls=self.loopfor k in range(cls): #循環(huán)多少次for i in range(len(x_train)): #遍歷每一個(gè)樣本h=self.sigmoid(np.dot(data_mat[i],self.weight))err=(y_train[i]-h)#隨著每次更新err下面就會(huì)更新self.weight的向量self.weight+=self.eta*err*np.transpose([data_mat[i]]) #[data_mat[i]]變成1*4的數(shù)組,一維數(shù)組轉(zhuǎn)置必須加一個(gè)[]#測(cè)試訓(xùn)練模型的準(zhǔn)確性def test(self,x_test,y_test):numbers=0x_test = self.data_tranforce(x_test) # 處理每個(gè)樣本的特征值加一個(gè)1.0for x,y in zip(x_test,y_test):result=np.dot(x,self.weight)if(result>0 and y==1)or(result<0 and y==0):numbers+=1return float(numbers)/float(len(x_test)) def main():load=load_iris()x=load.data[:100,:2]y=load.target[:100]y=np.where(y==1,1,0)x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)my_l=LogisticRegressionClassifier()my_l.fit(x_train,y_train)print("準(zhǔn)確率:",my_l.test(x_test,y_test))if __name__== "__main__":main()運(yùn)行結(jié)果:
用示例來(lái)解釋代碼的執(zhí)行過(guò)程:
六.優(yōu)缺點(diǎn)
優(yōu)點(diǎn):計(jì)算代價(jià)不高,易于理解和實(shí)現(xiàn)
缺點(diǎn):容易欠擬合,分類精度不高
七.應(yīng)用場(chǎng)景
邏輯回歸主要是解決二分類問(wèn)題
使用邏輯回歸判斷年收入
項(xiàng)目描述
二元分類是機(jī)器學(xué)習(xí)中最基礎(chǔ)的問(wèn)題之一,在這份教學(xué)中,你將學(xué)會(huì)如何實(shí)作一個(gè)線性二元分類器,來(lái)根據(jù)人們的個(gè)人資料,判斷其年收入是否高于 50,000 美元。我們將用?logistic regression 來(lái)達(dá)成以上目的,你可以嘗試了解、分析兩者的設(shè)計(jì)理念及差別。 實(shí)現(xiàn)二分類任務(wù):
- 個(gè)人收入是否超過(guò)50000元?
數(shù)據(jù)集介紹
這個(gè)資料集是由UCI Machine Learning Repository 的Census-Income (KDD) Data Set 經(jīng)過(guò)一些處理而得來(lái)。為了方便訓(xùn)練,我們移除了一些不必要的資訊,并且稍微平衡了正負(fù)兩種標(biāo)記的比例。事實(shí)上在訓(xùn)練過(guò)程中,只有 X_train、Y_train 和 X_test 這三個(gè)經(jīng)過(guò)處理的檔案會(huì)被使用到,train.csv 和 test.csv 這兩個(gè)原始資料檔則可以提供你一些額外的資訊。
- 已經(jīng)去除不必要的屬性。
- 已經(jīng)平衡正標(biāo)和負(fù)標(biāo)數(shù)據(jù)之間的比例。
特征格式
- 基于文本的原始數(shù)據(jù)
- 去掉不必要的屬性,平衡正負(fù)比例。
- train.csv中的離散特征=>在X_train中onehot編碼(學(xué)歷、狀態(tài)...)
- train.csv中的連續(xù)特征 => 在X_train中保持不變(年齡、資本損失...)。
- X_train, X_test : 每一行包含一個(gè)510-dim的特征,代表一個(gè)樣本。
- Y_train: label = 0 表示 "<=50K" 、 label = 1 表示 " >50K " 。
項(xiàng)目要求
請(qǐng)動(dòng)手編寫(xiě) gradient descent 實(shí)現(xiàn) logistic regression
數(shù)據(jù)準(zhǔn)備
項(xiàng)目數(shù)據(jù)集以及源碼:https://e.coding.net/xucancan1/logistic/logistic.git。
源碼:
# 下面該你動(dòng)手啦! import pandas as pd import numpy as np from math import exp from math import * df=pd.read_csv("work/data/X_train",encoding="big5") #print(df) train_label=pd.read_csv("work/data/Y_train",encoding="big5") train_label=train_label.iloc[:700,1:] #處理標(biāo)簽 train_label=np.array(train_label) #處理標(biāo)簽 print(train_label.shape) #print(train_label) #打印標(biāo)簽 df=df.iloc[:700,1:] #處理特征 print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") df=np.array(df) df=df.astype("float") #訓(xùn)練集特征的處理 #print(df.shape) #print(df)w=np.ones((511,1)) #初始化w eta=0.00000008 loop= 100 #循環(huán)次數(shù) m=len(train_label) data=[] def sigmoid(x):return 1.0/(1+exp(-x)) for k in df:data.append([1.0,*k]) #每一個(gè)特征數(shù)據(jù)樣本添加一個(gè)1.0 #print(np.shape(data)) data=np.array(data) #特征數(shù)據(jù) #print(data)w=np.mat(w) data=np.mat(data)for i in range(1000): #梯度下降,第一種:根據(jù)矩陣乘法直接計(jì)算wh1=[]for k in range(m):h=sigmoid(np.dot(data[k],w))h1.append(h)h2=np.array(h1)h2=h2.reshape(700,1) #變成列向量#print(h2.shape)err=train_label-h2w+=eta*data.transpose()*err #用矩陣梯度下降,下面也是 #print(w.shape)打印參數(shù)w #print(w) ''' for i in range(100): #梯度下降,第二種:一個(gè)一個(gè)的下降,訓(xùn)練模型參數(shù)wfor k in range(m):h=sigmoid(np.dot(data[k],w))err=train_label[k]-h#print(err)d=data[k].reshape(511,1)d=np.array(d)w+=eta*err*d #梯度下降print(w) '''test=pd.read_csv("work/data/X_test",encoding="big5") #處理測(cè)試集 test=test.iloc[:,1:] #處理數(shù)據(jù)集 test=np.array(test) print(test.shape) #print(test) true=1 false=0 for t in test: #在每個(gè)測(cè)試樣本增加一個(gè)1.0的特征值,并預(yù)測(cè)年收入dt=[1.0,*t]h=np.dot(dt,w)if h>0:print(true) #輸出為1,大于5000else:print(false) #輸出為0,小于等于5000邏輯回歸也可以做以下的二分類問(wèn)題:
1.區(qū)分是否是垃圾郵件
2.銀行判斷是否給用戶辦信用卡
3.從氙氣病癥預(yù)測(cè)病馬的死亡率
?
總結(jié)
以上是生活随笔為你收集整理的逻辑斯谛回归(Logistic回归)最详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 贪心算法———房间搬桌子
- 下一篇: 基于感知机的手写体识别