【发布时间】:2021-03-08 15:52:46
【问题描述】:
我有这个简单的方法来获得我的十分位数:
def output_deciles(model, X, y, order='predictions'):
results = pd.DataFrame(model.predict(X), index=X.index, columns=['predictions'])
results['actual'] = y
results['deciles'] = pd.qcut(results[order], 10, labels=False, duplicates='drop')
return results
如果我根据我的预测在十分位数上使用它,一切正常:
out = output_deciles(pipeline, X, y)
out.groupby('deciles')[['actual', 'predictions']].mean()
这是在大约 9400 条记录上。
但如果我尝试获取实际值的十分位数,我只会得到 7 而不是 10 十分位数。这是因为我在这个目标中大约一半的值是 0:
out = output_deciles(pipeline, X, y, order='actual')
out.groupby('deciles')[['actual', 'predictions']].mean()
尽管有大量的唯一值:
print(len(out['actual'].unique()))
4593
这是违反直觉的——它几乎就像是丢弃了整个垃圾箱,而不仅仅是一些重复的值。但是,如果我将重复设置更改为“raise”,它会抛出:
ValueError: Bin 边缘必须是唯一的:array([-4.60517019, 0. , 0. , 0. , 0. , 3.47630251、8.40045698、10.11776099、11.46706716、12.86027487、 17.7007044 ])。
如果我的意思是十分位数,给定非唯一的 bin 边缘,我如何获得十分位数?
【问题讨论】: