通俗地說邏輯回歸【Logistic regression】算法(二)sklearn邏輯回歸實戰(zhàn)

前情提要:

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

上一篇主要介紹了邏輯回歸中蜜笤,相對理論化的知識十嘿,這次主要是對上篇做一點點補充吨悍,以及介紹sklearn 邏輯回歸模型的參數(shù)婉烟,以及具體的實戰(zhàn)代碼砌些。

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

上次介紹的邏輯回歸的內(nèi)容习霹,基本都是基于二分類的朵耕。那么有沒有辦法讓邏輯回歸實現(xiàn)多分類呢?那肯定是有的序愚,還不止一種憔披。

實際上二元邏輯回歸的模型和損失函數(shù)很容易推廣到多元邏輯回歸。比如總是認為某種類型為正值爸吮,其余為0值芬膝。

舉個例子,要分類為A形娇,B锰霜,C三類,那么就可以把A當作正向數(shù)據(jù)桐早,B和C當作負向數(shù)據(jù)來處理癣缅,這樣就可以用二分類的方法解決多分類的問題,這種方法就是最常用的one-vs-rest哄酝,簡稱OvR友存。而且這種方法也可以方便得推廣到其他二分類模型中(當然其他算法可能有更好的多分類辦法)。

另一種多元邏輯回歸的方法是Many-vs-Many(MvM)陶衅,它會選擇一部分類別的樣本和另一部分類別的樣本來做邏輯回歸二分類屡立。

聽起來很不可思議,但其實確實是能辦到的搀军。比如數(shù)據(jù)有A膨俐,B,C三個分類罩句。

我們將A焚刺,B作為正向數(shù)據(jù),C作為負向數(shù)據(jù)门烂,訓練出一個分模型乳愉。再將A,C作為正向數(shù)據(jù),B作為負向數(shù)據(jù)匾委,訓練出一個分類模型拖叙。最后B氓润,C作為正向數(shù)據(jù)赂乐,C作為負向數(shù)據(jù),訓練出一個模型咖气。

通過這三個模型就能實現(xiàn)多分類挨措,當然這里只是舉個例子,實際使用中有其他更好的MVM方法崩溪。限于篇幅這里不展開了浅役。

MVM中最常用的是One-Vs-One(OvO)。OvO是MvM的特例伶唯。即每次選擇兩類樣本來做二元邏輯回歸觉既。

對比下兩種多分類方法,通常情況下乳幸,Ovr比較簡單瞪讼,速度也比較快,但模型精度上沒MvM那么高粹断。MvM則正好相反符欠,精度高,但速度上比不過Ovr瓶埋。

2.邏輯回歸的正則化

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


image

左邊那個圖就是過擬合的情況曾撤,過擬合其實就是模型的精度太過高了,它能非常好得匹配訓練集的數(shù)據(jù)晕粪,但一旦有新的數(shù)據(jù)挤悉,就會表現(xiàn)得很差。

而我們要的非過擬合的模型是兵多,精度可以差一些尖啡,但泛化性能,也就是對新的數(shù)據(jù)的識別能力剩膘,要比較好衅斩。

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

3.sklearn各個參數(shù)

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
                                    )
跟線性回歸一比畏梆,邏輯回歸的參數(shù)那還真是多啊,不過我們一個一個來看看參數(shù)都是什么意思吧。                                 

- dual:對偶或者原始方法奠涌,布爾類型宪巨,默認為False。Dual只適用于正則化相為l2的‘liblinear’的情況溜畅,通常樣本數(shù)大于特征數(shù)的情況下捏卓,默認為False。

- tol:停止迭代求解的閾值慈格,單精度類型怠晴,默認為1e-4。

- C:正則化系數(shù)的倒數(shù)浴捆,必須為正的浮點數(shù)蒜田,默認為 1.0,這個值越小选泻,說明正則化效果越強冲粤。換句話說,這個值越小页眯,越訓練的模型更泛化梯捕,但也更容易欠擬合。

- fit_intercept:是否要使用截距(在決策函數(shù)中使用截距)餐茵,布爾類型科阎,默認為True。

- intercept_scaling:官方解釋比較模糊忿族,我說下個人理解锣笨。浮點型,默認值是1.0道批。這個參數(shù)僅在“solver”參數(shù)(下面介紹)為“l(fā)iblinear”“fit_intercept ”參數(shù)為True的時候生效错英。作用是給特征向量添加一個常量,這個常量就是intercept_scaling隆豹。比如原本的向量是[x]椭岩,那么添加后就變成[x,intercept_scaling]。

- class_weight:分類權(quán)重璃赡,可以是一個dict(字典類型)判哥,也可以是一個字符串"balanced"字符串。默認是None碉考,也就是不做任何處理塌计,而"balanced"則會去自動計算權(quán)重,分類越多的類侯谁,權(quán)重越低锌仅,反之權(quán)重越高章钾。也可以自己輸出一個字典,比如一個 0/1 的二元分類热芹,可以傳入{0:0.1,1:0.9}贱傀,這樣 0 這個分類的權(quán)重是0.1,1這個分類的權(quán)重是0.9伊脓。這樣的目的是因為有些分類問題府寒,樣本極端不平衡,比如網(wǎng)絡(luò)攻擊丽旅,大部分正常流量椰棘,小部分攻擊流量纺棺,但攻擊流量非常重要榄笙,需要有效識別,這時候就可以設(shè)置權(quán)重這個參數(shù)祷蝌。

- random_state:設(shè)置隨機數(shù)種子茅撞,可以是int類型和None,默認是None巨朦。當"solver"參數(shù)為"sag"和"liblinear"的時候生效米丘。

- verbose:輸出詳細過程,int類型糊啡,默認為0(不輸出)拄查。當大于等于1時,輸出訓練的詳細過程棚蓄。僅當"solvers"參數(shù)設(shè)置為"liblinear"和"lbfgs"時有效堕扶。

- warm_start:設(shè)置熱啟動,布爾類型梭依,默認為False稍算。若設(shè)置為True,則以上一次fit的結(jié)果作為此次的初始化役拴,如果"solver"參數(shù)為"liblinear"時無效糊探。

- max_iter:最大迭代次數(shù),int類型河闰,默認-1(即無限制)科平。注意前面也有一個tol迭代限制,但這個max_iter的優(yōu)先級是比它高的姜性,也就如果限制了這個參數(shù)瞪慧,那是不會去管tol這個參數(shù)的。

OK污抬,上述就是對一些比較簡略的參數(shù)的說明汞贸,但是還有幾個重要的參數(shù)沒講到绳军,這是因為這幾個參數(shù)我覺得需要單獨拎出來講一講。

sklearn邏輯回歸參數(shù) --penalty

正則化類型選擇矢腻,字符串類型门驾,可選'l1','l2'多柑,'elasticnet'和None奶是,默認是'l2',通常情況下竣灌,也是選擇'l2'聂沙。這個參數(shù)的選擇是會影響到參數(shù)'solver'的選擇的,下面會介紹初嘹。

其中'l1'和'l2'及汉。分別對應(yīng)L1的正則化和L2的正則化,'elasticnet'則是彈性網(wǎng)絡(luò)(這玩意我也不大懂)屯烦,默認是L2的正則化坷随。

在調(diào)參時如果主要的目的只是為了解決過擬合,一般penalty選擇L2正則化就夠了驻龟。但是如果選擇L2正則化發(fā)現(xiàn)還是過擬合温眉,即預(yù)測效果差的時候,就可以考慮L1正則化翁狐。另外类溢,如果模型的特征非常多,我們希望一些不重要的特征系數(shù)歸零露懒,從而讓模型系數(shù)稀疏化的話闯冷,也可以使用L1正則化。

