一、sklearn中邏輯回歸的相關類
在sklearn的邏輯回歸中,主要用LogisticRegression和LogisticRegressionCV兩個類來構建模型,兩者的區別僅在於交叉驗證與正則化系數C,下面介紹兩個類(重要參數帶**加綠):
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:可選'l1'、'l2',正則化系數。注意'l1'不適用於MVM的情況。
- dual:一個布爾值。如果為True,則求解對偶形式(只是在penalty='l2' 且solver='liblinear' 有對偶形式);如果為False,則求解原始形式。這個參數一般不需要理會。
- C:一個浮點數,它指定了正則化系數的倒數。如果它的值越小,則正則化越大。建議為10。
- fit_intercept:一個布爾值,制定是否需要截距 值。如果為False,則不會計算b值(模型會假設你的數據已經中心化)。一般都需要截距,這個也可以不理會。
- intercept_scaling:一個浮點數,只有當 solver='liblinear' 才有意義。當采用 fit_intercept 時,相當於人造一個特征出來,該特征恆為 1,其權重為 b 。在計算正則化項的時候,該人造特征也被考慮了。因此為了降低人造特征的影響,需要提供 intercept_scaling。不需要理會。
- class_weight:Y的類別權重,一個字典或者字符串'balanced'。 如果為字典:則以字典方式給出了每個分類的權重,如{class_1:0.4,class_2:0.6}。 如果為字符串 'balanced':則自動計算權重,樣本量越小的權重越高。 如果未指定,則每個分類的權重都為 1。
- random_state:一個整數或者一個RandomState實例,或者None。 •如果為整數,則它指定了隨機數生成器的種子。 •如果為RandomState實例,則指定了隨機數生成器。 •如果為None,則使用默認的隨機數生成器。一般不需要理會。
- solver:一個字符串,指定了求解最優化問題的算法,可以為如下的值。 'newton-cg':使用牛頓法。'lbfgs':使用L-BFGS擬牛頓法。'liblinear' :使用 liblinear。'sag':使用 Stochastic Average Gradient descent 算法。 注意: 對於規模小的數據集,'liblearner'比較適用;對於規模大的數據集,'sag'比較適用。'newton-cg'、'lbfgs'、'sag' 只處理penalty=‘12’的情況。
- max_iter:一個整數,指定最大迭代數。可以默認或者自行調整。
- multi_class:一個字符串,指定對於多分類問題的策略,可以為如下的值。 •'ovr' :采用 one-vs-rest 策略。 •'multinomial':直接采用多分類邏輯回歸策略,sklearn采用的是sofmax函數的方法。注意多分類要先將Y轉化為one-hot數據。
- verbose:一個正數。用於開啟/關閉迭代中間輸出的日志。
- warm_start:一個布爾值。如果為True,那么使用前一次訓練結果繼續訓練,否則從頭開始訓練。
- n_jobs:一個正數。指定任務並行時的 CPU 數量。如果為 -1 則使用所有了用的 CPU。
另一個類只介紹參數不一樣的部分
sklearn.linear_model.LogisticRegressionCV(Cs=10, fit_intercept=True, cv=None, dual=False, penalty='l2', scoring=None, solver='lbfgs', tol=0.0001, max_iter=100, class_weight=None, n_jobs=1, verbose=0, refit=True, intercept_scaling=1.0, multi_class='ovr', random_state=None)
- Cs:正則化系數,建議默認即可。
- cv:默認為分層k折交叉驗證Stratified K-Folds,如果是整數則制定交叉驗證的折數。
假設我們創建了一個模型model= sklearn.linear_model.LogisticRegression(),如果要計算AUC並畫出ROC曲線的時候要注意:
- 當我們用model.predict()方法的時候得到的是類別標簽,例如二分類則預測之為0或1,不會得到邏輯回歸的預測概率。
- 為了得到邏輯回歸的預測概率需要用model.predict_proba(x_test)方法,注意這個方法返回的是形狀為i*j列的數組,i為樣本數,j為類別數,ij表示第i個樣本是j類的概率;並且第i個樣本的所有類別概率和為1。
二、sklearn的ROC及KS相關類
1、sklearn.metrics.roc_auc_score(y_true, y_score, average=’macro’, sample_weight=None, max_fpr=None)
- y_true:0、1的binary類型標簽。
- y_score:y的預測值。
- average:返回值的平均方式,有 [None, ‘micro’, ‘macro’ (default), ‘samples’, ‘weighted’]幾種。
- max_fpr:設置最大的fpr,取None即可。
返回值:float類型的auc值,即ROC曲線下的面積。
2、sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
- y_true:0、1的binary類型標簽。
- y_score:y的預測值。
- pos_label:分類為正類的標簽,如果是(0,1)、(-1,1)默認1為分類為正類。
- sample_weight:樣本權重。
- drop_intermediate:是否取出一些欠佳的閾值,取出欠佳閾值可以做出更好的ROC曲線。
返回值:fpr、tpr、thresholds ,返回三個向量,里面分別儲存了不通閾值對應fpr和tpr,可以用來用來畫出ROC曲線,同時求出最大KS對應的閾值。
三、代碼示例
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris from sklearn.metrics import roc_auc_score,roc_curve import matplotlib.pyplot as plt import numpy as np iris=load_iris() iris.target[iris.target==1],iris.target[iris.target==2]=0,1 #將iris的三類數據轉化為二類數據,labels=1與labels=0合並為0,labels=2轉化為1 x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.3) #拆分訓練集與測試集 model=LogisticRegression(solver='newton-cg',multi_class='ovr') #創建模型 model.fit(x_train,y_train) #傳入訓練數據 #預測測試數據的lr概率值,返回i*j列的數據,i為樣本數,j為類別數,ij表示第i個樣本是j類的概率;第i個樣本的所有類別概率和為1。 # 這里不能用model.predict(),因為輸出的是0或1,並不是概率值,不能對后續的roc曲線進行計算 #另外model._predict_proba_lr可以用來計算的lr概率值 y_pre=model.predict_proba(x_test) y_0=list(y_pre[:,1]) #取第二列數據,因為第二列概率為趨於0時分類類別為0,概率趨於1時分類類別為1 fpr,tpr,thresholds=roc_curve(y_test,y_0) #計算fpr,tpr,thresholds auc=roc_auc_score(y_test,y_0) #計算auc #畫曲線圖 plt.figure() plt.plot(fpr,tpr) plt.title('$ROC curve$') plt.show() #計算ks KS_max=0 best_thr=0 for i in range(len(fpr)): if(i==0): KS_max=tpr[i]-fpr[i] best_thr=thresholds[i] elif (tpr[i]-fpr[i]>KS_max): KS_max = tpr[i] - fpr[i] best_thr = thresholds[i] print('最大KS為:',KS_max) print('最佳閾值為:',best_thr)