当我使用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中的趋势线方程?
谢谢!
答案 0 :(得分:0)
sklearn.metrics.auc
只使用trapezoid rule估算您给定的x
和y
向量对的积分。它没有对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
对于sbt数组,我使用这个函数:
start = 8549826
sbt = lambda year: start * (sbt_exp)**year
得到这个情节:
然后,我使用scipy.integrate.quad
和sklearn.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使用您提供的函数来插入数据并具有更高的准确度。总之,指数和分段线性插值之间的差异是巨大。