利用scikitlearn画ROC曲线实例

一个完整的数据挖掘模型,最后都要进行模型评估,对于二分类来说,AUC,ROC这两个指标用到最多,所以 利用sklearn里面相应的函数进行模块搭建。

具体实现的代码可以参照下面博友的代码,评估svm的分类指标。注意里面的一些细节需要注意,一个是调用roc_curve 方法时,指明目标标签,否则会报错。

具体是这个参数的设置pos_label ,以前在unionbigdata实习时学到的。

重点是以下的代码需要根据实际改写:

  mean_tpr = 0.0
  mean_fpr = np.linspace(0, 1, 100)
  all_tpr = []

  y_target = np.r_[train_y,test_y]
  cv = StratifiedKFold(y_target, n_folds=6)

    #画ROC曲线和计算AUC
    fpr, tpr, thresholds = roc_curve(test_y, predict,pos_label = 2)##指定正例标签,pos_label = ###########在数之联的时候学到的,要制定正例

    mean_tpr += interp(mean_fpr, fpr, tpr)     #对mean_tpr在mean_fpr处进行插值,通过scipy包调用interp()函数
    mean_tpr[0] = 0.0                #初始处为0
    roc_auc = auc(fpr, tpr)
    #画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来
    plt.plot(fpr, tpr, lw=1, label='ROC %s (area = %0.3f)' % (classifier, roc_auc)) 

