通俗地說邏輯迴歸【Logistic regression】算法(二)sklearn邏輯迴歸實戰

前情提要:

通俗地說邏輯迴歸【Logistic regression】算法(一) 邏輯迴歸模型原理介紹html

上一篇主要介紹了邏輯迴歸中,相對理論化的知識,此次主要是對上篇作一點點補充,以及介紹sklearn 邏輯迴歸模型的參數,以及具體的實戰代碼。算法

1.邏輯迴歸的二分類和多分類

上次介紹的邏輯迴歸的內容,基本都是基於二分類的。那麼有沒有辦法讓邏輯迴歸實現多分類呢?那確定是有的,還不止一種。網絡

實際上二元邏輯迴歸的模型和損失函數很容易推廣到多元邏輯迴歸。好比老是認爲某種類型爲正值,其他爲0值。dom

舉個例子,要分類爲A,B,C三類,那麼就能夠把A看成正向數據,B和C看成負向數據來處理,這樣就能夠用二分類的方法解決多分類的問題,這種方法就是最經常使用的one-vs-rest,簡稱OvR。並且這種方法也能夠方便得推廣到其餘二分類模型中(固然其餘算法可能有更好的多分類辦法)。機器學習

另外一種多元邏輯迴歸的方法是Many-vs-Many(MvM),它會選擇一部分類別的樣本和另外一部分類別的樣原本作邏輯迴歸二分類。函數

聽起來很難以想象,但其實確實是能辦到的。好比數據有A,B,C三個分類。性能

咱們將A,B做爲正向數據,C做爲負向數據,訓練出一個分模型。再將A,C做爲正向數據,B做爲負向數據,訓練出一個分類模型。最後B,C做爲正向數據,C做爲負向數據,訓練出一個模型。學習

經過這三個模型就能實現多分類,固然這裏只是舉個例子,實際使用中有其餘更好的MVM方法。限於篇幅這裏不展開了。優化

MVM中最經常使用的是One-Vs-One(OvO)。OvO是MvM的特例。即每次選擇兩類樣原本作二元邏輯迴歸。.net

對比下兩種多分類方法,一般狀況下,Ovr比較簡單,速度也比較快,但模型精度上沒MvM那麼高。MvM則正好相反,精度高,但速度上比不過Ovr。

2.邏輯迴歸的正則化

所謂正則化,其目的是爲了減弱邏輯迴歸模型的精度,難道模型的準確度不是越高越好嘛?看看下面這張圖就明白了:

左邊那個圖就是過擬合的狀況,過擬合其實就是模型的精度太太高了,它能很是好得匹配訓練集的數據,但一旦有新的數據,就會表現得不好。

而咱們要的非過擬合的模型是,精度能夠差一些,但泛化性能,也就是對新的數據的識別能力,要比較好。

正則化就是減弱模型精度,提升泛化效果的這個東西。

3.sklearn各個參數

def LogisticRegression(penalty='l2', 
                                    dual=False, 
                                    tol=1e-4, 
                                    C=1.0,
                                    fit_intercept=True, 
                                    intercept_scaling=1, 
                                    class_weight=None,
                                    random_state=None, 
                                    solver='warn', 
                                    max_iter=100,
                                    multi_class='warn', 
                                    verbose=0, 
                                    warm_start=False, 
                                    n_jobs=None,
                                    l1_ratio=None
                                    )
跟線性迴歸一比,邏輯迴歸的參數那還真是多啊,不過咱們一個一個來看看參數都是什麼意思吧。                                 

- dual:對偶或者原始方法,布爾類型,默認爲False。Dual只適用於正則化相爲l2的‘liblinear’的狀況,一般樣本數大於特徵數的狀況下,默認爲False。

- tol:中止迭代求解的閾值,單精度類型,默認爲1e-4。

- C:正則化係數的倒數,必須爲正的浮點數,默認爲 1.0,這個值越小,說明正則化效果越強。換句話說,這個值越小,越訓練的模型更泛化,但也更容易欠擬合。

