sklearn——邏輯回歸、ROC曲線與KS曲線


一、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曲線的時候要注意:

  1. 當我們用model.predict()方法的時候得到的是類別標簽,例如二分類則預測之為0或1,不會得到邏輯回歸的預測概率。
  2. 為了得到邏輯回歸的預測概率需要用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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM