5 个版本

0.2.1 2024 年 1 月 23 日
0.1.4 2023 年 7 月 26 日
0.1.2 2023 年 6 月 8 日
0.1.1 2023 年 6 月 5 日
0.1.0 2023 年 4 月 21 日

#611机器学习

Download history 23/week @ 2024-03-15 10/week @ 2024-03-22 31/week @ 2024-03-29 19/week @ 2024-04-05 11/week @ 2024-04-12 13/week @ 2024-04-19 17/week @ 2024-04-26 15/week @ 2024-05-03 8/week @ 2024-05-10 12/week @ 2024-05-17 19/week @ 2024-05-24 18/week @ 2024-05-31 13/week @ 2024-06-07 23/week @ 2024-06-14 36/week @ 2024-06-21 10/week @ 2024-06-28

84 每月下载量
用于 7 个包 (4 直接)

BUSL-1.1

4KB

Lace:一种用于科学发现的概率机器学习工具



安装Rust | Python | CLI


Lace 是一个用 Rust 编写的概率交叉分类引擎,具有可选的 Python 接口。与传统的机器学习方法不同,后者学习将输入映射到输出的某些函数,Lace 学习数据集上的联合概率分布,使用户能够...

  • 预测或计算任何数量的特征在给定任何数量的其他特征条件下的概率
  • 从数据中的方差、模型中的认识不确定性以及缺失特征中识别、量化并归因于不确定性
  • 确定哪些变量可以预测其他变量
  • 确定哪些记录/行在整体或给定特定上下文中与哪些其他记录/行相似
  • 模拟和操作合成数据
  • 与缺失数据原生工作,并对缺失性进行推理(非随机缺失)
  • 与连续和分类数据原生工作,无需转换
  • 在数据中识别异常、错误和不一致性
  • 在不重新训练的情况下编辑、回补和追加数据

等等,都在一个地方,无需任何显式模型构建。

import pandas as pd
import lace

# Create an engine from a dataframe
df = pd.read_csv("animals.csv", index_col=0)
engine = lace.Engine.from_df(df)

# Fit a model to the dataframe over 5000 steps of the fitting procedure
engine.update(5000)

# Show the statistical structure of the data -- which features are likely
# dependent (predictive) on each other
engine.clustermap("depprob", zmin=0, zmax=1)

Animals dataset dependence probability

问题

蕾丝的目的是填补标准机器学习(ML)方法,如深度学习和随机森林,以及统计方法,如概率编程语言之间巨大的鸿沟。我们希望开发一种机器,让用户能够体验发现的乐趣,并且确实对其进行了优化。

简短版

基于标准的、基于优化的ML方法并不能帮助你了解你的数据。概率编程工具假设你已经对你的数据有了很多了解。这两种方法都没有针对我们认为数据科学最重要的部分——科学部分:提问和回答问题——进行优化。

详细版

标准的ML方法易于使用。你可以将数据扔进随机森林,然后开始预测,而不需要太多思考。这些方法试图学习一个函数 f(x) -> y,它将输入 x 映射到输出 y。这种易用性是有代价的。一般来说,f(x) 并不反映生成你的数据的过程的实际情况,而是由开发该方法的任何人选择的,以便足够地表达以更好地实现优化目标。这使得大多数标准的ML完全不可解释,并且无法产生合理的不确定性估计。

在另一端,你有概率工具,如概率编程语言(PPLs)。用户使用参数 θ 的一组概率分布的层次结构来指定 PPL 的模型。然后,PPL 使用一种程序(通常是马尔可夫链蒙特卡洛方法)来了解参数的后验分布 p(θ|x)。PPLs 侧重于可解释性和不确定性量化,但它们对用户提出了一些相当严格的要求。PPL 用户必须从头开始自己指定模型,这意味着他们必须知道(或者至少猜测)模型。PPL 用户还必须知道如何以与底层推理过程兼容的方式指定此类模型。

示例用例

  • 结合数据源并了解它们如何相互作用。例如,我们可能希望从人口统计、调查或任务表现、心电图数据和其他临床数据中预测认知能力下降。结合在一起,这些数据通常会非常稀疏(大多数患者不会填写所有字段),并且很难知道如何显式地建模这些数据层的相互作用。在蕾丝中,我们只需连接这些层并将它们运行通过。
  • 了解随时间推移的不确定性的数量和原因。例如,一位农民可能希望了解在整个生长季节实现特定产量的可能性。随着季节的推移,可以以条件的形式添加新的天气数据到预测中。不确定性可以视为预测的方差、后验样本之间的不一致性或预测分布的多模态性(有关不确定性的更多信息,请参阅这篇博客文章)。
  • 数据质量控制。使用 surprisal 在表中查找异常数据,并使用 -logp 在它们进入表之前识别异常。因为蕾丝创建了一个数据模型,我们也可以设计方法来找到与该模型不一致的数据,我们在错误查找中已经有效地使用了这种方法。