- fit_intercept:是否要使用截距(在決策函數中使用截距),布爾類型,默認爲True。

- intercept_scaling:官方解釋比較模糊,我說下我的理解。浮點型,默認值是1.0。這個參數僅在「solver」參數(下面介紹)爲「liblinear」「fit_intercept 」參數爲True的時候生效。做用是給特徵向量添加一個常量,這個常量就是intercept_scaling。好比本來的向量是[x],那麼添加後就變成[x,intercept_scaling]。

- class_weight:分類權重,能夠是一個dict(字典類型),也能夠是一個字符串"balanced"字符串。默認是None,也就是不作任何處理,而"balanced"則會去自動計算權重,分類越多的類,權重越低,反之權重越高。也能夠本身輸出一個字典,好比一個 0/1 的二元分類,能夠傳入{0:0.1,1:0.9},這樣 0 這個分類的權重是0.1,1這個分類的權重是0.9。這樣的目的是由於有些分類問題,樣本極端不平衡,好比網絡攻擊,大部分正常流量,小部分攻擊流量,但攻擊流量很是重要,須要有效識別,這時候就能夠設置權重這個參數。

- random_state:設置隨機數種子,能夠是int類型和None,默認是None。當"solver"參數爲"sag"和"liblinear"的時候生效。

- verbose:輸出詳細過程,int類型,默認爲0(不輸出)。當大於等於1時,輸出訓練的詳細過程。僅當"solvers"參數設置爲"liblinear"和"lbfgs"時有效。

- warm_start:設置熱啓動,布爾類型,默認爲False。若設置爲True,則以上一次fit的結果做爲這次的初始化,若是"solver"參數爲"liblinear"時無效。

- max_iter:最大迭代次數,int類型,默認-1(即無限制)。注意前面也有一個tol迭代限制,但這個max_iter的優先級是比它高的,也就若是限制了這個參數,那是不會去管tol這個參數的。

OK,上述就是對一些比較簡略的參數的說明,可是還有幾個重要的參數沒講到,這是由於這幾個參數我以爲須要單獨拎出來說一講。

sklearn邏輯迴歸參數 --penalty

正則化類型選擇,字符串類型,可選'l1','l2','elasticnet'和None,默認是'l2',一般狀況下,也是選擇'l2'。這個參數的選擇是會影響到參數'solver'的選擇的,下面會介紹。

其中'l1'和'l2'。分別對應L1的正則化和L2的正則化,'elasticnet'則是彈性網絡(這玩意我也不大懂),默認是L2的正則化。

在調參時若是主要的目的只是爲了解決過擬合,通常penalty選擇L2正則化就夠了。可是若是選擇L2正則化發現仍是過擬合,即預測效果差的時候,就能夠考慮L1正則化。另外,若是模型的特徵很是多,咱們但願一些不重要的特徵係數歸零,從而讓模型係數稀疏化的話,也可使用L1正則化。

penalty參數的選擇會影響咱們損失函數優化算法的選擇。即參數solver的選擇,若是是L2正則化,那麼4種可選的算法{‘newton-cg’,‘lbfgs’,‘liblinear’,‘sag’}均可以選擇。可是若是penalty是L1正則化的話,就只能選擇‘liblinear’了。這是由於L1正則化的損失函數不是連續可導的,而{‘newton-cg’,‘lbfgs’,‘sag’}這三種優化算法時都須要損失函數的一階或者二階連續導數。而‘liblinear’並無這個依賴。最後還有一個'elasticnet',這個只有solver參數爲'saga'才能選。

sklearn邏輯迴歸參數 --solver

