Polars中实现复杂条件排序:基于模型预测结果和置信度的策略

DDD
发布: 2025-11-02 12:30:39
原创
269人浏览过

Polars中实现复杂条件排序:基于模型预测结果和置信度的策略

本文详细介绍了如何在polars中实现多条件的复杂排序,特别针对模型分类结果的审查场景。通过巧妙地利用polars的表达式列表和布尔值到整数的转换特性,可以高效地将数据按“高置信度错误预测优先,低置信度正确预测次之”的逻辑进行排序,避免了传统拆分合并dataframe的繁琐操作,提升了数据处理的简洁性和性能。

在数据分析和机器学习模型评估中,我们经常需要根据多个条件对数据进行排序。例如,在二元分类任务中,为了人工审查模型的表现,我们可能希望优先查看模型预测错误的样本,特别是那些置信度较高的错误预测;其次再查看模型预测正确的样本,其中又希望从置信度较低的开始审查。这种需求涉及到复杂的条件逻辑,如果采用传统的数据框拆分再合并的方法,代码会变得冗长且效率低下。Polars作为一个高性能的数据框库,提供了强大而灵活的表达式系统,能够优雅地解决这类问题。

场景描述

假设我们有一个包含模型预测结果的数据集,其中包含以下字段:

  • name: 样本名称。
  • truth: 真实标签(0或1)。
  • prediction: 模型预测结果(0或1)。
  • confidence: 模型对预测结果的置信度(0到1之间)。

我们的目标是实现以下排序逻辑:

  1. 优先显示错误预测:即 truth 不等于 prediction 的记录。
  2. 在错误预测中,按置信度从高到低排序。
  3. 其次显示正确预测:即 truth 等于 prediction 的记录。
  4. 在正确预测中,按置信度从低到高排序。

这种排序顺序旨在帮助我们首先关注那些模型“自信地犯错”的案例,然后是“不那么自信地正确”的案例,以便发现模型潜在的模式性错误或需要改进的地方。

数据准备

首先,我们创建一个示例Polars DataFrame来模拟上述数据:

import polars as pl

# 示例数据
df = pl.DataFrame({
    "name": ["Alice", "Bob", "Caroline", "Dutch", "Emily", "Frank", "Gerald", "Henry", "Isabelle", "Jack"],
    "truth": [1, 0, 1, 0, 1, 0, 0, 1, 1, 0],
    "prediction": [1, 1, 1, 0, 0, 1, 0, 1, 1, 0],
    "confidence": [0.343474, 0.298461, 0.420634, 0.125515, 0.772971, 0.646964, 0.833705, 0.837181, 0.790773, 0.144983]
}).with_columns(
    # 添加一个布尔列,指示预测是否正确
    (pl.col("truth") == pl.col("prediction")).alias("is_correct_prediction")
)

print("原始数据:")
print(df)
登录后复制

输出的原始数据如下:

原始数据:
shape: (10, 5)
┌──────────┬───────┬────────────┬────────────┬───────────────────────┐
│ name     ┆ truth ┆ prediction ┆ confidence ┆ is_correct_prediction │
│ ---      ┆ ---   ┆ ---        ┆ ---        ┆ ---                   │
│ str      ┆ i64   ┆ i64        ┆ f64        ┆ bool                  │
╞══════════╪═══════╪════════════╪════════════╪═══════════════════════╡
│ Alice    ┆ 1     ┆ 1          ┆ 0.343474   ┆ true                  │
│ Bob      ┆ 0     ┆ 1          ┆ 0.298461   ┆ false                 │
│ Caroline ┆ 1     ┆ 1          ┆ 0.420634   ┆ true                  │
│ Dutch    ┆ 0     ┆ 0          ┆ 0.125515   ┆ true                  │
│ Emily    ┆ 1     ┆ 0          ┆ 0.772971   ┆ false                 │
│ Frank    ┆ 0     ┆ 1          ┆ 0.646964   ┆ false                 │
│ Gerald   ┆ 0     ┆ 0          ┆ 0.833705   ┆ true                  │
│ Henry    ┆ 1     ┆ 1          ┆ 0.837181   ┆ true                  │
│ Isabelle ┆ 1     ┆ 1          ┆ 0.790773   ┆ true                  │
│ Jack     ┆ 0     ┆ 0          ┆ 0.144983   ┆ true                  │
└──────────┴───────┴────────────┴────────────┴───────────────────────┘
登录后复制

Polars解决方案:多表达式排序

Polars的DataFrame.sort()方法可以接受一个表达式列表作为排序键。Polars会按照列表中表达式的顺序依次进行排序,前一个表达式决定了主要的排序顺序,后续表达式在前面表达式结果相同的情况下进行次级排序。关键在于利用Polars中布尔值到整数的隐式转换(False 转换为 0,True 转换为 1)以及数学运算来构造合适的排序键。

百度文心百中
百度文心百中

百度大模型语义搜索体验中心

