0

0

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

DDD

DDD

发布时间:2025-11-02 12:30:39

|

312人浏览过

|

来源于php中文网

原创

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)以及数学运算来构造合适的排序键。

Quillbot
Quillbot

一款AI写作润色工具,QuillBot的人工智能改写工具将提高你的写作能力。

下载
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数据处理能力至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

394

2023.09.04

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

2

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

2

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

0

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

0

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.29

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

25

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

8

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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