小知识

1.sklearn.metrics.roc_curve来源

sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)

Parameters :
y_true : 数组,shape = [样本数]
在范围{0,1}或{-1,1}中真正的二进制标签。如果标签不是二进制的,则应该显式地给出pos_label
y_score : 数组, shape = [样本数]
目标得分,可以是积极类的概率估计,信心值,或者是决定的非阈值度量(在某些分类器上由“decision_function”返回)。
pos_label:int or str, 标签被认为是积极的,其他的被认为是消极的。
sample_weight: 顾名思义,样本的权重,可选择的
drop_intermediate: boolean, optional (default=True)
是否放弃一些不出现在绘制的ROC曲线上的次优阈值。这有助于创建更轻的ROC曲线
Returns : fpr,tpr,thresholds`

import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2]) #实际值
scores = np.array([0.1, 0.4, 0.35, 0.8]) #预测值
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2) #pos_label=2指标签为2的是正例,1为反例
print(fpr[1],tpr[1],thresholds[1]) 
print(fpr,'\n',tpr,'\n',thresholds)

阈值选择从大到小:
(1)取0.8为1,其余为0 预测值为:[0,0,0,1]
fpr=反例中预测为正例的个数/实际反例个数=0/2=0
tpr=正例中预测为正例的个数/实际正例个数=1/2=0.5
(2)取0.4为阈值,预测为:[0,1,0,1]
fpr=1/2=0.5 tpr=1/2=0.5
(3)取0.35为阈值,预测为:[0,1,1,1]
fpr=1/2=0.5 tpr=2/2=1

0.0 0.5 0.8 #取阈值为0.8时结果
[ 0.  0.5 0.5 1. ] #fpr
 [ 0.5 0.5 1.  1. ] #tpr
 [ 0.8  0.4  0.35 0.1 ] #thresholds

在这里插入图片描述
不管0,0,1.8 这列值

2.interp1d(x, y, kind='linear', ...) 一维插值(来源)
x和y参数是一系列已知的数据点,kind参数是插值类型,可以是字符串或整数。
插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。与拟合不同的是,要求曲线通过所有的已知数据。

import numpy as np
from scipy.interpolate import interp1d
import pylab as pl
 
#创建待插值的数据
x = np.linspace(0, 10*np.pi, 20)
y = np.cos(x)
 
# 分别用linear和quadratic插值
fl = interp1d(x, y, kind='linear') #线性插值
fq = interp1d(x, y, kind='quadratic') #二阶样条曲线
 
#设置x的最大值和最小值以防止插值数据越界
xint = np.linspace(x.min(), x.max(), 1000)
yintl = fl(xint)
yintq = fq(xint)

pl.plot(xint,fl(xint), color="green", label = "Linear")
pl.plot(xint,fq(xint), color="yellow", label ="Quadratic")
pl.legend(loc = "best")
pl.show()

在这里插入图片描述
3.np.argwhere( a )
返回非0的数组元组的索引,其中a是要索引数组的条件。

import numpy as np
x=np.arange(6).reshape(2,3)
print("x:",x)
index=np.argwhere(x>1) #取x中大于1的元素位置
print("index:",'\n',index)

在这里插入图片描述
4.二分类的ROC曲线(来源)
本实例中的数据来源于sklearn中的鸢尾花(iris)数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc  ###计算roc和auc
from sklearn.model_selection import train_test_split

# Import some data to play with 导入数据
iris = datasets.load_iris()
X = iris.data
y = iris.target

##变为2分类
X, y = X[y != 2], y[y != 2]

# Add noisy features to make the problem harder 加入噪声使问题困难
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

# shuffle and split training and test sets 随机打乱数据和划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3,random_state=0)

# Learn to predict each class against the other 
svm = svm.SVC(kernel='linear', probability=True,random_state=random_state)

###通过decision_function()计算得到的y_score的值,用在roc_curve()函数中
y_score = svm.fit(X_train, y_train).decision_function(X_test)

# Compute ROC curve and ROC area for each class
fpr,tpr,threshold = roc_curve(y_test, y_score) ###计算真正率和假正率
roc_auc = auc(fpr,tpr) ###计算auc的值

plt.figure()
lw = 2
plt.figure(figsize=(10,10))
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假正率为横坐标,真正率为纵坐标做曲线
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 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()

在这里插入图片描述

发布了12 篇原创文章 · 获赞 1 · 访问量 4422
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览