sklearn——逻辑回归、ROC曲线与KS曲线

分类: 365易贷的钱还能拿回么 发布时间: 2025-08-23 01:36:17 作者: admin 阅读: 4249
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曲线的时候要注意:

当我们用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)

相关文章

首都医科大学附属北京同仁医院亦庄院区住院大揭秘!这些流程你真的了解吗?
电饭煲哪个牌子好用质量好?五大品牌实测,必看怎么选指南
佩奇钱包:全面解析及使用指南
爱乐小讲堂 | 间奏曲