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
- coef_: 變量中的系數(shù)悼泌。shape (1, n_features) or (n_classes, n_features)
- intercept_:截距松捉。shape (1,) or (n_classes,)
- 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.