百度文心百中22
查看详情 百度文心百中
sorted_df = df.sort([
    pl.col('is_correct_prediction'),
    (pl.col('is_correct_prediction') - 1) * pl.col('confidence'),
    pl.col('confidence')
])

print("\n排序后的数据:")
print(sorted_df)
登录后复制

排序后的数据将如下所示(与问题描述中的期望输出一致):

排序后的数据:
shape: (10, 5)
┌──────────┬───────┬────────────┬────────────┬───────────────────────┐
│ name     ┆ truth ┆ prediction ┆ confidence ┆ is_correct_prediction │
│ ---      ┆ ---   ┆ ---        ┆ ---        ┆ ---                   │
│ str      ┆ i64   ┆ i64        ┆ f64        ┆ bool                  │
╞══════════╪═══════╪════════════╪════════════╪══════════════════════─╡
│ Emily    ┆ 1     ┆ 0          ┆ 0.772971   ┆ false                 │
│ Frank    ┆ 0     ┆ 1          ┆ 0.646964   ┆ false                 │
│ Bob      ┆ 0     ┆ 1          ┆ 0.298461   ┆ false                 │
│ Dutch    ┆ 0     ┆ 0          ┆ 0.125515   ┆ true                  │
│ Jack     ┆ 0     ┆ 0          ┆ 0.144983   ┆ true                  │
│ Alice    ┆ 1     ┆ 1          ┆ 0.343474   ┆ true                  │
│ Caroline ┆ 1     ┆ 1          ┆ 0.420634   ┆ true                  │
│ Isabelle ┆ 1     ┆ 1          ┆ 0.790773   ┆ true                  │
│ Gerald   ┆ 0     ┆ 0          ┆ 0.833705   ┆ true                  │
│ Henry    ┆ 1     ┆ 1          ┆ 0.837181   ┆ true                  │
└──────────┴───────┴────────────┴────────────┴───────────────────────┘
登录后复制

排序表达式详解

这个解决方案的核心在于理解 df.sort() 中三个表达式的协同作用:

  1. 第一排序键:pl.col('is_correct_prediction')

    • 这个表达式直接使用布尔列 is_correct_prediction 进行排序。
    • 在Polars(以及大多数编程语言)中,False 通常被视为小于 True。因此,默认的升序排序会首先将所有 is_correct_prediction 为 False(即错误预测)的行排在前面,然后是 True(即正确预测)的行。
    • 这实现了我们的第一个主要目标:错误预测优先。
  2. *第二排序键:`(pl.col('is_correct_prediction') - 1) pl.col('confidence')`**

    • 这个表达式用于处理错误预测内部的排序逻辑。
    • 当 is_correct_prediction 为 False 时 (错误预测):
      • False 隐式转换为整数 0。
      • 表达式变为 (0 - 1) * pl.col('confidence'),即 -pl.col('confidence')。
      • 由于Polars默认进行升序排序,对 -confidence 进行升序排序,实际上等同于对 confidence 进行降序排序。这完美地满足了“错误预测中按置信度从高到低排序”的需求。
    • 当 is_correct_prediction 为 True 时 (正确预测):
      • True 隐式转换为整数 1。
      • 表达式变为 (1 - 1) * pl.col('confidence'),即 0 * pl.col('confidence'),结果为 0。
      • 这意味着所有正确预测的行在这个排序键上都得到了相同的 0 值。因此,这个表达式不会影响正确预测之间自身的相对顺序,而是将它们的排序任务留给下一个排序键。
  3. 第三排序键:pl.col('confidence')

    • 这个表达式用于处理正确预测内部的排序逻辑。
    • 由于前一个排序键将所有正确预测的行都赋予了相同的 0 值,所以此键只会在这些 0 值相同的行(即所有正确预测的行)之间生效。
    • 默认的升序排序将按照 confidence 值从低到高排列这些正确预测。这满足了“正确预测中按置信度从低到高排序”的需求。

注意事项与总结

  • 布尔值隐式转换:理解Polars(以及Python)中布尔值 True 和 False 在数学运算中分别等同于整数 1 和 0 是实现此技巧的关键。
  • 排序键的优先级:df.sort() 接受的表达式列表严格按照从左到右的优先级进行排序。只有当所有前面的排序键的值都相同时,才会考虑下一个排序键。
  • 代码简洁性与效率:这种方法避免了传统上通过 filter() 拆分 DataFrame、分别排序再通过 concat() 合并的繁琐步骤。它在单个 sort() 调用中完成了所有逻辑,通常会带来更高的执行效率和更简洁的代码。
  • 通用性:这种利用数学运算和布尔值转换来创建条件排序键的模式非常灵活,可以扩展到更复杂的条件排序场景中,而不仅仅局限于二元分类。

通过上述方法,我们不仅高效地解决了复杂的条件排序问题,还展示了Polars表达式系统在数据处理中的强大功能和灵活性。掌握这类技巧对于提升Polars数据处理能力至关重要。

以上就是Polars中实现复杂条件排序:基于模型预测结果和置信度的策略的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号