python - 汇总相关概率
问题描述
我在数据框中有一个带有特征和标签的模型,其列如下:
[id, feature_1, feature_2, feature_2,...,feature_N, label_1, label_2, label_3]
这里的标签是 1、0 代表真、假。我为每个标签独立构建模型,
model_1: [id, feature_1, feature_2, feature_2,...,feature_N, label_1]
model_2: [id, feature_1, feature_2, feature_2,...,feature_N, label_2]
model_3: [id, feature_1, feature_2, feature_2,...,feature_N, label_3]
所以最后我有 3 个模型可以用来预测每种标签类型,如果每行的 label_1(2 或 3)为真/假,我可以获得 0 到 1 之间的概率。
我想将这些概率汇总为一个分数。然而,问题是这些都是依赖的。因此,如果我独立对待他们,我会遇到一种情况,我可能会得到
[label_1, label_2, label_3] = [1.0, 1.0, 0.001], 0.99*0.99*0.001 = 0.0001
现在这里的问题是,有时我们需要预测的可能已经有 label_1 和 label_2 但没有 label_3,所以我们只预测 label_3。这个汇总分数太小了,因为 label_1 和 label_2 是已知的并且是 True,但是汇总会说它们是错误的 - 但我们可能对 0.001 的预测没有那么自信。为了解决这个问题,我使用几何平均值
(1.0*1.0*0.001)^(1/3) = 0.10
这似乎工作正常,但我想知道是否有更好的方法来处理这个问题?
解决方案
假设我们有
import statistics as stats
p1 = [1.0, 1.0, 1.0]
p2 = [1.0, 1.0, 0.001]
几何平均数:
stats.geometric_mean(p1) # 1.0
stats.geometric_mean(p2) # 0.10000000000000002
但是用算术平均值
stats.mean(p1) # 1.0
stats.mean(p2) # 0.667
实现更精确:
def am(ps):
return sum(ps)/len(ps)
am(p1) # 1.0
am(p2) # 0.6669999999999999
更有意义,所以我会使用算术平均值而不是几何平均值。
推荐阅读
- javascript - 使用 JSON 对象创建表,为什么最后一行首先有两行和一个空行的“td”
- flutter - 即使使用对齐方式或列元素无法更改行左对齐,颤动的行元素仍保持居中?
- c# - 如何在整个工作簿中搜索文本?
- python - 尽管指定的 FLASK_APP 文件已重命名,但 FLASK RUN 仍然有效
- excel - 根据特定列中的文本值删除行
- javascript - 如何在功能项中使用值?
- html - 角材质表添加动态列标题
- python - 检查 pyspark 数据框列的列
- python - 我应该使用模型的 ID 处理订单号吗?
- sql - COUNT(*) 作为“A 列”,GROUP BY“A 列”,B 列的第二个顶部