糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 机器学习基础算法11-Logistic回归-ROC和AUC分类模型评估-实例

机器学习基础算法11-Logistic回归-ROC和AUC分类模型评估-实例

时间:2021-04-18 04:18:23

相关推荐

机器学习基础算法11-Logistic回归-ROC和AUC分类模型评估-实例

文章目录

一、模型评估介绍1.分类模型评估2.回归模型评估二、ROC和AUC1.理论知识2. ROC曲线分析3.TPR与FPR的计算过程三、实例1.实例12.实例23.实例3-鸢尾花数据集

一、模型评估介绍

1.分类模型评估

2.回归模型评估

二、ROC和AUC

1.理论知识

AUC概念理解:/question/39840928?from=profile_question_card

ROC全称是“受试者工作特征”(Receiver Operating Characteristic)。ROC曲线的面积就是AUC(Area Under the Curve)。AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)。

ROC曲线是二值分类问题的一个评价指标。它是一个概率曲线,在不同的阈值下绘制TPR与FPR的关系图,从本质上把“信号”与“噪声”分开。

AUC越大表明当前分类算法分类效果越好

截断点(阈值)取不同的值,TPR和FPR的计算结果也不同。将截断点不同取值下对应的TPR和FPR结果画于二维坐标系中得到的曲线,就是ROC曲线。横轴用FPR表示。

2. ROC曲线分析

random chance这条直线是随机概率,一半的概率是对的,一半的概率是错的。如果低于这条线,说明算法极差,都不如随机猜的。因此在这条线的左边说明算法还好点。

3.TPR与FPR的计算过程

y = [0,0,1,1]y_pre = [0.1,0.5,0.3,0.8]阈值分别取:0.1,0.3,0.5,1

阈值为0.1时

y1=[1,1,1,1]

阈值为0.3时

y2=[0,1,1,1]

阈值为0.5时

y3 = [0,1,0,1]

阈值为0.8时

y4 = [0,0,0,1]

三、实例

1.实例1

sklearn.metrics.roc_curve介绍:/sun91019718/article/details/101314545

# AUC举例-画出ROC曲线import numpy as np# 模型评估from sklearn import metricsimport matplotlib as mplimport matplotlib.pyplot as pltif __name__ == '__main__':y = np.array([0, 0, 1, 1])y_pred = np.array([0.1, 0.5, 0.3, 0.8])# 返回三个数组结果分别是fpr(假正率),tpr(召回率),threshold(阈值)# 参数为真实结果数据、预测结果数据(可以是标签数据也可以是概率值)fpr,tpr,threshold = metrics.roc_curve(y,y_pred)# # np.insert将向量插入某一行或列# fpr = np.insert(fpr, 0, 0)# tpr = np.insert(tpr, 0, 0)print(fpr)print(tpr)print(threshold)# 计算AUC的值auc = metrics.auc(fpr, tpr)print(metrics.roc_auc_score(y, y_pred))# 解决matplotlib 中不能识别中文的问题mpl.rcParams['font.sans-serif'] = u'SimHei'mpl.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(10,10), facecolor='w')# markerfacecolor =mfc linewidth=lw linestyle=ls markeredgecolor = mecplt.plot(fpr, tpr, marker='o', lw=5, ls='-', mfc='g', mec='g', color='r')plt.plot([0, 1], [0, 1], lw=5, ls='--', c='b')# 调整坐标轴范围plt.xlim((-0.01, 1.02))plt.ylim((-0.01, 1.02))# 设置x轴、y轴的刻度plt.xticks(np.arange(0, 1.1, 0.1))plt.yticks(np.arange(0, 1.1, 0.1))# 设置行标签与列标签plt.xlabel('False Positive Rate', fontsize=20)plt.ylabel('True Positive Rate', fontsize=20)# 设置网格线plt.grid(b=True, ls='dotted')# 设置标题plt.title(u'ROC曲线', fontsize=20)plt.show()

[0. 0. 0.5 0.5 1. ][0. 0.5 0.5 1. 1. ][1.8 0.8 0.5 0.3 0.1]0.75

2.实例2

