跳转到主要内容

组合模型,轻而易举。

项目描述

ensemble

组合模型,轻松

Model Ensemble

ensemble 允许您组合您的模型并通过单个对象访问它们。您可以使用该组合来在模型之间进行多路复用、调用所有模型并汇总结果。您可以执行 袋装提升堆叠 等操作。您甚至可以创建组合的组合!

此包借鉴了来自 TensorFlow 的计算图会话思想,并实现了构建树层次结构的 组合模式

文档

Documentation Status

请参阅ensemble-pkg.readthedocs.io上的文档

安装

pip install ensemble-pkg

案例研究

假设我们有两个模型可以完成二元分类任务。我们想要能够轻松地将两个模型组合成一个组合,然后测试两个模型和组合的精确率和召回率。使用此包非常简单。

我们首先为数据集构建两个模型。在这种情况下,任务是判断一个数字是否能被15整除。我们有两个模型,一个模型说如果数字能被3整除,那么它就能被15整除;另一个模型说如果数字能被5整除,那么它就能被15整除。

def model1(x):
  return x % 3 == 0

def model2(x):
  return x % 5 == 0

def get_dataset():
  return [(i, i % 15 == 0) for i in range(1, 101)]

定义一个函数,用于获取给定数据集和预测集的精确率和召回率

def get_results(dataset, preds):
  labels = [label for _, label in dataset]
  positives = sum(1 for label in labels if label)
  predicted_positives = sum(1 for pred in preds if pred)
  true_positives = sum(1 for label, pred in zip(labels, preds) if label and pred)
  return 100.0 * true_positives / predicted_positives, 100.0 * true_positives / positives

接下来,我们从 model1model2 构建一个模型组合,具体来说是一个只在其所有子节点都输出 True 时才输出 True 的组合。在这种情况下,组合将只在输入既能被3整除也能被5整除时输出 True

e = Ensemble('ensemble', children=[model1, model2], mode='all')
e(x=3) # returns False
e(x=5) # returns False
e(x=15) # returns True

最后,让我们从我们的两个模型和集成中构建另一个集成,以便轻松汇总每个模型的精度和召回率统计数据。我们通过在每个子模型上装饰一个评估装饰器来完成此操作,该装饰器修改模型以接受数据集并输出精度和召回率,而不是接受一个数字并输出 TrueFalse

def evaluate(model):
  def wrapper(dataset):
    preds = [model(x=x) for x, _ in dataset]
    precision, recall = get_results(dataset, preds)
    return {
      'precision': f'{precision:.1f}%',
      'recall': f'{recall:.1f}%',
    }
  return wrapper

results = Ensemble('results', children=[model1, model2, e])
results.decorate_children(evaluate)

最后,我们运行 results(dataset=get_dataset()) 并获得以下预期的结果!

{'ensemble': {'precision': '100.0%', 'recall': '100.0%'},
 'model1': {'precision': '18.2%', 'recall': '100.0%'},
 'model2': {'precision': '30.0%', 'recall': '100.0%'}}

在几行代码中,我们构建了以下图形结构。

Graph Structure

示例

定义您的模型函数并创建您的集成

>>> from ensemble import Ensemble
>>> def square(x):
...     return x**2
>>> def cube(x):
...     return x**3
>>> e = Ensemble(name='e1', children=[square, cube])

调用集成中的所有模型

>>> e(x=2)
{'square': 4, 'cube': 8}
>>> e(x=3)
{'square': 9, 'cube': 27}

在函数之间复用

>>> e.multiplex('square', x=2)
4
>>> e.multiplex('cube', x=3)
27

您还可以使用 @child 装饰您的模型函数,以便将其附加到集成

>>> from ensemble import child
>>> @child('e2')
... def func1(x):
...     return x**2
...
>>> @child('e2')
... def func2(x):
...     return x**3
...
>>> e = Ensemble('e2')
>>> e(x=3)
{'func1': 9, 'func2': 27}

甚至可以将模型附加到多个集成中!

>>> @child('e2', 'e3')
... def func3(x, y):
...     return x**3 + y
...
>>> e2(x=2, y=3)
{'func1': 4, 'func2': 8, 'func3': 11}
>>>
>>> e3 = Ensemble('e3')
>>> e3(x=2, y=3)
{'func3': 11}

从您的集成模型的统计聚合中计算

>>> def a(x):
...   return x + 1
...
>>> def b(y):
...   return y + 2
...
>>> def c(z):
...   return z + 2
...
>>> e = Ensemble('e4', children=[a, b], weights=[3.0, 1.0])
>>> e.mean(x=2, y=3)
4.0
>>> e.weighted_mean(x=2, y=3)
3.5
>>> e.weighted_sum(x=2, y=3)
14.0
>>> e = Ensemble('e6', [a, b, c])
>>> e.vote(x=1, y=1, z=1)
3

构建集成集成!

>>> first_ensemble = Ensemble('first', children=[c])
>>> second_ensemble = Ensemble('second', children=[a, b])
>>> parent_ensemble = Ensemble('parent', children=[first_ensemble, second_ensemble])
>>> parent_ensemble(x=1, y=1, z=1)
{'first': {'c': 3}, 'second': {'a': 2, 'b': 3}}
>>> parent_ensemble.multiplex('second', x=3, y=1)
{'a': 4, 'b': 3}

使用该思想来链式聚合计算!计算每个集成中模型输出的总和的均值

>>> first_ensemble.set_mode('sum')
Ensemble(name='first', children=['c'], weights=None, mode='sum')
>>> second_ensemble.set_mode('sum')
Ensemble(name='second', children=['a', 'b'], weights=None, mode='sum')
>>> parent_ensemble.mean(x=1, y=1, z=1)
4.0

如果您忘记了集成中的模型,只需检查即可

>>> print(parent_ensemble)
Ensemble(name='parent', children=['first', 'second'], weights=None, mode='all')
  Ensemble(name='first', children=['c'], weights=None, mode='sum')
    Model(name='c', func=c(z))
  Ensemble(name='second', children=['a', 'b'], weights=None, mode='sum')
    Model(name='a', func=a(x))
    Model(name='b', func=b(y))

在上面的示例中,显示了一个树形图,该图显示了哪些模型和集成是哪些集成的子集!

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

ensemble-pkg-0.0.3.tar.gz (8.3 kB 查看哈希值)

上传时间

构建分发

ensemble_pkg-0.0.3-py3-none-any.whl (9.7 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面