谁不应该使用蕾丝

有一些用例不适合使用蕾丝

  • 非表格数据,如图像和文本
  • 高度优化特定预测
    • 蕾丝宁愿泛化过度,也不愿过拟合。

快速入门

安装

蕾丝需要 Rust。

要安装 CLI

$ cargo install --locked lace-cli

要安装 pylace

$ pip install pylace

示例

蕾丝附带两个预配准示例数据集:卫星和动物。

>>> from lace.examples import Satellites
>>> engine = Satellites()

# Predict the class of orbit given the satellite has a 75-minute
# orbital period and that it has a missing value of geosynchronous
# orbit longitude, and return epistemic uncertainty via Jensen-
# Shannon divergence.
>>> engine.predict(
...     'Class_of_Orbit',
...     given={
...         'Period_minutes': 75.0,
...         'longitude_radians_of_geo': None,
...     },
... )
('LEO', 0.023981898950561048)

# Find the top 10 most surprising (anomalous) orbital periods in
# the table
>>> engine.surprisal('Period_minutes') \
...     .sort('surprisal', reverse=True) \
...     .head(10)
shape: (10, 3)
┌─────────────────────────────────────┬────────────────┬───────────┐
│ index                               ┆ Period_minutes ┆ surprisal │
│ ---                                 ┆ ---            ┆ ---       │
│ str                                 ┆ f64            ┆ f64       │
╞═════════════════════════════════════╪════════════════╪═══════════╡
│ Wind (International Solar-Terres... ┆ 19700.45       ┆ 11.019368 │
│ Integral (INTErnational Gamma-Ra... ┆ 4032.86        ┆ 9.556746  │
│ Chandra X-Ray Observatory (CXO)     ┆ 3808.92        ┆ 9.477986  │
│ Tango (part of Cluster quartet, ... ┆ 3442.0         ┆ 9.346999  │
│ ...                                 ┆ ...            ┆ ...       │
│ Salsa (part of Cluster quartet, ... ┆ 3418.2         ┆ 9.338377  │
│ XMM Newton (High Throughput X-ra... ┆ 2872.15        ┆ 9.13493   │
│ Geotail (Geomagnetic Tail Labora... ┆ 2474.83        ┆ 8.981458  │
│ Interstellar Boundary EXplorer (... ┆ 0.22           ┆ 8.884579  │
└─────────────────────────────────────┴────────────────┴───────────┘

在 Rust 中也是类似的

use lace::prelude::*;
use lace::examples::Example;

fn main() {	
    // In rust, you can create an Engine or and Oracle. The Oracle is an
    // immutable version of an Engine; it has the same inference functions as
    // the Engine, but you cannot train or edit data.
    let mut engine = Example::Satellites.engine().unwrap();
	
    // Predict the class of orbit given the satellite has a 75-minute
    // orbital period and that it has a missing value of geosynchronous
    // orbit longitude, and return epistemic uncertainty via Jensen-
    // Shannon divergence.
    engine.predict(
        "Class_of_Orbit",
        &Given::Conditions(vec![
            ("Period_minutes", Datum:Continuous(75.0)),
            ("Longitude_of_radians_geo", Datum::Missing),
        ]),
        Some(PredictUncertaintyType::JsDivergence),
        None,
    )
}

拟合模型

要使用 CLI 将模型拟合到你的数据,可以这样做

$ lace run --csv my-data.csv -n 1000 my-data.lace

...或从文件或数据框中初始化引擎。

>>> import pandas as pd  # Lace supports polars as well
>>> from lace import Engine
>>> engine = Engine.from_df(pd.read_csv("my-data.csv", index_col=0))
>>> engine.update(1_000)
>>> engine.save("my-data.lace")

您可以使用诊断图监控训练进度

>>> from lace.plot import diagnostics
>>> diagnostics(engine)

Animals MCMC convergence

许可证

Lace受商业源许可证v1.1的许可,该许可证限制商业使用。有关详细信息,请参阅LICENSE

如果您想获得用于商业用途的许可证,请联系lace@redpoll.ai

学术使用

Lace免费供学术使用。请根据CITATION.cff元数据引用lace。

依赖项

~9.5MB
~195K SLoC