sklearn的邏輯回歸Logistic Regression(LR)

1. 概述

在scikit-learn中痊远,與邏輯回歸有關(guān)的主要是這3個類灌旧。LogisticRegression后添, LogisticRegressionCV 和logistic_regression_path物臂。其中LR和LR-CV的主要區(qū)別是LR-CV使用了交叉驗證來選擇正則化系數(shù)C笛丙。而LR需要自己每次指定一個正則化系數(shù)颇蜡。除了交叉驗證价说,以及選擇正則化系數(shù)C以外辆亏,兩者其他的使用方法基本相同。
    LR-path類則比較特殊鳖目,它擬合數(shù)據(jù)后扮叨,不能直接來做預(yù)測,只能為擬合數(shù)據(jù)選擇合適邏輯回歸的系數(shù)和正則化系數(shù)领迈。主要是用在模型選擇的時候彻磁。一般情況用不到這個類。此外狸捅,scikit-learn里面有個容易讓人誤解的類RandomizedLogisticRegression,雖然名字里有邏輯回歸的詞衷蜓,但是主要是用L1正則化的邏輯回歸來做特征選擇的,屬于維度規(guī)約的算法類尘喝,不屬于我們常說的分類算法的范疇磁浇。

2.Parameters
penalty :正則化

penalty : str, 'l1' or 'l2', default: 'l2'
在調(diào)參時如果我們主要的目的只是為了解決過擬合,一般penalty選擇L2正則化就夠了朽褪。但是如果選擇L2正則化發(fā)現(xiàn)還是過擬合置吓,即預(yù)測效果差的時候,就可以考慮L1正則化鞍匾。另外交洗,如果模型的特征非常多,我們希望一些不重要的特征系數(shù)歸零橡淑,從而讓模型系數(shù)稀疏化的話构拳,也可以使用L1正則化。
penalty參數(shù)的選擇會影響我們損失函數(shù)優(yōu)化算法的選擇梁棠。即參數(shù)solver的選擇置森,如果是L2正則化,那么5種可選的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’符糊,‘saga’}都可以選擇凫海。但是如果penalty是L1正則化的話,就只能選擇‘liblinear’了男娄。這是因為L1正則化的損失函數(shù)不是連續(xù)可導的行贪,而{‘newton-cg’, ‘lbfgs’,‘sag’,‘saga’}這四種優(yōu)化算法時都需要損失函數(shù)的一階或者二階連續(xù)導數(shù)模闲。而‘liblinear’并沒有這個依賴建瘫。

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

solver : {'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'},default: 'liblinear'
solver參數(shù)決定了我們對邏輯回歸損失函數(shù)的優(yōu)化方法,有5種算法可以選擇尸折,分別是:
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ù)多的時候籍嘹,SAG是一種線性收斂算法栅组,這個速度遠比SGD快棕兼。
e)saga:

從上面的描述可以看出宴猾,newton-cg, lbfgs和sag這三種優(yōu)化算法時都需要損失函數(shù)的一階或者二階連續(xù)導數(shù)圆存,因此不能用于沒有連續(xù)導數(shù)的L1正則化,只能用于L2正則化仇哆。而liblinear通吃L1正則化和L2正則化沦辙。
同時,sag每次僅僅使用了部分樣本進行梯度迭代讹剔,所以當樣本量少的時候不要選擇它油讯,而如果樣本量非常大,比如大于10萬延欠,sag是第一選擇陌兑。但是sag不能用于L1正則化,所以當你有大量的樣本由捎,又需要L1正則化的話就要自己做取舍了兔综。要么通過對樣本采樣來降低樣本量,要么回到L2正則化狞玛。
邏輯回歸有二元邏輯回歸和多元邏輯回歸软驰。對于多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準確一些心肪。liblinear只支持OvR锭亏,不支持MvM,這樣如果我們需要相對精確的多元邏輯回歸時硬鞍,就不能選擇liblinear了慧瘤。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了。
總結(jié)而言固该,liblinear支持L1和L2锅减,只支持OvR做多分類,“l(fā)bfgs”, “sag” “newton-cg”只支持L2蹬音,支持OvR和MvM做多分類上煤。

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