penalty參數(shù)的選擇會影響我們損失函數(shù)優(yōu)化算法的選擇隐锭。即參數(shù)solver的選擇窃躲,如果是L2正則化,那么4種可選的算法{‘newton-cg’,‘lbfgs’,‘liblinear’,‘sag’}都可以選擇钦睡。但是如果penalty是L1正則化的話蒂窒,就只能選擇‘liblinear’了。這是因為L1正則化的損失函數(shù)不是連續(xù)可導的荞怒,而{‘newton-cg’,‘lbfgs’,‘sag’}這三種優(yōu)化算法時都需要損失函數(shù)的一階或者二階連續(xù)導數(shù)洒琢。而‘liblinear’并沒有這個依賴。最后還有一個'elasticnet'褐桌,這個只有solver參數(shù)為'saga'才能選衰抑。

sklearn邏輯回歸參數(shù) --solver

優(yōu)化算法參數(shù),字符串類型荧嵌,一個有五種可選呛踊,分別是"newton-cg","lbfgs","liblinear","sag","saga砾淌。默認是"liblinear"。分別介紹下各個優(yōu)化算法:

  • a) liblinear:使用了開源的liblinear庫實現(xiàn)谭网,內(nèi)部使用了坐標軸下降法來迭代優(yōu)化損失函數(shù)汪厨。
  • b) lbfgs:擬牛頓法的一種,利用損失函數(shù)二階導數(shù)矩陣即海森矩陣來迭代優(yōu)化損失函數(shù)愉择。
  • c) newton-cg:也是牛頓法家族的一種劫乱,利用損失函數(shù)二階導數(shù)矩陣即海森矩陣來迭代優(yōu)化損失函數(shù)。
  • d) sag:即隨機平均梯度下降锥涕,是梯度下降法的變種衷戈,和普通梯度下降法的區(qū)別是每次迭代僅僅用一部分的樣本來計算梯度,適合于樣本數(shù)據(jù)多的時候层坠。
    在優(yōu)化參數(shù)的選擇上殖妇,官方是這樣建議的:
  • e)saga:優(yōu)化的,無偏估計的sag方法窿春。(‘sag’ uses a Stochastic Average Gradient descent, and ‘saga’ uses its improved, unbiased version named SAGA.)
    對小的數(shù)據(jù)集拉一,可以選擇"liblinear",如果是大的數(shù)據(jù)集旧乞,比如說大于10W的數(shù)據(jù),那么選擇"sag"和"saga"會讓訓練速度更快磅氨。

對于多分類問題尺栖,只有newton-cg,sag,saga和lbfgs能夠處理多項損失(也就是MvM的情況,還記得上面說到的多分類嘛烦租?)延赌,而liblinear僅處理(OvR)的情況。啥意思叉橱,就是用liblinear的時候挫以,如果是多分類問題,得先把一種類別作為一個類別窃祝,剩余的所有類別作為另外一個類別掐松。一次類推,遍歷所有類別粪小,進行分類大磺。

這個的選擇和正則化的參數(shù)也有關(guān)系,前面說到"penalty"參數(shù)可以選擇"l1"探膊,"l2"和None杠愧。這里'liblinear'是可以選擇'l1'正則和'l2'正則,但不能選擇None逞壁,'newton-cg','lbfgs','sag'和'saga'這幾種能選擇'l2'或no penalty流济,而'saga'則能選怎'elasticnet'正則锐锣。好吧,這部分還是挺繞的绳瘟。

歸納一下吧刺下,二分類情況下,數(shù)據(jù)量小稽荧,一般默認的'liblinear'的行橘茉,數(shù)據(jù)量大,則使用'sag'姨丈。多分類的情況下畅卓,在數(shù)據(jù)量小的情況下,追求高精度蟋恬,可以用'newton-cg'或'lbfgs'以'MvM'的方式求解翁潘。數(shù)據(jù)量一大還是使用'sag'。

