LogisticRegression
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)
- penalty='l2' : 字符串‘l1’或‘l2’,默認‘l2’夺姑。
- 用來指定懲罰的基準(正則化參數(shù))拴泌。只有‘l2’支持‘newton-cg’锰霜、‘sag’和‘lbfgs’這三種算法。
- 如果選擇‘l2’澎迎,solver參數(shù)可以選擇‘liblinear’、‘newton-cg’球凰、‘sag’和‘lbfgs’這四種算法拄氯;如果選擇‘l1’的話就只能用‘liblinear’算法。
- dual=False : 對偶或者原始方法锦针。Dual只適用于正則化相為l2的‘liblinear’的情況荠察,通常樣本數(shù)大于特征數(shù)的情況下,默認為False奈搜。
- C=1.0 : C為正則化系數(shù)λ的倒數(shù)悉盆,必須為正數(shù),默認為1馋吗。和SVM中的C一樣焕盟,值越小,代表正則化越強宏粤。
- fit_intercept=True : 是否存在截距脚翘,默認存在。
- intercept_scaling=1 : 僅在正則化項為‘liblinear’绍哎,且fit_intercept設置為True時有用来农。
- solver='liblinear' : solver參數(shù)決定了我們對邏輯回歸損失函數(shù)的優(yōu)化方法,有四種算法可以選擇崇堰。
- 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ù)多的時候薄风。
從上面的描述可以看出饵较,newton-cg、lbfgs和sag這三種優(yōu)化算法時都需要損失函數(shù)的一階或者二階連續(xù)導數(shù)村刨,因此不能用于沒有連續(xù)導數(shù)的L1正則化告抄,只能用于L2正則化。而liblinear通吃L1正則化和L2正則化嵌牺。
同時打洼,sag每次僅僅使用了部分樣本進行梯度迭代,所以當樣本量少的時候不要選擇它逆粹,而如果樣本量非常大募疮,比如大于10萬,sag是第一選擇僻弹。但是sag不能用于L1正則化阿浓,所以當你有大量的樣本,又需要L1正則化的話就要自己做取舍了蹋绽。要么通過對樣本采樣來降低樣本量芭毙,要么回到L2正則化。
但是liblinear也有自己的弱點卸耘!我們知道退敦,邏輯回歸有二元邏輯回歸和多元邏輯回歸。對于多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種蚣抗。而MvM一般比OvR分類相對準確一些侈百。而liblinear只支持OvR,不支持MvM翰铡,這樣如果我們需要相對精確的多元邏輯回歸時钝域,就不能選擇liblinear了。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了锭魔。
- multi_class='ovr' : 分類方式例证。ovr即one-vs-rest(OvR),multinomial是many-vs-many(MvM)赂毯。如果是二元邏輯回歸战虏,ovr和multinomial并沒有任何區(qū)別拣宰,區(qū)別主要在多元邏輯回歸上党涕。
ovr不論是幾元回歸烦感,都當成二元回歸來處理。mvm從從多個類中每次選兩個類進行二元回歸膛堤。如果總共有T類手趣,需要T(T-1)/2次分類。
OvR相對簡單肥荔,但分類效果相對略差(大多數(shù)樣本分布情況)绿渣。而MvM分類相對精確,但是分類速度沒有OvR快燕耿。
如果選擇了ovr中符,則4種損失函數(shù)的優(yōu)化方法liblinear,newton-cg,lbfgs和sag都可以選擇伶丐。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag了怎炊。 - class_weight=None : 類型權(quán)重參數(shù)亚亲。用于標示分類模型中各種類型的權(quán)重。默認不輸入档插,即所有的分類的權(quán)重一樣。
- 選擇‘balanced’自動根據(jù)y值計算類型權(quán)重亚再。
- 自己設置權(quán)重郭膛,格式:{class_label: weight}。例如0,1分類的er'yuan二元模型氛悬,設置class_weight={0:0.9, 1:0.1}则剃,這樣類型0的權(quán)重為90%,而類型1的權(quán)重為10%如捅。
- random_state=None : 隨機數(shù)種子棍现,默認為無。僅在正則化優(yōu)化算法為sag,liblinear時有用伪朽。
- max_iter=100 : 算法收斂的最大迭代次數(shù)轴咱。
tol=0.0001 : 迭代終止判據(jù)的誤差范圍。 - verbose=0 : 日志冗長度int:冗長度烈涮;0:不輸出訓練過程朴肺;1:偶爾輸出; >1:對每個子模型都輸出
- warm_start=False : 是否熱啟動坚洽,如果是戈稿,則下一次訓練是以追加樹的形式進行(重新使用上一次的調(diào)用作為初始化)。布爾型讶舰,默認False鞍盗。
- n_jobs=1 : 并行數(shù)需了,int:個數(shù);-1:跟CPU核數(shù)一致般甲;1:默認值肋乍。
參考代碼
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import cross_val_score
# 1.加載數(shù)據(jù)
iris = datasets.load_iris()
X = iris.data[:, :2] # 使用前兩個特征
Y = iris.target
# 2.拆分測試集、訓練集敷存。
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
# 設置隨機數(shù)種子墓造,以便比較結(jié)果。
# 3.標準化特征值
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
num = 0
# 4. 訓練邏輯回歸模型
logreg = linear_model.LogisticRegression(penalty='l2',C=1e5,multi_class="ovr")
logreg.fit(X_train_std, Y_train)
# 5. 預測
predic = logreg.predict(X_test_std)
# p = np.mean(predic == Y_test)
for i in X_test_std:
print(i,Y_test[num],predic[num])
num += 1
prepro = logreg.predict_proba(X_test_std)
acc = logreg.score(X_test_std,Y_test)
print(prepro)
scores = cross_val_score(logreg,X_train_std,Y_train)
print(np.mean(scores))