SKlearn_邏輯回歸小練習(xí)

邏輯回歸

邏輯回歸(Logistic regression 或logit regression),即邏輯模型(英語:Logit model,也譯作“評定模型”、“分類評定模型”)是離散選擇法模型之一,屬于多重變量分析范疇,是社會學(xué)、生物統(tǒng)計學(xué)、臨床、數(shù)量心理學(xué)、計量經(jīng)濟(jì)學(xué)、市場營銷等統(tǒng)計實證分析的常用方法。——維基百科

雖然叫做回歸其實是個分類模型。邏輯回歸實際上是用sigmoid函數(shù)將線性回歸進(jìn)行了歸一化,把輸出值壓縮到0-1之間,這個值代表的是發(fā)生的概率。

邏輯函數(shù)

邏輯函數(shù)(sigmoid函數(shù))定義的累計分布又叫邏輯斯蒂分布,對分布函數(shù)求導(dǎo)得到概率密度函數(shù)。公式如下。[1]

[2]

不同參數(shù)對邏輯分布的影響

圖1 不同參數(shù)對邏輯分布的影響

注:圖中s就是統(tǒng)計中的γ。

邏輯回歸

邏輯回歸是為了解決分類問題(主要是二分類),根據(jù)一些已知的訓(xùn)練集訓(xùn)練好模型,再對新的數(shù)據(jù)進(jìn)行預(yù)測屬于哪個類。比如用戶是否點擊某個廣告、腫瘤是否是惡性的、用戶的性別,等等。

邏輯回歸需要找到分類概率P(Y=1)與輸入向量x的直接關(guān)系,然后通過比較概率值來判斷類別,這就用到上文中邏輯函數(shù)。它令決策函數(shù)的輸出值$w^Tx+b$等于概率值比值取對數(shù)$log\frac{P(Y=1|x)}{1-P(Y=1|x)}$,求解這個式子得到了輸入向量x下導(dǎo)致產(chǎn)生兩類的概率為:

其中w稱為權(quán)重,b稱為偏置,其中的w?x+b看成對x的線性函數(shù)。然后對比上面兩個概率值,概率值大的就是x對應(yīng)的類。

對邏輯回歸的定義,輸出Y=1的對數(shù)幾率是由輸入x的線性函數(shù)表示的模型,即邏輯斯蒂回歸模型(李航.《統(tǒng)計機器學(xué)習(xí)》)。

直接考察公式1可以得到另一種對邏輯回歸的定義,線性函數(shù)的值越接近正無窮,概率值就越接近1;線性值越接近負(fù)無窮,概率值越接近0,這樣的模型是邏輯斯蒂回歸模型(李航.《統(tǒng)計機器學(xué)習(xí)》)。

因此邏輯回歸的思路是,先擬合決策邊界(這里的決策邊界不局限于線性,還可以是多項式),再建立這個邊界與分類的概率聯(lián)系,從而得到了二分類情況下的概率。這里有個非常棒的博文[6]推薦,闡述了邏輯回歸的思路。

Logistic回歸模型的適用條件

  1. 因變量為二分類的分類變量或某事件的發(fā)生率,并且是數(shù)值型變量。但是需要注意,重復(fù)計數(shù)現(xiàn)象指標(biāo)不適用于Logistic回歸。

  2. 殘差和因變量都要服從二項分布。二項分布對應(yīng)的是分類變量,所以不是正態(tài)分布,進(jìn)而不是用最小二乘法,而是最大似然法來解決方程估計和檢驗問題。

  3. 自變量和Logistic概率是線性關(guān)系

  4. 各觀測對象間相互獨立。

原理:如果直接將線性回歸的模型扣到Logistic回歸中,會造成方程二邊取值區(qū)間不同和普遍的非直線關(guān)系。因為Logistic中因變量為二分類變量,某個概

率作為方程的因變量估計值取值范圍為0-1,但是,方程右邊取值范圍是無窮大或者無窮小。所以,才引入Logistic回歸。

Logistic回歸實質(zhì):發(fā)生概率除以沒有發(fā)生概率再取對數(shù)。就是這個不太繁瑣的變換改變了取值區(qū)間的矛盾和因變量自變量間的曲線關(guān)系。究其原因,是發(fā)生和未發(fā)生的概率成為了比值,這個比值就是一個緩沖,將取值范圍擴(kuò)大,再進(jìn)行對數(shù)變換,整個因變量改變。不僅如此,這種變換往往使得因變量和自變量之間呈線性關(guān)系,這是根據(jù)大量實踐而總結(jié)。所以,Logistic回歸從根本上解決因變量要不是連續(xù)變量怎么辦的問題。還有,Logistic應(yīng)用廣泛的原因是許多現(xiàn)實問題跟它的模型吻合。例如一件事情是否發(fā)生跟其他數(shù)值型自變量的關(guān)系。[3]

求解/優(yōu)化

數(shù)學(xué)模型的形式確定之后,接下來就要求解參數(shù)。統(tǒng)計學(xué)中常用的一種方法是最大似然估計,即找到一組參數(shù),使得在這組參數(shù)下,我們的數(shù)據(jù)的似然度(概率)越大。

在邏輯回歸中,似然度為:

取對數(shù)得到對數(shù)似然度:

邏輯回歸中最大化似然函數(shù)和最小化log損失函數(shù)實際上是等價的。

損失函數(shù)(loss function)是用來估量你模型的預(yù)測值f(x)與真實值Y的不一致程度,它是一個非負(fù)實值函數(shù),通常使用L(Y, f(x))來表示,損失函數(shù)越小,模型的魯棒性就越好[4]。常用的損失函數(shù)有0-1損失,log損失,hinge損失等。

優(yōu)化的主要目標(biāo)是找到一個方向,參數(shù)朝這個方向移動之后使得似然函數(shù)的值能夠減小,這個方向往往由一階偏導(dǎo)或者二階偏導(dǎo)各種組合求得。邏輯回歸的優(yōu)化方法有很多,比如梯度下降,牛頓法和BFGS。

正則化

過擬合:提高在訓(xùn)練數(shù)據(jù)上的表現(xiàn)時,在測試數(shù)據(jù)上反而下降,這就被稱為過擬合。

image

圖2 同樣數(shù)據(jù)下欠擬合,擬合和過擬合

所以要用正則化來限制模型參數(shù),也叫懲罰項。正則化不是只有邏輯回歸存在,它是一個通用的算法和思想,所以會產(chǎn)生過擬合現(xiàn)象的算法都可以使用正則化來避免過擬合。一般是在目標(biāo)函數(shù)(經(jīng)驗風(fēng)險)中加上一個正則化項Φ(w)。

啊~~~數(shù)學(xué)太差,看到公式就腦仁疼。

接下來去python里試試吧。

SKlearn實現(xiàn)邏輯回歸

方法與參數(shù)

LogisticRegression類的各項參數(shù)的含義