當然實際情況下還是要調(diào)參多次才能確定參數(shù)歼争,這里也只能給些模糊的建議拜马。

sklearn邏輯回歸參數(shù) --multi_class

multi_class參數(shù)決定了我們分類方式的選擇,有 ovr和multinomial兩個值可以選擇沐绒,默認是 ovr俩莽。
ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)乔遮。如果是二元邏輯回歸扮超,ovr和multinomial并沒有任何區(qū)別,區(qū)別主要在多元邏輯回歸上蹋肮。

4.sklearn實例

實例這部分出刷,就直接引用sklearn官網(wǎng)的,使用邏輯回歸對不同種類的鳶尾花進行分類的例子吧坯辩。

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

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

h = .02  # 網(wǎng)格中的步長

# 新建模型,設(shè)置C參數(shù)為1e5漆魔,并進行訓練
logreg = linear_model.LogisticRegression(C=1e5)
logreg.fit(X, Y)

# 繪制決策邊界坷檩。為此我們將為網(wǎng)格 [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()])

# 將結(jié)果放入彩色圖中
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()

運行上面那段代碼會有如下的結(jié)果:


image

可以看到有送,已將三種類型的鳶尾花都分類出來了淌喻。

小結(jié)

邏輯回歸算是比較簡單的一種分類算法,而由于簡單雀摘,所以也比較適合初學者初步接觸機器學習算法裸删。學習了之后,對后面一些更復雜的機器學習算法阵赠,諸如Svm涯塔,或更高級的神經(jīng)網(wǎng)絡(luò)也能有一個稍微感性的認知肌稻。

而實際上,Svm可以看作是邏輯回歸的更高級的演化匕荸。而從神經(jīng)網(wǎng)絡(luò)的角度爹谭,邏輯回歸甚至可以看作一個最初級,最淺層的神經(jīng)網(wǎng)絡(luò)榛搔。

邏輯回歸就像是金庸小說里面诺凡,獨孤九劍的第一式,最為簡單践惑,卻又是其他威力極大的招式的基礎(chǔ)腹泌,其他的招式都又第一式演化而出。

夯實基礎(chǔ)尔觉,才能砥礪前行凉袱。

以上~

參考文章:

scikit-learn 邏輯回歸類庫使用小結(jié)

LogisticRegression - 參數(shù)說明

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侦铜,隨后出現(xiàn)的幾起案子专甩,更是在濱河造成了極大的恐慌,老刑警劉巖钉稍,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涤躲,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫁盲,警方通過查閱死者的電腦和手機篓叶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羞秤,“玉大人,你說我怎么就攤上這事左敌●埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵矫限,是天一觀的道長哺哼。 經(jīng)常有香客問我,道長叼风,這世上最難降的妖魔是什么取董? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮无宿,結(jié)果婚禮上茵汰,老公的妹妹穿的比我還像新娘。我一直安慰自己孽鸡,他們只是感情好蹂午,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布栏豺。 她就那樣靜靜地躺著,像睡著了一般豆胸。 火紅的嫁衣襯著肌膚如雪奥洼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天晚胡,我揣著相機與錄音灵奖,去河邊找鬼。 笑死估盘,一個胖子當著我的面吹牛瓷患,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忿檩,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼尉尾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了燥透?” 一聲冷哼從身側(cè)響起沙咏,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎班套,沒想到半個月后肢藐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡吱韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年吆豹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片理盆。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡痘煤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猿规,到底是詐尸還是另有隱情衷快,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布姨俩,位于F島的核電站蘸拔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏环葵。R本人自食惡果不足惜调窍,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望张遭。 院中可真熱鬧邓萨,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褐耳,卻和暖如春诈闺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铃芦。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工雅镊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刃滓。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓仁烹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咧虎。 傳聞我的和親對象是個殘疾皇子卓缰,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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