前情提要:
通俗地說邏輯回歸【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.邏輯回歸的正則化
所謂正則化希柿,其目的是為了減弱邏輯回歸模型的精度,難道模型的準確度不是越高越好嘛养筒?看看下面這張圖就明白了:
左邊那個圖就是過擬合的情況曾撤,過擬合其實就是模型的精度太過高了,它能非常好得匹配訓練集的數(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é)果:
可以看到有送,已將三種類型的鳶尾花都分類出來了淌喻。
小結(jié)
邏輯回歸算是比較簡單的一種分類算法,而由于簡單雀摘,所以也比較適合初學者初步接觸機器學習算法裸删。學習了之后,對后面一些更復雜的機器學習算法阵赠,諸如Svm涯塔,或更高級的神經(jīng)網(wǎng)絡(luò)也能有一個稍微感性的認知肌稻。
而實際上,Svm可以看作是邏輯回歸的更高級的演化匕荸。而從神經(jīng)網(wǎng)絡(luò)的角度爹谭,邏輯回歸甚至可以看作一個最初級,最淺層的神經(jīng)網(wǎng)絡(luò)榛搔。
邏輯回歸就像是金庸小說里面诺凡,獨孤九劍的第一式,最為簡單践惑,卻又是其他威力極大的招式的基礎(chǔ)腹泌,其他的招式都又第一式演化而出。
夯實基礎(chǔ)尔觉,才能砥礪前行凉袱。
以上~