metrics.auc和scipy.integrate.quad有什么区别?

时间:2016-07-27 22:33:19

标签: python excel numpy scipy scikit-learn

当我使用sklearn.metrics.auc计算“曲线下面积”时以及使用scipy.integrate.quad时,我得到的值不同。

为了计算AUC,我传入了我的数据:

auc_path = metrics.auc(path,year)
auc_sbt = metrics.auc(sbt,year)

auc_path = 14929608030
auc_sbt = 14846098649

为了计算定积分,我将从Excel中找到的趋势线方程(由我输入的相同数据生成)输入到python中:

def cur_path(x):
    return -47177.249*x + 8586190.275
cur_path_i, cur_path_err = quad(cur_path,1,23)

def req_path(x):
    return 23195385.6616*np.exp(-0.049*x) 
req_path_i, req_path_err = quad(req_path,24,61)

def sbt(x):
    return 8838484.57*np.exp(-0.03*x) 
sbt_i, sbt_err = quad(sbt,1,61)

path = 298653886
sbt = 238648501

错误是否归因于Excel中的趋势线方程?

谢谢!

2 个答案:

答案 0 :(得分:0)

sklearn.metrics.auc只使用trapezoid rule估算您给定的xy向量对的积分。它没有对ROC曲线的功能形式做出任何强有力的假设。

在第二种情况下,您似乎已经为数据拟合了指数参数模型(在Excel中?),然后使用scipy.integrate.quad在某个时间间隔内对拟合函数进行积分。

没有特别的理由期望这两种方法给出相同的结果。没有数据,我们无法判断您的指数拟合是否合适,甚至在这种情况下指数模型是否合适。

答案 1 :(得分:0)

根据您对数据的描述,我得到以下图表。对于路径数据(curr_path然后req_path),我使用此函数:

start = 8549826
def path(year):
    if year > 23: return start*(cur_path_exp)**23 * req_path_exp**(year-23)
    else: return start * (cur_path_exp)**year

得到这个情节(从1到61岁): Plot of the generated path data.

对于sbt数组,我使用这个函数:

start = 8549826
sbt = lambda year: start * (sbt_exp)**year

得到这个情节:

sbt plot

然后,我使用scipy.integrate.quadsklearn.metrics.auc来比较积分。

import numpy as np
from scipy.integrate import quad
from sklearn.metrics import auc
start = 8549826
sbt_exp = 0.9673405832388313
cur_path_exp = .9941
req_path_exp = 0.9522
sbt = lambda year: start * (sbt_exp)**year
def path(year):
    if year > 23: return start*(cur_path_exp)**23 * req_path_exp**(year-23)
    else: return start * (cur_path_exp)**year

years = range(1,62)
print "Quad sbt: ", quad(sbt, 1,61), "Auc sbt: ",auc(map(sbt, years), years)

print "Quad sbt: ",quad(path, 1, 61), "Auc sbt: ",auc(map(path, years),years)

得到了输出:

Quad sbt:  (215108922.75692844, 2.3881887884705626e-06) Auc sbt:  154592534.468
Quad sbt:  (303985184.7185244, 0.4825437736101641) Auc sbt:  241740742.863

如你所见,它们完全不同。这是因为auc使用简单的梯形规则,而quad使用您提供的函数来插入数据并具有更高的准确度。总之,指数分段线性插值之间的差异是巨大