multi_class : str, {'ovr', 'multinomial'}, default: 'ovr'
ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)著淆。如果是二元邏輯回歸劫狠,ovr和multinomial并沒有任何區(qū)別拴疤,區(qū)別主要在多元邏輯回歸上。
OvR的思想很簡單独泞,無論你是多少元邏輯回歸呐矾,我們都可以看做二元邏輯回歸。具體做法是懦砂,對于第K類的分類決策蜒犯,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負例荞膘,然后在上面做二元邏輯回歸罚随,得到第K類的分類模型。其他類的分類模型獲得以此類推羽资。
而MvM則相對復(fù)雜淘菩,這里舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類屠升,我們每次在所有的T類樣本里面選擇兩類樣本出來潮改,不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起腹暖,把T1作為正例汇在,T2作為負例,進行二元邏輯回歸脏答,得到模型參數(shù)糕殉。我們一共需要T(T-1)/2次分類。
從上面的描述可以看出OvR相對簡單以蕴,但分類效果相對略差(這里指大多數(shù)樣本分布情況糙麦,某些樣本分布下OvR可能更好)。而MvM分類相對精確丛肮,但是分類速度沒有OvR快赡磅。
如果選擇了ovr,則5種損失函數(shù)的優(yōu)化方法liblinear宝与,newton-cg, lbfgs和sag都可以選擇焚廊。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag,saga了习劫。

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

class_weight : dict or 'balanced', default: None
class_weight參數(shù)用于標示分類模型中各種類型的權(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ù)訓練樣本量來計算權(quán)重匕积。某種類型樣本量越多盈罐,則權(quán)重越低,樣本量越少闪唆,則權(quán)重越高盅粪。
sklearn的官方文檔中,當class_weight為balanced時苞氮,類權(quán)重計算方法如下:
n_samples / (n_classes * np.bincount(y))湾揽,n_samples為樣本數(shù),n_classes為類別數(shù)量笼吟,np.bincount(y)會輸出每個類的樣本數(shù),例如y=[1,0,0,1,1],則np.bincount(y)=[2,3]
那么class_weight有什么作用呢霸旗?在分類模型中贷帮,我們經(jīng)常會遇到兩類問題:
第一種是誤分類的代價很高。比如對合法用戶和非法用戶進行分類诱告,將非法用戶分類為合法用戶的代價很高撵枢,我們寧愿將合法用戶分類為非法用戶,這時可以人工再甄別精居,但是卻不愿將非法用戶分類為合法用戶锄禽。這時,我們可以適當提高非法用戶的權(quán)重靴姿。
第二種是樣本是高度失衡的沃但,比如我們有合法用戶和非法用戶的二元樣本數(shù)據(jù)10000條,里面合法用戶有9995條佛吓,非法用戶只有5條宵晚,如果我們不考慮權(quán)重,則我們可以將所有的測試集都預(yù)測為合法用戶维雇,這樣預(yù)測準確率理論上有99.95%淤刃,但是卻沒有任何意義。這時吱型,我們可以選擇balanced逸贾,讓類庫自動提高非法用戶樣本的權(quán)重。
提高了某種分類的權(quán)重,相比不考慮權(quán)重铝侵,會有更多的樣本分類劃分到高權(quán)重的類別掂名,從而可以解決上面兩類問題。
當然哟沫,對于第二種樣本失衡的情況饺蔑,我們還可以考慮用下一節(jié)講到的樣本權(quán)重參數(shù): sample_weight。

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

