最近在做机器学习项目,模型评估要用到P-R曲线图(Precision & Recall),百度了一下发现基本上很难找到有博主给出sklearn绘制P-R曲线图的详细代码。找了很长时间终于找到了对应的模块函数的函数使用方法,跟各位朋友分享一下。

注意点

1、我在使用sklearn时,sklearn.cross_validation模块已经被替换为sklearn.model_selection,原先的一些函数被修改了。目前我只发现该模块下的StratifiedKFold对象的初始化只需要一个参数n_splits(原先为n_folds),并且初始化好该对象后需要"<新对象>.split(Xtrain,yLabel)"后才能得到实现K折交叉验证的生成器(generator),之前的初始化后就是一个生成器了;

2、sklearn.metrics模块下的precision_recall_curve函数可以实现P-R曲线的散点数据生成(然后plot一下就可以了),另外该模块下的roc_curve、auc函数分别可以实现ROC曲线的散点数据生成以及AUC值的计算。

代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import svm,datasets,linear_model
from sklearn.linear_model import LinearRegression,Lasso
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_curve,auc,precision_recall_curve
from sklearn.model_selection import KFold,StratifiedKFold

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
random_state = np.random.RandomState(0)
X = np.c_[X,random_state.randn(n_samples,200*n_features)]
kfold = StratifiedKFold(n_splits=5)										 # 使用5折交叉验证,并且画ROC曲线
cv = kfold.split(X,y)
classifier = svm.SVC(kernel="linear",probability=True,random_state=random_state) 
for i,(train,test) in enumerate(cv):									 # 通过训练数据,使用svm线性核建立模型,并对测试集进行测试,求出预测得分
	probas_ = classifier.fit(X[train],y[train]).predict_proba(X[test])
	precision,recall,thresholds = precision_recall_curve(y[test],probas_[:,1])# 最重要的函数:通过precision_recall_curve()函数,求出recall,precision,以及阈值
	plt.plot(recall,precision,lw=1)
plt.plot([0,1],[0,1],'--',color=(0.6,0.6,0.6),label="Luck")				 # 画对角线		 
plt.xlim([-0.05,1.05])
plt.ylim([-0.05,1.05])
plt.xlabel("Recall Rate")
plt.ylabel("Precision Rate")
plt.show()

分享学习,共同进步!

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