99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀scikit-learn 邏輯回歸類庫使用小結(jié)
scikit-learn 邏輯回歸類庫使用小結(jié)
2018-05-20
收藏

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

1. 概述

在scikit-learn中,與邏輯回歸有關(guān)的主要是這3個類。LogisticRegression, LogisticRegressionCV 和logistic_regression_path。其中LogisticRegression和LogisticRegressionCV的主要區(qū)別是LogisticRegressionCV使用了交叉驗證來選擇正則化系數(shù)C。而LogisticRegression需要自己每次指定一個正則化系數(shù)。除了交叉驗證,以及選擇正則化系數(shù)C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。

logistic_regression_path類則比較特殊,它擬合數(shù)據(jù)后,不能直接來做預(yù)測,只能為擬合數(shù)據(jù)選擇合適邏輯回歸的系數(shù)和正則化系數(shù)。主要是用在模型選擇的時候。一般情況用不到這個類,所以后面不再講述logistic_regression_path類。

此外,scikit-learn里面有個容易讓人誤解的類RandomizedLogisticRegression,雖然名字里有邏輯回歸的詞,但是主要是用L1正則化的邏輯回歸來做特征選擇的,屬于維度規(guī)約的算法類,不屬于我們常說的分類算法的范疇。

后面的講解主要圍繞LogisticRegression和LogisticRegressionCV中的重要參數(shù)的選擇來來展開,這些參數(shù)的意義在這兩個類中都是一樣的。

2. 正則化選擇參數(shù):penalty

LogisticRegression和LogisticRegressionCV默認(rèn)就帶了正則化項。penalty參數(shù)可選擇的值為”l1″和”l2″.分別對應(yīng)L1的正則化和L2的正則化,默認(rèn)是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ù)可導(dǎo)的,而{‘newton-cg’, ‘lbfgs’,‘sag’}這三種優(yōu)化算法時都需要損失函數(shù)的一階或者二階連續(xù)導(dǎo)數(shù)。而‘liblinear’并沒有這個依賴。

具體使用了這4個算法有什么不同以及有什么影響我們下一節(jié)講。

3. 優(yōu)化算法選擇參數(shù):solver

solver參數(shù)決定了我們對邏輯回歸損失函數(shù)的優(yōu)化方法,有4種算法可以選擇,分別是:

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:即隨機(jī)平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區(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正則化。

從上面的描述,大家可能覺得,既然newton-cg, lbfgs和sag這么多限制,如果不是大樣本,我們選擇liblinear不就行了嘛!錯,因為liblinear也有自己的弱點!我們知道,邏輯回歸有二元邏輯回歸和多元邏輯回歸。對于多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準(zhǔn)確一些。郁悶的是liblinear只支持OvR,不支持MvM,這樣如果我們需要相對精確的多元邏輯回歸時,就不能選擇liblinear了。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了。

具體OvR和MvM有什么不同我們下一節(jié)講。

4. 分類方式選擇參數(shù):multi_class

multi_class參數(shù)決定了我們分類方式的選擇,有 ovr和multinomial兩個值可以選擇,默認(rèn)是 ovr。

ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元邏輯回歸,ovr和multinomial并沒有任何區(qū)別,區(qū)別主要在多元邏輯回歸上。

OvR的思想很簡單,無論你是多少元邏輯回歸,我們都可以看做二元邏輯回歸。具體做法是,對于第K類的分類決策,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負(fù)例,然后在上面做二元邏輯回歸,得到第K類的分類模型。其他類的分類模型獲得以此類推。

而MvM則相對復(fù)雜,這里舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類,我們每次在所有的T類樣本里面選擇兩類樣本出來,不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起,把T1作為正例,T2作為負(fù)例,進(jìn)行二元邏輯回歸,得到模型參數(shù)。我們一共需要T(T-1)/2次分類。

從上面的描述可以看出OvR相對簡單,但分類效果相對略差(這里指大多數(shù)樣本分布情況,某些樣本分布下OvR可能更好)。而MvM分類相對精確,但是分類速度沒有OvR快。

如果選擇了ovr,則4種損失函數(shù)的優(yōu)化方法liblinear,newton-cg, lbfgs和sag都可以選擇。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag了。

5. 類型權(quán)重參數(shù): class_weight

class_weight參數(shù)用于標(biāo)示分類模型中各種類型的權(quán)重,可以不輸入,即不考慮權(quán)重,或者說所有類型的權(quán)重一樣。如果選擇輸入的話,可以選擇balanced讓類庫自己計算類型權(quán)重,或者我們自己輸入各個類型的權(quán)重,比如對于0,1的二元模型,我們可以定義class_weight={0:0.9, 1:0.1},這樣類型0的權(quán)重為90%,而類型1的權(quán)重為10%。

如果class_weight選擇balanced,那么類庫會根據(jù)訓(xùn)練樣本量來計算權(quán)重。某種類型樣本量越多,則權(quán)重越低,樣本量越少,則權(quán)重越高。

那么class_weight有什么作用呢?在分類模型中,我們經(jīng)常會遇到兩類問題:

第一種是誤分類的代價很高。比如對合法用戶和非法用戶進(jìn)行分類,將非法用戶分類為合法用戶的代價很高,我們寧愿將合法用戶分類為非法用戶,這時可以人工再甄別,但是卻不愿將非法用戶分類為合法用戶。這時,我們可以適當(dāng)提高非法用戶的權(quán)重。

第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數(shù)據(jù)10000條,里面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權(quán)重,則我們可以將所有的測試集都預(yù)測為合法用戶,這樣預(yù)測準(zhǔn)確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法用戶樣本的權(quán)重。

提高了某種分類的權(quán)重,相比不考慮權(quán)重,會有更多的樣本分類劃分到高權(quán)重的類別,從而可以解決上面兩類問題。

當(dāng)然,對于第二種樣本失衡的情況,我們還可以考慮用下一節(jié)講到的樣本權(quán)重參數(shù): sample_weight,而不使用class_weight。sample_weight在下一節(jié)講。

6. 樣本權(quán)重參數(shù): sample_weight

上一節(jié)我們提到了樣本不失衡的問題,由于樣本不平衡,導(dǎo)致樣本不是總體樣本的無偏估計,從而可能導(dǎo)致我們的模型預(yù)測能力下降。遇到這種情況,我們可以通過調(diào)節(jié)樣本權(quán)重來嘗試解決這個問題。調(diào)節(jié)樣本權(quán)重的方法有兩種,第一種是在class_weight使用balanced。第二種是在調(diào)用fit函數(shù)時,通過sample_weight來自己調(diào)節(jié)每個樣本權(quán)重。

在scikit-learn做邏輯回歸時,如果上面兩種方法都用到了,那么樣本的真正權(quán)重是class_weight*sample_weight.

以上就是scikit-learn中邏輯回歸類庫調(diào)參的一個小結(jié),還有些參數(shù)比如正則化參數(shù)C(交叉驗證就是 Cs),迭代次數(shù)max_iter等,由于和其它的算法類庫并沒有特別不同,這里不多累述了。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }