尝试编写一个函数来解决给定两个单独的Pandas DataFrames的曲线下的区域。正如print语句所确认的那样,DataFrames的列正确解压缩,但是,我无法从单独的帧创建新的Dataframe或引用fpr数据帧的特定索引来进行计算。
def areaUnderCurve(tpr, fpr):
auc = 0.0
for fpr, tpr in zip(tpr['True Positive Rate'], fpr['False Positive Rate']):
auc += np.trapz(y=fpr['False Positive Rate'], x=tpr['True Positive Rate'])
return auc
calcAUC = areaUnderCurve(dataframe, dataframe)
print(calcAUC)
print statement的样本输出:
0 1.0 0.94
1 1.0 0.8866666666666667
2 1.0 0.8133333333333334
3 1.0 0.7866666666666666
4 1.0 0.78
5 1.0 0.6533333333333333
6 1.0 0.6333333333333333
7 1.0 0.6266666666666667
8 1.0 0.6133333333333333
9 1.0 0.6
***更新代码,尝试根据答案计算AUC,收到以下错误"浮动对象不可订阅"
答案 0 :(得分:1)
numpy
具有数值积分的方法,例如,使用梯形规则计算的np.trapz
。
import numpy as np
np.trapz(y=fpr['False Positive Rate'], x=tpr['True Positive Rate'])
应该给你这个区域。
答案 1 :(得分:1)
@Jay Py
要回答您的第一个问题,您绝对可以从两个数据框创建数据框
data=pd.DataFrame(zip(tpr['True Positive Rate'],fpr['False Positive Rate']),columns=['TPR','FPR'])
为了计算ROC,您可以在此数据框上使用以下逻辑
data['dFPR']=list(np.diff(data['FPR'].values)) + [0]
data['dTPR']=list(np.diff(data['TPR'].values)) + [0]
data['sum1']=data.apply(lambda x : x['TPR'] * x['dFPR'],axis=1)
data['sum2']=data.apply(lambda x : x['dTPR'] * x['dFPR'],axis=1)
ROC=sum(data['sum1']) + sum(data['sum2'])/2
随机值示例
tpr=pd.DataFrame(np.random.rand(100,2),columns=['Col1','True Positive Rate'])
fpr=pd.DataFrame(np.random.rand(100,2),columns=['Col2','False Positive Rate'])
data=pd.DataFrame(zip(tpr['True Positive Rate'],fpr['False Positive Rate']),columns=['TPR','FPR'])
data['dFPR']=list(np.diff(data['FPR'].values)) + [0]
data['dTPR']=list(np.diff(data['TPR'].values)) + [0]
data['sum1']=data.apply(lambda x : x['TPR'] * x['dFPR'],axis=1)
data['sum2']=data.apply(lambda x : x['dTPR'] * x['dFPR'],axis=1)
ROC=sum(data['sum1']) + sum(data['sum2'])/2
print(ROC)
0.773539521758