上一節(jié)我們提到了樣本不失衡的問題嗜诀,由于樣本不平衡猾警,導致樣本不是總體樣本的無偏估計,從而可能導致我們的模型預(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.

3.Attibutes
  1. coef_: 變量中的系數(shù)悼泌。shape (1, n_features) or (n_classes, n_features)
  2. intercept_:截距松捉。shape (1,) or (n_classes,)
  3. n_iter_ :所有類的實際迭代次數(shù)。shape (n_classes,) or (1, )
4.Methods
  • (1)decision_function(X):預(yù)測樣本的 confidence scores
  • (2)densify():將系數(shù)矩陣轉(zhuǎn)化成密集矩陣的格式
  • (3)fit(X, y[, sample_weight]):根據(jù)給出的訓練數(shù)據(jù)來訓練模型馆里。用來訓練LR分類器隘世,其中X是訓練樣本,y是對應(yīng)的標記樣本鸠踪。
  • (4)get_params([deep]):Get parameters for this estimator.
  • (5)predict(X):用來預(yù)測測試樣本的標記丙者,也就是分類。預(yù)測x的標簽
  • (6)predict_log_proba(X):對數(shù)概率估計
  • (7)predict_proba(X):概率估計
  • (8)score(X, y[, sample_weight]):返回給定的測試數(shù)據(jù)和標簽的平均精度
  • (9)set_params(**params):設(shè)置estimate的參數(shù)
  • (10)sparsify():將系數(shù)矩陣轉(zhuǎn)換成稀疏矩陣格式营密。
penalty : str, 'l1' or 'l2', default: 'l2'
    Used to specify the norm used in the penalization. The 'newton-cg',
    'sag' and 'lbfgs' solvers support only l2 penalties... versionadded:: 0.19
    l1 penalty with SAGA solver (allowing 'multinomial' + L1)

dual : bool, default: False
    Dual or primal formulation. Dual formulation is only implemented for
    l2 penalty with liblinear solver. Prefer dual=False when
    n_samples > n_features.

tol : float, default: 1e-4
    Tolerance for stopping criteria.

C : float, default: 1.0
    Inverse of regularization strength; must be a positive float.
    Like in support vector machines, smaller values specify stronger
    regularization.

fit_intercept : bool, default: True
    Specifies if a constant (a.k.a. bias or intercept) should be
    added to the decision function.

intercept_scaling : float, default 1.
    Useful only when the solver 'liblinear' is used
    and self.fit_intercept is set to True. In this case, x becomes
    [x, self.intercept_scaling],
    i.e. a "synthetic" feature with constant value equal to
    intercept_scaling is appended to the instance vector.
    The intercept becomes ``intercept_scaling * synthetic_feature_weight``.

    Note! the synthetic feature weight is subject to l1/l2 regularization
    as all other features.
    To lessen the effect of regularization on synthetic feature weight
    (and therefore on the intercept) intercept_scaling has to be increased.

class_weight : dict or 'balanced', default: None
    Weights associated with classes in the form ``{class_label: weight}``.
    If not given, all classes are supposed to have weight one.

    The "balanced" mode uses the values of y to automatically adjust
    weights inversely proportional to class frequencies in the input data
    as ``n_samples / (n_classes * np.bincount(y))``.

    Note that these weights will be multiplied with sample_weight (passed
    through the fit method) if sample_weight is specified.

    .. versionadded:: 0.17
       *class_weight='balanced'*

random_state : int, RandomState instance or None, optional, default: None
    The seed of the pseudo random number generator to use when shuffling
    the data.  If int, random_state is the seed used by the random number
    generator; If RandomState instance, random_state is the random number
    generator; If None, the random number generator is the RandomState
    instance used by `np.random`. Used when ``solver`` == 'sag' or
    'liblinear'.

solver : {'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'},
    default: 'liblinear'
    Algorithm to use in the optimization problem.

    - For small datasets, 'liblinear' is a good choice, whereas 'sag' and
        'saga' are faster for large ones.
    - For multiclass problems, only 'newton-cg', 'sag', 'saga' and 'lbfgs'
        handle multinomial loss; 'liblinear' is limited to one-versus-rest
        schemes.
    - 'newton-cg', 'lbfgs' and 'sag' only handle L2 penalty, whereas
        'liblinear' and 'saga' handle L1 penalty.

    Note that 'sag' and 'saga' fast convergence is only guaranteed on
    features with approximately the same scale. You can
    preprocess the data with a scaler from sklearn.preprocessing.

    .. versionadded:: 0.17
       Stochastic Average Gradient descent solver.
    .. versionadded:: 0.19
       SAGA solver.

max_iter : int, default: 100
    Useful only for the newton-cg, sag and lbfgs solvers.
    Maximum number of iterations taken for the solvers to converge.

multi_class : str, {'ovr', 'multinomial'}, default: 'ovr'
    Multiclass option can be either 'ovr' or 'multinomial'. If the option
    chosen is 'ovr', then a binary problem is fit for each label. Else
    the loss minimised is the multinomial loss fit across
    the entire probability distribution. Does not work for liblinear
    solver.

    .. versionadded:: 0.18
       Stochastic Average Gradient descent solver for 'multinomial' case.

verbose : int, default: 0
    For the liblinear and lbfgs solvers set verbose to any positive
    number for verbosity.

warm_start : bool, default: False
    When set to True, reuse the solution of the previous call to fit as
    initialization, otherwise, just erase the previous solution.
    Useless for liblinear solver.

    .. versionadded:: 0.17
       *warm_start* to support *lbfgs*, *newton-cg*, *sag*, *saga* solvers.

n_jobs : int, default: 1
    Number of CPU cores used when parallelizing over classes if
    multi_class='ovr'". This parameter is ignored when the ``solver``is set
    to 'liblinear' regardless of whether 'multi_class' is specified or
    not. If given a value of -1, all cores are used.
最后編輯于
?著作權(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)容