然后是博友的参考代码:

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 19 08:57:13 2015
@author: shifeng
"""
print(__doc__) 

import numpy as np
from scipy import interp
import matplotlib.pyplot as plt 

from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.cross_validation import StratifiedKFold 

###############################################################################
# Data IO and generation,导入iris数据,做数据准备 

# import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target
X, y = X[y != 2], y[y != 2]#去掉了label为2,label只能二分,才可以。
n_samples, n_features = X.shape 

# Add noisy features
random_state = np.random.RandomState(0)
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)] 

###############################################################################
# Classification and ROC analysis
#分类,做ROC分析 

# Run classifier with cross-validation and plot ROC curves
#使用6折交叉验证,并且画ROC曲线
cv = StratifiedKFold(y, n_folds=6)
classifier = svm.SVC(kernel='linear', probability=True,
           random_state=random_state)#注意这里,probability=True,需要,不然预测的时候会出现异常。另外rbf核效果更好些。
mean_tpr = 0.0
mean_fpr = np.linspace(0, 1, 100)
all_tpr = [] 

for i, (train, test) in enumerate(cv):
  #通过训练数据,使用svm线性核建立模型,并对测试集进行测试,求出预测得分
  probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])
#  print set(y[train])           #set([0,1]) 即label有两个类别
#  print len(X[train]),len(X[test])    #训练集有84个,测试集有16个
#  print "++",probas_           #predict_proba()函数输出的是测试集在lael各类别上的置信度,
#  #在哪个类别上的置信度高,则分为哪类
  # Compute ROC curve and area the curve
  #通过roc_curve()函数,求出fpr和tpr,以及阈值
  fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])
  mean_tpr += interp(mean_fpr, fpr, tpr)     #对mean_tpr在mean_fpr处进行插值,通过scipy包调用interp()函数
  mean_tpr[0] = 0.0                #初始处为0
  roc_auc = auc(fpr, tpr)
  #画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来
  plt.plot(fpr, tpr, lw=1, label='ROC fold %d (area = %0.2f)' % (i, roc_auc)) 

#画对角线
plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck') 

mean_tpr /= len(cv)           #在mean_fpr100个点,每个点处插值插值多次取平均
mean_tpr[-1] = 1.0           #坐标最后一个点为(1,1)
mean_auc = auc(mean_fpr, mean_tpr)   #计算平均AUC值
#画平均ROC曲线
#print mean_fpr,len(mean_fpr)
#print mean_tpr
plt.plot(mean_fpr, mean_tpr, 'k--',
     label='Mean ROC (area = %0.2f)' % mean_auc, lw=2) 

plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

补充知识:批量进行One-hot-encoder且进行特征字段拼接,并完成模型训练demo

import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.feature.{StringIndexer, OneHotEncoder}
import org.apache.spark.ml.feature.VectorAssembler
import ml.dmlc.xgboost4j.scala.spark.{XGBoostEstimator, XGBoostClassificationModel}
import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
import org.apache.spark.ml.tuning.{ParamGridBuilder, CrossValidator}
import org.apache.spark.ml.PipelineModel

val data = (spark.read.format("csv")
 .option("sep", ",")
 .option("inferSchema", "true")
 .option("header", "true")
 .load("/Affairs.csv"))

data.createOrReplaceTempView("res1")
val affairs = "case when affairs>0 then 1 else 0 end as affairs,"
val df = (spark.sql("select " + affairs +
 "gender,age,yearsmarried,children,religiousness,education,occupation,rating" +
 " from res1 "))

val categoricals = df.dtypes.filter(_._2 == "StringType") map (_._1)
val indexers = categoricals.map(
 c => new StringIndexer().setInputCol(c).setOutputCol(s"${c}_idx")
)

val encoders = categoricals.map(
 c => new OneHotEncoder().setInputCol(s"${c}_idx").setOutputCol(s"${c}_enc").setDropLast(false)
)

val colArray_enc = categoricals.map(x => x + "_enc")
val colArray_numeric = df.dtypes.filter(_._2 != "StringType") map (_._1)
val final_colArray = (colArray_numeric ++ colArray_enc).filter(!_.contains("affairs"))
val vectorAssembler = new VectorAssembler().setInputCols(final_colArray).setOutputCol("features")

/*
val pipeline = new Pipeline().setStages(indexers ++ encoders ++ Array(vectorAssembler))
pipeline.fit(df).transform(df)
*/

///
// Create an XGBoost Classifier
val xgb = new XGBoostEstimator(Map("num_class" -> 2, "num_rounds" -> 5, "objective" -> "binary:logistic", "booster" -> "gbtree")).setLabelCol("affairs").setFeaturesCol("features")

// XGBoost paramater grid
val xgbParamGrid = (new ParamGridBuilder()
  .addGrid(xgb.round, Array(10))
  .addGrid(xgb.maxDepth, Array(10,20))
  .addGrid(xgb.minChildWeight, Array(0.1))
  .addGrid(xgb.gamma, Array(0.1))
  .addGrid(xgb.subSample, Array(0.8))
  .addGrid(xgb.colSampleByTree, Array(0.90))
  .addGrid(xgb.alpha, Array(0.0))
  .addGrid(xgb.lambda, Array(0.6))
  .addGrid(xgb.scalePosWeight, Array(0.1))
  .addGrid(xgb.eta, Array(0.4))
  .addGrid(xgb.boosterType, Array("gbtree"))
  .addGrid(xgb.objective, Array("binary:logistic"))
  .build())

// Create the XGBoost pipeline
val pipeline = new Pipeline().setStages(indexers ++ encoders ++ Array(vectorAssembler, xgb))

// Setup the binary classifier evaluator
val evaluator = (new BinaryClassificationEvaluator()
  .setLabelCol("affairs")
  .setRawPredictionCol("prediction")
  .setMetricName("areaUnderROC"))

// Create the Cross Validation pipeline, using XGBoost as the estimator, the
// Binary Classification evaluator, and xgbParamGrid for hyperparameters
val cv = (new CrossValidator()
  .setEstimator(pipeline)
  .setEvaluator(evaluator)
  .setEstimatorParamMaps(xgbParamGrid)
  .setNumFolds(3)
  .setSeed(0))

 // Create the model by fitting the training data
val xgbModel = cv.fit(df)

 // Test the data by scoring the model
val results = xgbModel.transform(df)

// Print out a copy of the parameters used by XGBoost, attention pipeline
(xgbModel.bestModel.asInstanceOf[PipelineModel]
 .stages(5).asInstanceOf[XGBoostClassificationModel]
 .extractParamMap().toSeq.foreach(println))
results.select("affairs","prediction").show

println("---Confusion Matrix------")
results.stat.crosstab("affairs","prediction").show()

// What was the overall accuracy of the model, using AUC
val auc = evaluator.evaluate(results)
println("----AUC--------")
println("auc="+auc)
 

以上这篇利用scikitlearn画ROC曲线实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • keras绘制acc和loss曲线图实例

    我就废话不多说了,大家还是直接看代码吧! #加载keras模块 from __future__ import print_function import numpy as np np.random.seed(1337) # for reproducibility import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers.core import Dense,

  • 解决ROC曲线画出来只有一个点的问题

    之前在做kaggle比赛时,有个比赛使用AUC来评比的,当时试着画了ROC曲线,结果出来的下图这样的图形.跟平时的ROC曲线差好远,就只有一个点.而别人家的都是很多转折的,为啥我的不一样. 我的图如下: 正常的图(sklearn上面截取的): 思考过后,发现原来: ROC曲线,一般适用于你的分类器输出一个"概率值",即这个样本属于某个类的概率是多少. 如此的话,你就需要设定一个阈值, 大于这个阈值属于正类,小于这个阈值属于负类. 从而,对于这个阈值P0, 就会得到对应的TPR, FPR

  • 基于python实现ROC曲线绘制广场解析

    ROC 结果 源数据:鸢尾花数据集(仅采用其中的两种类别的花进行训练和检测) Summary features:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 实例:[5.1, 3.5, 1.4, 0.2] target:'setosa' 'versicolor' (0 , 1) 采用回归方法进行拟合得到参数和bias model.fit(data_train, data_tra

  • 利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer from sklearn import metrics from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split import pylab as p

  • python实现二分类和多分类的ROC曲线教程

    基本概念 precision:预测为对的当中,原本为对的比例(越大越好,1为理想状态) recall:原本为对的当中,预测为对的比例(越大越好,1为理想状态) F-measure:F度量是对准确率和召回率做一个权衡(越大越好,1为理想状态,此时precision为1,recall为1) accuracy:预测对的(包括原本是对预测为对,原本是错的预测为错两种情形)占整个的比例(越大越好,1为理想状态) fp rate:原本是错的预测为对的比例(越小越好,0为理想状态) tp rate:原本是对的

  • 利用scikitlearn画ROC曲线实例

    一个完整的数据挖掘模型,最后都要进行模型评估,对于二分类来说,AUC,ROC这两个指标用到最多,所以 利用sklearn里面相应的函数进行模块搭建. 具体实现的代码可以参照下面博友的代码,评估svm的分类指标.注意里面的一些细节需要注意,一个是调用roc_curve 方法时,指明目标标签,否则会报错. 具体是这个参数的设置pos_label ,以前在unionbigdata实习时学到的. 重点是以下的代码需要根据实际改写: mean_tpr = 0.0 mean_fpr = np.linspac

  • 利用Python画ROC曲线和AUC值计算

    前言 ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣.这篇文章将先简单的介绍ROC和AUC,而后用实例演示如何python作出ROC曲线图以及计算AUC. AUC介绍 AUC(Area Under Curve)是机器学习二分类模型中非常常用的评估指标,相比于F1-Score对项目的不平衡有更大的容忍性,目前常见的机器学习库中(比如scikit-learn)一般也都是集成该指标的计算,但

  • 解析ROC曲线绘制(python+sklearn+多分类)

    目录 ROC曲线绘制要点(仅记录) 提取数据(标签值和模型预测值) 多分类的ROC曲线画出来并不难 ROC曲线绘制要点(仅记录) 1.ROC用于度量模型性能 2.用于二分类问题,如若遇到多分类也以二分类的思想进行操作. 3.二分类问题代码实现(至于实现,文档说的很清楚了:官方文档) 原理看懂就好,实现直接调用API即可 提取数据(标签值和模型预测值) from sklearn.metrics import roc_curve, auc fpr, tpr, thresholds = roc_cur

  • 利用Tensorboard绘制网络识别准确率和loss曲线实例

    废话不多说,直接上代码看吧! import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = input_data.read_data_sets("MNIST_data",one_hot=True) #每个批次的大小和总共有多少个批次 batch_size = 100 n_batch = mnist.train.num_examples // batch_

  • R语言利用caret包比较ROC曲线的操作

    说明 我们之前探讨了多种算法,每种算法都有优缺点,因而当我们针对具体问题去判断选择那种算法时,必须对不同的预测模型进行重做评估. 为了简化这个过程,我们使用caret包来生成并比较不同的模型与性能. 操作 加载对应的包与将训练控制算法设置为10折交叉验证,重复次数为3: library(ROCR) library(e1071) library("pROC") library(caret) library("pROC") control = trainControl(

  • 用R语言绘制ROC曲线的实例讲解

    1 roc曲线的意义 ROC曲线就是用来判断诊断的正确性,最理想的就是曲线下的面积为1,比较理想的状态就是曲线下的面积在0.8-0.9之间,0.5的话对实验结果没有什么影响. 如图: 2代码部分 install.packages("pROC") install.packages("ggplot2") library(pROC) library(ggplot2) #建立曲线 data(aSAH) rocobj1<-roc(aSAHo u t c o m e ,

  • 浅谈ROC曲线的最佳阈值如何选取

    为了获取ROC曲线的最佳阈值,需要使用一个指标--约登指数,也称正确指数. 借助于matlab的roc函数可以得出计算. % 1-specificity = fpr % Sensitivity = tpr; [tpr,fpr,thresholds] =roc(Tar',Val'); RightIndex=(tpr+(1-fpr)-1); [~,index]=max(RightIndex); % RightIndexVal=RightIndex(index(1)); tpr_val=tpr(ind

  • 利用Python计算KS的实例详解

    在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布.好的信用风控模型一般从准确性.稳定性和可解释性来评估模型. 一般来说.好人样本的分布同坏人样本的分布应该是有很大不同的,KS正好是有效性指标中的区分能力指标:KS用于模型风险区分能力进行评估,KS指标衡量的是好坏样本累计分布之间的差值. 好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强. 1.crosstab实现,计算ks的核心就是好坏人的累积概率分布,我们采用pandas.crosstab函数来计算累积概率

随机推荐