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_weigh t: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、_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、_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
del_selection import train_test_split
from sklearn.datasets import load_iris
ics 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)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。