優化算法參數,字符串類型,一個有五種可選,分別是"newton-cg","lbfgs","liblinear","sag","saga。默認是"liblinear"。分別介紹下各個優化算法:

  • a) liblinear:使用了開源的liblinear庫實現,內部使用了座標軸降低法來迭代優化損失函數。
  • b) lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
  • c) newton-cg:也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
  • d) sag:即隨機平均梯度降低,是梯度降低法的變種,和普通梯度降低法的區別是每次迭代僅僅用一部分的樣原本計算梯度,適合於樣本數據多的時候。
    在優化參數的選擇上,官方是這樣建議的:
  • e)saga:優化的,無偏估計的sag方法。(‘sag’ uses a Stochastic Average Gradient descent, and ‘saga’ uses its improved, unbiased version named SAGA.)
    對小的數據集,能夠選擇"liblinear",若是是大的數據集,好比說大於10W的數據,那麼選擇"sag"和"saga"會讓訓練速度更快。

對於多分類問題,只有newton-cg,sag,saga和lbfgs可以處理多項損失(也就是MvM的狀況,還記得上面說到的多分類嘛?),而liblinear僅處理(OvR)的狀況。啥意思,就是用liblinear的時候,若是是多分類問題,得先把一種類別做爲一個類別,剩餘的全部類別做爲另一個類別。一次類推,遍歷全部類別,進行分類。

這個的選擇和正則化的參數也有關係,前面說到"penalty"參數能夠選擇"l1","l2"和None。這裏'liblinear'是能夠選擇'l1'正則和'l2'正則,但不能選擇None,'newton-cg','lbfgs','sag'和'saga'這幾種能選擇'l2'或no penalty,而'saga'則能選怎'elasticnet'正則。好吧,這部分仍是挺繞的。

概括一下吧,二分類狀況下,數據量小,通常默認的'liblinear'的行,數據量大,則使用'sag'。多分類的狀況下,在數據量小的狀況下,追求高精度,能夠用'newton-cg'或'lbfgs'以'MvM'的方式求解。數據量一大仍是使用'sag'。

固然實際狀況下仍是要調參屢次才能肯定參數,這裏也只能給些模糊的建議。

sklearn邏輯迴歸參數 --multi_class

multi_class參數決定了咱們分類方式的選擇,有 ovr和multinomial兩個值能夠選擇,默認是 ovr。
ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。若是是二元邏輯迴歸,ovr和multinomial並無任何區別,區別主要在多元邏輯迴歸上。

4.sklearn實例

實例這部分,就直接引用sklearn官網的,使用邏輯迴歸對不一樣種類的鳶尾花進行分類的例子吧。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets

# 加載鳶尾花數據
iris = datasets.load_iris()
# 只採用樣本數據的前兩個feature,生成X和Y
X = iris.data[:, :2]  
Y = iris.target

h = .02  # 網格中的步長

# 新建模型,設置C參數爲1e5,並進行訓練
logreg = linear_model.LogisticRegression(C=1e5)
logreg.fit(X, Y)

# 繪製決策邊界。爲此咱們將爲網格 [x_min, x_max]x[y_min, y_max] 中的每一個點分配一個顏色。
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

# 將結果放入彩色圖中
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4, 3))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

# 將訓練點也一樣放入彩色圖中
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())

plt.show()

運行上面那段代碼會有以下的結果:

能夠看到,已將三種類型的鳶尾花都分類出來了。

小結

邏輯迴歸算是比較簡單的一種分類算法,而因爲簡單,因此也比較適合初學者初步接觸機器學習算法。學習了以後,對後面一些更復雜的機器學習算法,諸如Svm,或更高級的神經網絡也能有一個稍微感性的認知。

而實際上,Svm能夠看做是邏輯迴歸的更高級的演化。而從神經網絡的角度,邏輯迴歸甚至能夠看做一個最初級,最淺層的神經網絡。

邏輯迴歸就像是金庸小說裏面,獨孤九劍的第一式,最爲簡單,卻又是其餘威力極大的招式的基礎,其餘的招式都又第一式演化而出。

夯實基礎,才能砥礪前行。

以上~

參考文章:

scikit-learn 邏輯迴歸類庫使用小結

LogisticRegression - 參數說明

相關文章
相關標籤/搜索