class sklearn.linear_model.LogisticRegression(penalty='l2', 
          dual=False, tol=0.0001, C=1.0, fit_intercept=True, 
          intercept_scaling=1, class_weight=None, 
          random_state=None, solver='liblinear', max_iter=100, 
          multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
  • penalty='l2' : 字符串‘l1’或‘l2’,默認(rèn)‘l2’。
    • 用來指定懲罰的基準(zhǔn)(正則化參數(shù))。只有‘l2’支持‘newton-cg’、‘sag’和‘lbfgs’這三種算法。
    • 如果選擇‘l2’,solver參數(shù)可以選擇‘liblinear’、‘newton-cg’、‘sag’和‘lbfgs’這四種算法;如果選擇‘l1’的話就只能用‘liblinear’算法。
  • dual=False : 對偶或者原始方法。Dual只適用于正則化相為l2的‘liblinear’的情況,通常樣本數(shù)大于特征數(shù)的情況下,默認(rèn)為False。
  • C=1.0 : C為正則化系數(shù)λ的倒數(shù),必須為正數(shù),默認(rèn)為1。和SVM中的C一樣,值越小,代表正則化越強。
  • fit_intercept=True : 是否存在截距,默認(rèn)存在。
  • intercept_scaling=1 : 僅在正則化項為‘liblinear’,且fit_intercept設(shè)置為True時有用。
  • solver='liblinear' : solver參數(shù)決定了我們對邏輯回歸損失函數(shù)的優(yōu)化方法,有四種算法可以選擇。
    • a) liblinear:使用了開源的liblinear庫實現(xiàn),內(nèi)部使用了坐標(biāo)軸下降法來迭代優(yōu)化損失函數(shù)。
    • b) lbfgs:擬牛頓法的一種,利用損失函數(shù)二階導(dǎo)數(shù)矩陣即海森矩陣來迭代優(yōu)化損失函數(shù)。
    • c) newton-cg:也是牛頓法家族的一種,利用損失函數(shù)二階導(dǎo)數(shù)矩陣即海森矩陣來迭代優(yōu)化損失函數(shù)。
    • d) sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區(qū)別是每次迭代僅僅用一部分的樣本來計算梯度,適合于樣本數(shù)據(jù)多的時候。

從上面的描述可以看出,newton-cg、lbfgs和sag這三種優(yōu)化算法時都需要損失函數(shù)的一階或者二階連續(xù)導(dǎo)數(shù),因此不能用于沒有連續(xù)導(dǎo)數(shù)的L1正則化,只能用于L2正則化。而liblinear通吃L1正則化和L2正則化。
同時,sag每次僅僅使用了部分樣本進(jìn)行梯度迭代,所以當(dāng)樣本量少的時候不要選擇它,而如果樣本量非常大,比如大于10萬,sag是第一選擇。但是sag不能用于L1正則化,所以當(dāng)你有大量的樣本,又需要L1正則化的話就要自己做取舍了。要么通過對樣本采樣來降低樣本量,要么回到L2正則化。
但是liblinear也有自己的弱點!我們知道,邏輯回歸有二元邏輯回歸和多元邏輯回歸。對于多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準(zhǔn)確一些。而liblinear只支持OvR,不支持MvM,這樣如果我們需要相對精確的多元邏輯回歸時,就不能選擇liblinear了。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了。

總結(jié):

正則化 算法 適用場景
L1 liblinear liblinear適用于小數(shù)據(jù)集;如果選擇L2正則化發(fā)現(xiàn)還是過擬合,即預(yù)測效果差的時候,就可以考慮L1正則化;如果模型的特征非常多,希望一些不重要的特征系數(shù)歸零,從而讓模型系數(shù)稀疏化的話,也可以使用L1正則化。
L2 liblinear libniear只支持多元邏輯回歸的OvR,不支持MvM,但MVM相對精確。
L2 lbfgs/newton-cg/sag 較大數(shù)據(jù)集,支持one-vs-rest(OvR)和many-vs-many(MvM)兩種多元邏輯回歸。
L2 sag 如果樣本量非常大,比如大于10萬,sag是第一選擇;但不能用于L1正則化。

