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)

猜你喜欢

转载自www.cnblogs.com/dwithy/p/11583612.html