在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)
另一个类只介绍参数不一样的部分
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)
假设我们创建了一个模型model= sklearn.linear_model.LogisticRegression(),如果要计算AUC并画出ROC曲线的时候要注意:
1、sklearn.metrics.roc_auc_score(y_true, y_score, average=’macro’, sample_weight=None, max_fpr=None)
返回值:float类型的auc值,即ROC曲线下的面积。
2、sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
返回值: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)
原文:https://www.cnblogs.com/dwithy/p/11583612.html