import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltfrom sklearn.linear_model import LogisticRegressionfrom sklearn.preprocessing import label_binarizefrom numpy import interpfrom sklearn import metricsfrom itertools import cycleif __name__ == '__main__':np.random.seed(0)# 设置显示宽度pd.set_option('display.width', 300)# 全部打印,参数suppress表示是否用科学计数法表示浮点数np.set_printoptions(suppress=None)# 构造(300,50)的3个类别的数据n = 300x = np.random.randn(n, 50)y = np.array([0] * 100 + [1] * 100 + [2] * 100)print('y_before\n', y)n_class = 3# 若使用GridSearchCV网格搜索调参,要用到alpha## 创建等比数列# alpha = np.logspace(-3, 3, 7)clf = LogisticRegression(penalty='l2', C=1)clf.fit(x, y)# decision_function相当于3个Logistic回归y_score = clf.decision_function(x)print('y_score = \n', y_score)'''对于n分类,会有n个分类器,然后,任意两个分类器都可以算出一个分类界面,这样,用decision_function()时,对于任意一个样例,就会有n*(n-1)/2个值。任意两个分类器可以算出一个分类界面,然后这个值就是距离分类界面的距离。我想,这个函数是为了统计画图,对于二分类时最明显,用来统计每个点离超平面有多远,为了在空间中直观的表示数据以及画超平面还有间隔平面等。decision_function_shape="ovr"时是4个值,为ovo时是6个值。'''# label_binarize将多类标签转化为二值标签,最终返回一个二值数组或稀疏矩阵;使用one-hot编码y = label_binarize(y, classes=np.arange(n_class))print('y_after\n', y)# cycle表示python的循环遍历;即循环遍历3个颜色colors = cycle('gbc')fpr = dict()tpr = dict()auc = np.empty(n_class + 2)# 解决字体问题mpl.rcParams['font.sans-serif'] = u'SimHei'mpl.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(7, 6), facecolor='w')for i, color in zip(np.arange(n_class), colors):# print(i,color)# AUC曲线fpr[i], tpr[i], thresholds = metrics.roc_curve(y[:, i], y_score[:, i])auc[i] = metrics.auc(fpr[i], tpr[i])plt.plot(fpr[i], tpr[i], c=color, lw=1.5, alpha=0.7, label=u'AUC=%.3f' % auc[i])# micro,将三分类拉成一条线即数据放到一个数组中,变成二分类问题fpr['micro'], tpr['micro'], thresholds = metrics.roc_curve(y.ravel(), y_score.ravel())auc[n_class] = metrics.auc(fpr['micro'], tpr['micro'])plt.plot(fpr['micro'], tpr['micro'], c='r', lw=2, ls='-', alpha=0.8, label=u'micro,AUC=%.3f' % auc[n_class])# macro-平均值# np.concatenate((a,b,c,… ))能够一次完成多个数组的拼接# np.unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表fpr['macro'] = np.unique(np.concatenate([fpr[i] for i in np.arange(n_class)]))# np.zeros_like(W)表示构造一个矩阵W_update,其维度与矩阵W一致,并为其初始化为全0;这个函数方便的构造了新矩阵,无需参数指定shape大小tpr_ = np.zeros_like(fpr['macro'])for i in np.arange(n_class):# numpy.interp()主要使用场景为一维线性插值,返回离散数据的一维分段线性插值结果。tpr_ += interp(fpr['macro'], fpr[i], tpr[i])tpr_ /= n_classtpr['macro'] = tpr_auc[n_class + 1] = metrics.auc(fpr['macro'], tpr['macro'])print(auc)print('Macro AUC:', metrics.roc_auc_score(y, y_score, average='macro'))plt.plot(fpr['macro'], tpr['macro'], c='m', lw=2, alpha=0.8, label=u'macro,AUC=%.3f' % auc[n_class + 1])plt.plot((0, 1), (0, 1), c='#808080', lw=1.5, ls='--', alpha=0.7)plt.xlim((-0.01, 1.02))plt.ylim((-0.01, 1.02))plt.xticks(np.arange(0, 1.1, 0.1))plt.yticks(np.arange(0, 1.1, 0.1))plt.xlabel('False Positive Rate', fontsize=13)plt.ylabel('True Positive Rate', fontsize=13)plt.grid(b=True)plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)# plt.legend(loc='lower right', fancybox=True, framealpha=0.8, edgecolor='#303030', fontsize=12)plt.title(u'ROC和AUC', fontsize=17)plt.show()

y_before[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2 2 2]y_score = [[ 0.32685038 -0.89502432 0.56817394][-0.0422872 0.67905325 -0.63676605][ 0.47757658 -0.2195365 -0.25804007][-0.42172474 1.74378664 -1.32206189][ 0.65577849 -0.82875175 0.17297326]...[ 0.67718684 -0.86463959 0.18745276][-0.90389852 0.7618181 0.14208042][ 0.18960878 -0.2339028 0.04429402][ 0.2691091 1.11637781 -1.38548691][ 0.86214186 -0.6845358 -0.17760606][ 0.09309751 0.27959641 -0.37269392]]after[[1 0 0][1 0 0]...[0 0 1][0 0 1][0 0 1][0 0 1][0 0 1]][0.76370.75355 0.79050.77014444 0.77269167]Macro AUC: 0.7692500000000001