來源:http://jishu.y5y.com.cn/cherdw/article/details/54891073

  • multi_class='ovr' : 分類方式。官網(wǎng)有個對比兩種分類方式的例子:鏈接地址
    • ovr即one-vs-rest(OvR),multinomial是many-vs-many(MvM)。如果是二元邏輯回歸,ovr和multinomial并沒有任何區(qū)別,區(qū)別主要在多元邏輯回歸上。
    • ovr不論是幾元回歸,都當(dāng)成二元回歸來處理。mvm從從多個類中每次選兩個類進(jìn)行二元回歸。如果總共有T類,需要T(T-1)/2次分類。
    • OvR相對簡單,但分類效果相對略差(大多數(shù)樣本分布情況)。而MvM分類相對精確,但是分類速度沒有OvR快。
    • 如果選擇了ovr,則4種損失函數(shù)的優(yōu)化方法liblinear,newton-cg,lbfgs和sag都可以選擇。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag了。
  • class_weight=None : 類型權(quán)重參數(shù)。用于標(biāo)示分類模型中各種類型的權(quán)重。默認(rèn)不輸入,即所有的分類的權(quán)重一樣。
    • 選擇‘balanced’自動根據(jù)y值計算類型權(quán)重。
    • 自己設(shè)置權(quán)重,格式:{class_label: weight}。例如0,1分類的er'yuan二元模型,設(shè)置class_weight={0:0.9, 1:0.1},這樣類型0的權(quán)重為90%,而類型1的權(quán)重為10%。
  • random_state=None : 隨機數(shù)種子,默認(rèn)為無。僅在正則化優(yōu)化算法為sag,liblinear時有用。
  • max_iter=100 : 算法收斂的最大迭代次數(shù)。
  • tol=0.0001 : 迭代終止判據(jù)的誤差范圍。
  • verbose=0 : 日志冗長度int:冗長度;0:不輸出訓(xùn)練過程;1:偶爾輸出; >1:對每個子模型都輸出
  • warm_start=False : 是否熱啟動,如果是,則下一次訓(xùn)練是以追加樹的形式進(jìn)行(重新使用上一次的調(diào)用作為初始化)。布爾型,默認(rèn)False。
  • n_jobs=1 : 并行數(shù),int:個數(shù);-1:跟CPU核數(shù)一致;1:默認(rèn)值。

LogisticRegression類的常用方法

  • fit(X, y, sample_weight=None)
    • 擬合模型,用來訓(xùn)練LR分類器,其中X是訓(xùn)練樣本,y是對應(yīng)的標(biāo)記向量
    • 返回對象,self。
  • fit_transform(X, y=None, **fit_params)
    • fit與transform的結(jié)合,先fit后transform。返回X_new:numpy矩陣。
  • predict(X)
    • 用來預(yù)測樣本,也就是分類,X是測試集。返回array。
  • predict_proba(X)
    • 輸出分類概率。返回每種類別的概率,按照分類類別順序給出。如果是多分類問題,multi_class="multinomial",則會給出樣本對于每種類別的概率。
    • 返回array-like。
  • score(X, y, sample_weight=None)
    • 返回給定測試集合的平均準(zhǔn)確率(mean accuracy),浮點型數(shù)值。
    • 對于多個分類返回,則返回每個類別的準(zhǔn)確率組成的哈希矩陣。

示例

參考官網(wǎng)的例子,對鳶尾花數(shù)據(jù)進(jìn)行邏輯回歸。畫圖參考

import numpy as np
from sklearn import linear_model, datasets
from sklearn.cross_validation import train_test_split

# 1.加載數(shù)據(jù)
iris = datasets.load_iris()
X = iris.data[:, :2]  # 使用前兩個特征
Y = iris.target
#np.unique(Y)   # out: array([0, 1, 2])

# 2.拆分測試集、訓(xùn)練集。
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
# 設(shè)置隨機數(shù)種子,以便比較結(jié)果。

# 3.標(biāo)準(zhǔn)化特征值
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

# 4. 訓(xùn)練邏輯回歸模型
logreg = linear_model.LogisticRegression(C=1e5)
logreg.fit(X_train, Y_train)

# 5. 預(yù)測
prepro = logreg.predict_proba(X_test_std)
acc = logreg.score(X_test_std,Y_test)

因為這里數(shù)據(jù)量小,結(jié)果準(zhǔn)確率只有0.7。嘛,只是小小的示范一下怎么使用sklearn的邏輯回歸方法。在訓(xùn)練模型之前,可以優(yōu)化一下模型參數(shù),用GridSearchCV()函數(shù)。


參考文章:


  1. 【機器學(xué)習(xí)算法系列之二】淺析Logistic Regression ?

  2. Cmd Markdown 公式指導(dǎo)手冊 ?

  3. 78logistic 回歸與線性回歸的比較 ?

  4. 機器學(xué)習(xí)-損失函數(shù) ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容