1.1 scikit-learn參數介紹
1.1.1 導入
from sklearn.linear_model import LogisticRegression
1.1.2 版本
scikit-learn==0.21.3
1.1.3 參數
1.1.3.1 penalty
l1、l2、elasticnet、none,默認l2
l1: l1正則,鄰回歸
l2: l2正則,套索回歸
elasticnet: 彈性網絡,是鄰回歸和套索回歸的正則項的混合
none: 什么都不加
在調參時如果我們主要的目的只是為了解決過擬合,一般penalty選擇L2正則化就夠了。但是如果選擇L2正則化發現還是過擬合,即預測效果差的時候,就可以考慮彈性網絡和L1正則化,彈性網絡優於L1正則,因為當特征數量超過訓練實例數量,又或者是幾個特征強相關時,L1正則的表現可能非常不穩定。另外,如果模型的特征非常多,我們希望一些不重要的特征系數歸零,從而讓模型系數稀疏化的話,也可以使用L1正則化。
penalty參數的選擇會影響損失函數優化算法的選擇,即參數solver的選擇。
若是L2正則,有4種可選的算法:“newton-cg”,“lbfgs”,“liblinear”,“sag”,
若是L1正則,有1種可選的算法:“liblinear”,L1正則化的損失函數不是連續可導的。
若是elasticnet,有1種可選的算法:“saga”
若是none,不支持的算法:“liblinear”
1.1.3.2 dual
布爾類型,True/False,默認False
dual只適用於正則化項為l2 liblinear的情況,通常樣本數>特征數的情況下,dual=False。
1.1.3.3 tol
浮點型,默認為1e-4
停止判則的容忍度(誤差)。
1.1.3.4 C
正浮點型,默認1.0
C為正則化系數 的逆,即為 。像在SVM中,較小的值指定更強的正則化。
1.1.3.5 fit_intercept
布爾類型,True/False,默認為True
是否存在截距。
1.1.3.6 intercept_scaling
浮點型,默認為1
僅僅在solve=liblinear,並且fit_intercept=True時有用
截距intercept= intercept_scaling * synthetic_feature_weight
當存在截距時,相當於一個合成特性的常量值等於截距,被附加到實例向量。synthetic_feature_weight相當於是原先的截距,是合成特征的常量值,設置intercept_scaling相當於更新截距,一般默認為1。
注意:綜合特征權重與其他特征一樣,服從L1/L2正則化。為了減少正則化對合成特征權重(截距)的影響,必須增加截距尺度。
1.1.3.7 class_weight
字典類型或者“balanced”,默認None
字典類型格式:{class_label: weight}
class_weight='balanced'時,class_weight = n_samples / (n_classes * np.bincount(y)),即權重=總樣本數/(分類類別個數*每個類別的樣本數),使得各類別的權重是一樣的。
比如說二分類,0:40,1:60,那么0類型每個樣本所占的權重就是100/(2*40)=5/4, 1類型每個樣本所占的權重就是100/(2*60)=5/6, 5/4*40:5/6*60=1:1
在0.17版本中默認為balanced
Note:
在分類模型中,我們經常會遇到兩類問題:
第一種是誤分類的代價很高。比如對合法用戶和非法用戶進行分類,將非法用戶分類為合法用戶的代價很高,我們寧願將合法用戶分類為非法用戶,這時可以人工再甄別,但是卻不願將非法用戶分類為合法用戶。這時,我們可以適當提高非法用戶的權重。
第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數據10000條,里面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測為合法用戶,這樣預測准確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法用戶樣本的權重。
提高了某種分類的權重,相比不考慮權重,會有更多的樣本分類划分到高權重的類別,從而可以解決上面兩類問題。
當然,對於第二種樣本失衡的情況,我們還可以考慮用下一節講到的樣本權重參數: sample_weight,而不使用class_weight。
1.1.3.8 random_state
整數類型,默認None
隨機種子,偽隨機數生成器的種子,在重新排序數據的時候使用,如果隨機種子不變,數據排序位置不變。如果random_state=None,那么random_state是一個隨機數。在solver == ‘sag’ or ‘liblinear’的時候被使用。
1.1.3.9 solver
字符串,‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’,默認是’ liblinear’
算法,用於最優化問題。具體原理如下詳細講述。
a) liblinear:liblinear是一個針對線性分類場景而設計的工具包,支持線性的SVM和Logistic回歸等,但是無法通過定義核函數的方式實現非線性分類。使用了開源的liblinear庫實現,內部使用了坐標軸下降法來迭代優化損失函數。
b) lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
c) newton-cg:也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。
d) sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合於樣本數據多的時候。
e) saga: 快速梯度下降
在小數據集上,‘liblinear’是一個好的選擇,‘sag’ 和 ‘saga’用於大數據集上。
對於多分類問題,僅僅是‘newton-cg’, ‘sag’, ‘saga’ ,‘lbfgs’可以處理多分類損失。
‘newton-cg’, ‘lbfgs’, ‘sag’, ‘saga’能處理L2正則或none
‘liblinear’, ‘saga’能處理L1正則
‘saga’也支持elasticnet(彈性網絡)
‘liblinear’不支持penalty=’none’,只能處理一對多的多元邏輯回歸。
注:‘sag’, ‘saga’僅在特征比例大致相同時可以快速收斂。可以從sklearn.preprocessing中處理數據。
在0.17版本中有隨機平均梯度下降算法。
在0.19版本中有SAGA算法。
在0.20版本中設置了警告,在0.22版本中默認值會從’liblinear’轉變為’ lbfgs’。
1.1.3.10 max_iter
整數類型,默認100
算法收斂的最大迭代次數。用於迭代最優的參數。
Note:
如果設置太低,算法可能在離最優解還很遠時就停了;如果設置得太高,模型達到最優解后,繼續迭代參數不再變化,又會浪費時間。一個簡單的辦法是,在開始時設置一個非常大的迭代次數,但是當梯度向量的值變得很微小時中斷算法-也就是它的范數變得低於ε(稱為容差)時,這時梯度下降幾乎達到了最小值。
1.1.3.11 multi_class
字符串類型,’ovr’, ‘multinomial’, ‘auto’,默認為’ovr’
ovr: one-vs-rest(OvR)一對多(用於多元邏輯回歸),一類設為1,其他類設為0
multinomial: many-vs-many(MvM),多對多,多項式
auto: 自動
如果選擇’ovr’,二分類問題適用於每個標簽。對於多項式,損失最小化是多項式損失符合整個概率分布,即使數據是二分類。
‘multinomial’在solver=’liblinear’時是不可用的。
當數據是二分類,或者solver=’liblinear’時,若multi_class=’auto’,則設置為’ovr’,否則的話設置為’multinomial’。
在0.18版本中,隨機平均梯度下降用於’multinomial’。
在0.20版本中設置了警告,在0.22版本中默認值會從’ovr’改成’auto’。
Note:
OvR的思想很簡單,無論你是多少元邏輯回歸,我們都可以看做二元邏輯回歸。具體做法是,對於第K類的分類決策,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負例,然后在上面做二元邏輯回歸,得到第K類的分類模型。其他類的分類模型獲得以此類推。
而MvM則相對復雜,這里舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類,我們每次在所有的T類樣本里面選擇兩類樣本出來,不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起,把T1作為正例,T2作為負例,進行二元邏輯回歸,得到模型參數。我們一共需要T(T-1)/2次分類。
可以看出OvR相對簡單,但分類效果相對略差(這里指大多數樣本分布情況,某些樣本分布下OvR可能更好)。而MvM分類相對精確,但是分類速度沒有OvR快。
1.1.3.12 verbose
整數,默認為0
日志冗長度。
verbose=0,不輸出訓練過程
verbose=1,偶爾輸出
verbose>1,對每個子模型都輸出
對’liblinear’和’lbfgs’算法設置任何正整數的日志冗長度。
1.1.3.13 warm_start
布爾類型,True/False,默認為False
當在相同的數據集上反復擬合一個估計值,但是對於多個參數值(例如在網格搜索中查找性能最大化的值),可以重用從以前的參數值中學到的模型,來節省時間。當warm_start=True,重用上一個調用的解決方案來適應初始化。當warm_start=False,將上一次的解決方案擦除。對’liblinear’算法不起作用。
在0.17版本中支持lbfgs, newton-cg, sag, saga算法。
1.1.3.14 n_jobs
整數 或者 None,默認為None
n_jobs為cpu核數,當多類並行操作時且multi_class=’ovr’。
當solver=’liblinear’,不管’ multi_class’ 是否有規定,n_jobs這個參數會被忽略。
n_jobs=None,代表1,除非在joblib.parallel_backend環境中(為-1),n_jobs=-1,意味着使用所有的處理器。
1.1.3.15 l1_ratio
浮點型類型 或者 None,默認為None
Elastic-Net(彈性網絡)主要參數,l1_ratio的取值范圍為:0 <= l1_ratio <= 1,當penalty='elasticnet'才有用。l1_ratio=0等價於penalty='l2';l1_ratio=1等價於penalty='l1';當0 < l1_ratio <1時,介於L1和L2之間。l1_ratio即為彈性網絡的混合比例。
1.1.4 屬性
1.1.4.1 classes_
輸出array類型
y標簽(分類器)的類別列表
1.1.4.2 coef_
輸出array類型
目標函數的特征系數。
當為二分類問題時,coef_的形狀為shape(1, n_features);當multi_class='multinomial'時,coef_對應的結果為1(True),-coef_對應的結果為0(False)
1.1.4.3 intercept_
截距。
如果fit_intercept=False,截距為0。當為二分類問題時,intercept_的形狀為shape(1, n_features);當multi_class='multinomial',intercept_對應的結果為1,-intercept_對應的結果為0。
1.1.4.4 n_iter_
所有類的實際迭代次數。二分類或多分類僅返回一個元素。對於二分類結果,僅返回分類中迭代次數最大的一個。
在0.20版本中,在SciPy <= 1.0.0中,lbfgs迭代次數的個數可能會超過最大迭代次數max_iter。n_iter會報告為最大的迭代次數max_iter。
1.1.5 方法
1.1.5.1 decision_function
return:
shape=(n_samples,) if n_classes == 2 else (n_samples, n_classes)
decision_function(self, X)
預測樣本的置信度
X:訓練集X
1.1.5.2 densify
densify(self)
將系數矩陣轉換為密集陣列格式。
1.1.5.3 fit
fit(self, X, y, sample_weight=None)
根據給定的訓練數據擬合模型。返回一個對象。
X:訓練集X
y:訓練集y
sample_weight:每個樣本的權重
sample_weight是用來調節每個樣本的權重。在scikit-learn做邏輯回歸時,class_weight和sample_weight均使用,則樣本真正權重為class_weight*sample_weight
1.1.5.4 get_params
get_params(self, deep=True)
獲取這個估計器的參數。返回 {}參數名稱:值} 的字典格式。
deep:布爾類型,默認True
如果為真,那么返回此估計器和包含的子對象的參數。
1.1.5.5 predict
predict(self, X)
預測樣本在X中的分類標簽。
X:測試集或驗證集
1.1.5.6 predict_log_proba
predict_log_proba(self, X)
概率估計的對數。所有類的返回估計值由類的標簽排序。
X:測試集或驗證集
1.1.5.7 predict_proba
predict_proba(self, X)
概率估計。所有類的返回估計值由類的標簽排序。
X::測試集或驗證集
對於多分類問題,如果multi_class= “multinomial”,那么通過softmax函數每一個分類都有一個預測概率;否則的話,使用one_vs_rest(一對其他)的方法,使用邏輯回歸函數計算每個分類假設為正的概率,並且在所有分類中規范化這些值。
1.1.5.8 score
score(self, X, y, sample_weight=None)
返回給定訓練數據和標簽的平均准確率。
X:訓練集X
y:訓練集y
sample_weight:每個樣本的權重
在多標簽分類中,這是子集精度,這是一個苛刻的度量標准,因為您需要對每個樣本的每個標簽集進行正確的預測。
1.1.5.9 set_params
set_params(self, **params)
設置該估計器的參數。
1.1.5.10 sparsify
sparsify(self)
將系數矩陣轉換為稀疏格式(稀疏矩陣),返回該估計器。