3.实例3-鸢尾花数据集

import numbersimport numpy as npimport scipy as spimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltfrom sklearn.linear_model import LogisticRegression, LogisticRegressionCVfrom sklearn.svm import SVCfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import label_binarizefrom numpy import interpfrom sklearn import metricsfrom itertools import cycleif __name__ == '__main__':np.random.seed(0)pd.set_option('display.width', 300)np.set_printoptions(suppress=True)data = pd.read_csv('iris.data', header=None)iris_types = data[4].unique()for i, iris_type in enumerate(iris_types):data.set_value(data[4] == iris_type, 4, i)x = data.iloc[:, :2]n, features = x.shapeprint(x)y = data.iloc[:, -1].astype(np.int)c_number = np.unique(y).sizex, x_test, y, y_test = train_test_split(x, y, train_size=0.6, random_state=0)y_one_hot = label_binarize(y_test, classes=np.arange(c_number))alpha = np.logspace(-2, 2, 20)models = [['KNN', KNeighborsClassifier(n_neighbors=7)],['LogisticRegression', LogisticRegressionCV(Cs=alpha, penalty='l2', cv=3)],['SVM(Linear)', GridSearchCV(SVC(kernel='linear', decision_function_shape='ovr'), param_grid={'C': alpha})],['SVM(RBF)', GridSearchCV(SVC(kernel='rbf', decision_function_shape='ovr'), param_grid={'C': alpha, 'gamma': alpha})]]colors = cycle('gmcr')mpl.rcParams['font.sans-serif'] = u'SimHei'mpl.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(7, 6), facecolor='w')for (name, model), color in zip(models, colors):model.fit(x, y)if hasattr(model, 'C_'):print(model.C_)if hasattr(model, 'best_params_'):print(model.best_params_)if hasattr(model, 'predict_proba'):y_score = model.predict_proba(x_test)else:y_score = model.decision_function(x_test)fpr, tpr, thresholds = metrics.roc_curve(y_one_hot.ravel(), y_score.ravel())auc = metrics.auc(fpr, tpr)print(auc)plt.plot(fpr, tpr, c=color, lw=2, alpha=0.7, label=u'%s,AUC=%.3f' % (name, auc))plt.plot((0, 1), (0, 1), c='#808080', lw=2, ls='--', alpha=0.7)plt.xlim((-0.01, 1.02))plt.ylim((-0.01, 1.02))plt.xticks(np.arange(0, 1.1, 0.1))plt.yticks(np.arange(0, 1.1, 0.1))plt.xlabel('False Positive Rate', fontsize=13)plt.ylabel('True Positive Rate', fontsize=13)plt.grid(b=True, ls=':')plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)# plt.legend(loc='lower right', fancybox=True, framealpha=0.8, edgecolor='#303030', fontsize=12)plt.title(u'鸢尾花数据不同分类器的ROC和AUC', fontsize=17)plt.show()

0 10 5.1 3.51 4.9 3.02 4.7 3.23 4.6 3.14 5.0 3.65 5.4 3.96 4.6 3.47 5.0 3.48 4.4 2.99 4.9 3.110 5.4 3.711 4.8 3.412 4.8 3.013 4.3 3.014 5.8 4.015 5.7 4.416 5.4 3.917 5.1 3.518 5.7 3.819 5.1 3.820 5.4 3.421 5.1 3.722 4.6 3.623 5.1 3.324 4.8 3.425 5.0 3.026 5.0 3.427 5.2 3.528 5.2 3.429 4.7 3.2.. ... ...120 6.9 3.2121 5.6 2.8122 7.7 2.8123 6.3 2.7124 6.7 3.3125 7.2 3.2126 6.2 2.8127 6.1 3.0128 6.4 2.8129 7.2 3.0130 7.4 2.8131 7.9 3.8132 6.4 2.8133 6.3 2.8134 6.1 2.6135 7.7 3.0136 6.3 3.4137 6.4 3.1138 6.0 3.0139 6.9 3.1140 6.7 3.1141 6.9 3.1142 5.8 2.7143 6.8 3.2144 6.7 3.3145 6.7 3.0146 6.3 2.5147 6.5 3.0148 6.2 3.4149 5.9 3.0[150 rows x 2 columns]0.8770833333333333[0.18329807 0.18329807 0.18329807]0.8884722222222222{'C': 0.18329807108324356}0.8777777777777778{'C': 0.18329807108324356, 'gamma': 1.2742749857031335}0.9009722222222222

如果觉得《机器学习基础算法11-Logistic回归-ROC和AUC分类模型评估-实例》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。