
本文详细介绍了如何在polars中实现多条件的复杂排序,特别针对模型分类结果的审查场景。通过巧妙地利用polars的表达式列表和布尔值到整数的转换特性,可以高效地将数据按“高置信度错误预测优先,低置信度正确预测次之”的逻辑进行排序,避免了传统拆分合并dataframe的繁琐操作,提升了数据处理的简洁性和性能。
在数据分析和机器学习模型评估中,我们经常需要根据多个条件对数据进行排序。例如,在二元分类任务中,为了人工审查模型的表现,我们可能希望优先查看模型预测错误的样本,特别是那些置信度较高的错误预测;其次再查看模型预测正确的样本,其中又希望从置信度较低的开始审查。这种需求涉及到复杂的条件逻辑,如果采用传统的数据框拆分再合并的方法,代码会变得冗长且效率低下。Polars作为一个高性能的数据框库,提供了强大而灵活的表达式系统,能够优雅地解决这类问题。
假设我们有一个包含模型预测结果的数据集,其中包含以下字段:
我们的目标是实现以下排序逻辑:
这种排序顺序旨在帮助我们首先关注那些模型“自信地犯错”的案例,然后是“不那么自信地正确”的案例,以便发现模型潜在的模式性错误或需要改进的地方。
首先,我们创建一个示例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的DataFrame.sort()方法可以接受一个表达式列表作为排序键。Polars会按照列表中表达式的顺序依次进行排序,前一个表达式决定了主要的排序顺序,后续表达式在前面表达式结果相同的情况下进行次级排序。关键在于利用Polars中布尔值到整数的隐式转换(False 转换为 0,True 转换为 1)以及数学运算来构造合适的排序键。
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() 中三个表达式的协同作用:
第一排序键:pl.col('is_correct_prediction')
*第二排序键:`(pl.col('is_correct_prediction') - 1) pl.col('confidence')`**
第三排序键:pl.col('confidence')
通过上述方法,我们不仅高效地解决了复杂的条件排序问题,还展示了Polars表达式系统在数据处理中的强大功能和灵活性。掌握这类技巧对于提升Polars数据处理能力至关重要。
以上就是Polars中实现复杂条件排序:基于模型预测结果和置信度的策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号