一鬼癣、邏輯回歸
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)
1.1 概述
在scikit-learn中,與邏輯回歸有關(guān)的主要是這3個(gè)類。
logisticRegression
LogisticRegressionCV
logistic_regression_path
其中LogisticRegression和LogisticRegressionCV的主要區(qū)別是LogisticRegressionCV使用了交叉驗(yàn)證來(lái)選擇正則化系數(shù)C耙蔑。而LogisticRegression需要自己每次指定一個(gè)正則化系數(shù)闭翩。除了交叉驗(yàn)證臀栈,以及選擇正則化系數(shù)C以外同廉, LogisticRegression和LogisticRegressionCV的使用方法基本相同埋心。
logistic_regression_path類則比較特殊指郁,它擬合數(shù)據(jù)后,不能直接來(lái)做預(yù)測(cè)拷呆,只能為擬合數(shù)據(jù)選擇合適邏輯回歸的系數(shù)和正則化系數(shù)闲坎。主要是用在模型選擇的時(shí)候。一般情況用不到這個(gè)類茬斧,所以后面不再講述logistic_regression_path類腰懂。
此外,scikit-learn里面有個(gè)容易讓人誤解的類RandomizedLogisticRegression,雖然名字里有邏輯回歸的詞项秉,但是主要是用L1正則化的邏輯回歸來(lái)做特征選擇的绣溜,屬于維度規(guī)約的算法類,不屬于我們常說(shuō)的分類算法的范疇娄蔼。
后面的講解主要圍繞LogisticRegression和LogisticRegressionCV中的重要參數(shù)的選擇來(lái)來(lái)展開(kāi)怖喻,這些參數(shù)的意義在這兩個(gè)類中都是一樣的。
1.2 正則化選擇參數(shù):penalty
penalty參數(shù)可選擇的值為"l1"和"l2"岁诉,默認(rèn)是L2.
在調(diào)參時(shí)如果我們主要的目的只是為了解決過(guò)擬合锚沸,一般penalty選擇L2正則化就夠了。但是如果選擇L2正則化發(fā)現(xiàn)還是過(guò)擬合涕癣,即預(yù)測(cè)效果差的時(shí)候哗蜈,就可以考慮L1正則化。另外坠韩,如果模型的特征非常多距潘,我們希望一些不重要的特征系數(shù)歸零,從而讓模型系數(shù)稀疏化的話只搁,也可以使用L1正則化音比。
penalty參數(shù)的選擇會(huì)影響我們損失函數(shù)優(yōu)化算法的選擇。即參數(shù)solver的選擇氢惋,如果是L2正則化硅确,那么4種可選的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以選擇。但是如果penalty是L1正則化的話明肮,就只能選擇‘liblinear’了。這是因?yàn)長(zhǎng)1正則化的損失函數(shù)不是連續(xù)可導(dǎo)的缭付,而{‘newton-cg’, ‘lbfgs’,‘sag’}這三種優(yōu)化算法時(shí)都需要損失函數(shù)的一階或者二階連續(xù)導(dǎo)數(shù)柿估。而‘liblinear’并沒(méi)有這個(gè)依賴。
1.3 優(yōu)化算法選擇參數(shù):solver
- a) liblinear:使用了開(kāi)源的liblinear庫(kù)實(shí)現(xiàn)陷猫,內(nèi)部使用了坐標(biāo)軸下降法來(lái)迭代優(yōu)化損失函數(shù)秫舌。
- b) lbfgs:擬牛頓法的一種的妖,利用損失函數(shù)二階導(dǎo)數(shù)矩陣即海森矩陣來(lái)迭代優(yōu)化損失函數(shù)。
- c) newton-cg:也是牛頓法家族的一種足陨,利用損失函數(shù)二階導(dǎo)數(shù)矩陣即海森矩陣來(lái)迭代優(yōu)化損失函數(shù)嫂粟。
- d) sag:即隨機(jī)平均梯度下降,適合于樣本數(shù)據(jù)多的時(shí)候墨缘,比如大于10萬(wàn)星虹。SAG是一種線性收斂算法,這個(gè)速度遠(yuǎn)比SGD快镊讼。
在sklearn的官方文檔中宽涌,對(duì)于solver的使用說(shuō)明如下:
In a nutshell, one may choose the solver with the following rules:
Small dataset or L1 penalty:“l(fā)iblinear”
Multinomial loss or large dataset:“l(fā)bfgs”, “sag” or “newton-cg”
Very Large dataset:“sag”
從上面的描述,大家可能覺(jué)得蝶棋,既然newton-cg, lbfgs和sag這么多限制卸亮,如果不是大樣本,我們選擇liblinear不就行了嘛玩裙!錯(cuò)兼贸,因?yàn)閘iblinear也有自己的弱點(diǎn)!我們知道吃溅,邏輯回歸有二元邏輯回歸和多元邏輯回歸溶诞。對(duì)于多元邏輯回歸常見(jiàn)的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對(duì)準(zhǔn)確一些罕偎。郁悶的是liblinear只支持OvR很澄,不支持MvM,這樣如果我們需要相對(duì)精確的多元邏輯回歸時(shí)颜及,就不能選擇liblinear了甩苛。也意味著如果我們需要相對(duì)精確的多元邏輯回歸不能使用L1正則化了。
總結(jié)而言俏站,liblinear支持L1和L2讯蒲,只支持OvR做多分類,“l(fā)bfgs”, “sag” “newton-cg”只支持L2肄扎,支持OvR和MvM做多分類墨林。
1.4 分類方式選擇參數(shù):multi_class
multi_class參數(shù)決定了我們分類方式的選擇,有 ovr和multinomial兩個(gè)值可以選擇犯祠,默認(rèn)是 ovr旭等。ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)衡载。
OvR的思想很簡(jiǎn)單搔耕,無(wú)論你是多少元邏輯回歸,我們都可以看做二元邏輯回歸痰娱。具體做法是弃榨,對(duì)于第K類的分類決策菩收,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負(fù)例鲸睛,然后在上面做二元邏輯回歸娜饵,得到第K類的分類模型。其他類的分類模型獲得以此類推官辈。
而MvM則相對(duì)復(fù)雜箱舞,這里舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類钧萍,我們每次在所有的T類樣本里面選擇兩類樣本出來(lái)褐缠,不妨記為T(mén)1類和T2類,把所有的輸出為T(mén)1和T2的樣本放在一起风瘦,把T1作為正例队魏,T2作為負(fù)例,進(jìn)行二元邏輯回歸万搔,得到模型參數(shù)胡桨。我們一共需要T(T-1)/2次分類。
從上面的描述可以看出OvR相對(duì)簡(jiǎn)單瞬雹,但分類效果相對(duì)略差(這里指大多數(shù)樣本分布情況昧谊,某些樣本分布下OvR可能更好)。而MvM分類相對(duì)精確酗捌,但是分類速度沒(méi)有OvR快呢诬。
1.5 類型權(quán)重參數(shù): class_weight
class_weight參數(shù)用于標(biāo)示分類模型中各種類型的權(quán)重,可以不輸入胖缤,即不考慮權(quán)重尚镰,或者說(shuō)所有類型的權(quán)重一樣。如果選擇輸入的話哪廓,可以選擇balanced讓類庫(kù)自己計(jì)算類型權(quán)重狗唉,或者我們自己輸入各個(gè)類型的權(quán)重,比如對(duì)于0,1的二元模型涡真,我們可以定義class_weight={0:0.9, 1:0.1}分俯,這樣類型0的權(quán)重為90%,而類型1的權(quán)重為10%哆料。
如果class_weight選擇balanced缸剪,那么類庫(kù)會(huì)根據(jù)訓(xùn)練樣本量來(lái)計(jì)算權(quán)重。某種類型樣本量越多东亦,則權(quán)重越低杏节,樣本量越少,則權(quán)重越高。
sklearn的官方文檔中拢锹,當(dāng)class_weight為balanced時(shí),類權(quán)重計(jì)算方法如下:
n_samples / (n_classes * np.bincount(y))萄喳,n_samples為樣本數(shù)卒稳,n_classes為類別數(shù)量,np.bincount(y)會(huì)輸出每個(gè)類的樣本數(shù)他巨,例如y=[1,0,0,1,1],則np.bincount(y)=[2,3]
那么class_weight有什么作用呢充坑?在分類模型中,我們經(jīng)常會(huì)遇到兩類問(wèn)題:
第一種是誤分類的代價(jià)很高染突。比如對(duì)合法用戶和非法用戶進(jìn)行分類捻爷,將非法用戶分類為合法用戶的代價(jià)很高,我們寧愿將合法用戶分類為非法用戶份企,這時(shí)可以人工再甄別也榄,但是卻不愿將非法用戶分類為合法用戶。這時(shí)司志,我們可以適當(dāng)提高非法用戶的權(quán)重甜紫。
第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數(shù)據(jù)10000條骂远,里面合法用戶有9995條囚霸,非法用戶只有5條,如果我們不考慮權(quán)重激才,則我們可以將所有的測(cè)試集都預(yù)測(cè)為合法用戶拓型,這樣預(yù)測(cè)準(zhǔn)確率理論上有99.95%,但是卻沒(méi)有任何意義瘸恼。這時(shí)劣挫,我們可以選擇balanced,讓類庫(kù)自動(dòng)提高非法用戶樣本的權(quán)重钞脂。
提高了某種分類的權(quán)重揣云,相比不考慮權(quán)重,會(huì)有更多的樣本分類劃分到高權(quán)重的類別冰啃,從而可以解決上面兩類問(wèn)題邓夕。
當(dāng)然,對(duì)于第二種樣本失衡的情況阎毅,我們還可以考慮用下一節(jié)講到的樣本權(quán)重參數(shù): sample_weight焚刚,而不使用class_weight。sample_weight在下一節(jié)講扇调。
1.6 樣本權(quán)重參數(shù): sample_weight
上一節(jié)我們提到了樣本不失衡的問(wèn)題矿咕,由于樣本不平衡,導(dǎo)致樣本不是總體樣本的無(wú)偏估計(jì),從而可能導(dǎo)致我們的模型預(yù)測(cè)能力下降碳柱。遇到這種情況捡絮,我們可以通過(guò)調(diào)節(jié)樣本權(quán)重來(lái)嘗試解決這個(gè)問(wèn)題。調(diào)節(jié)樣本權(quán)重的方法有兩種莲镣,第一種是在class_weight使用balanced福稳。第二種是在調(diào)用fit函數(shù)時(shí),通過(guò)sample_weight來(lái)自己調(diào)節(jié)每個(gè)樣本權(quán)重瑞侮。
在scikit-learn做邏輯回歸時(shí)的圆,如果上面兩種方法都用到了,那么樣本的真正權(quán)重是class_weight*sample_weight.
以上就是scikit-learn中邏輯回歸類庫(kù)調(diào)參的一個(gè)小結(jié)半火,還有些參數(shù)比如正則化參數(shù)C(交叉驗(yàn)證就是 Cs)越妈,迭代次數(shù)max_iter等,由于和其它的算法類庫(kù)并沒(méi)有特別不同钮糖,這里不多累述了梅掠。
二、隨機(jī)森林
1.每棵樹(shù)的最大深度
默認(rèn)采取最大深度藐鹤,這樣可以使得每棵樹(shù)的偏差最小瓤檐。但是這樣的時(shí)間和空間開(kāi)銷都很大,如果樣本集很大娱节,可以參考特征個(gè)數(shù)來(lái)設(shè)定
2.樹(shù)的顆數(shù)
樹(shù)的顆數(shù)反應(yīng)了模型的方差挠蛉,顆數(shù)越多,模型的泛化性能越好肄满。默認(rèn)會(huì)根據(jù)誤分率趨于穩(wěn)定來(lái)終止
3.最大特征數(shù)
如果一共有M個(gè)特征谴古,則最大特征默認(rèn)選取m=sqrt(M)個(gè),也可以用log2M個(gè)稠歉。對(duì)于100個(gè)特征掰担,100顆樹(shù)之后,一個(gè)特征一次都沒(méi)被選用的概率低于1%
這里考察的是樹(shù)與樹(shù)之間的相關(guān)性怒炸,最大特征數(shù)越小带饱,相關(guān)性越小,但同時(shí)每棵樹(shù)的錯(cuò)誤率會(huì)越大阅羹。上述過(guò)程是綜合考量的結(jié)果