sklearn2pmml PMMLPipeline 中的自定义函数

Custom function in sklearn2pmml PMMLPipeline

我正在尝试创建一个机器学习模型,以根据中风患者对各种问卷和评估的回答来建议治疗。例如,将要求患者评估手指、肘部、肩部和胸肌的僵硬程度(每个等级为 0 到 100)或回答 14 个与心理健康相关的问题(每个等级为 0 到 3 ).

我想创建一个大致如下的sklearn管道:

1。汇总患者的反应。例如,四个僵硬反应应该被平均以创建一个单一的“僵硬”值,而十四个心理健康问题应该被总结以创建一个单一的“心理健康”值。 “僵硬”和“心理健康”值将成为模型中的特征。

2。以这种方式聚合特征后,将根据标记数据训练决策树分类器,为每位患者分配适当的治疗。

3。经过训练的管道导出为 pmml 文件用于生产

我想这一定可以用这样的代码来实现:

from sklearn2pmml.pipeline import PMMLPipeline

from sklearn2pmml import sklearn2pmml

from sklearn.tree import DecisionTreeClassifier

from somewhere import Something

pipeline = PMMLPipeline([
    ("input_aggregation", Something()),
    ("classifier", DecisionTreeClassifier())
])

pipeline.fit(patient_input, therapy_labels)
 
sklearn2pmml(pipeline, "ClassificationPipeline.pmml", with_repr = True)

我一直在浏览文档,我可以想出将 PCA 应用于一组列,但不知道如何做一些像通过求和或平均来折叠一组列这样简单的事情。有没有人对我如何做到这一点有任何提示?

感谢您的帮助。

您只需要定义一个自定义函数并在Pipeline中使用它即可。

完整代码如下:

from sklearn.preprocessing import FunctionTransformer
import numpy as np
from sklearn2pmml import make_pmml_pipeline

# fake data with 7 columns
X = np.random.rand(10,7)

n_rows = X.shape[0]

def custom_function(X):
    #averiging 4 first columns, sums the others, column-wise
    return np.concatenate([np.mean(X[:,0:5],axis = 1).reshape(n_rows,1), np.sum(X[:,5:],axis=1).reshape(n_rows,1)],axis = 1)

# Now, if you run: `custom_function(X)` it should return an array (10,2).

pipeline = make_pmml_pipeline(
FunctionTransformer(custom_function),
    )

示例代码:

from sklearn_pandas import DataFrameMapper
from sklearn2pmml.preprocessing import Aggregator

pipeline = PMMLPipeline([
  ("mapper", DataFrameMapper([
    (["stiffness_1", "stiffness_2", "stiffness_3", "stiffness_4"], Aggregator(function = "mean")),
    (["mental_health_1", "mental_health2", .., "mental_health_14"], Aggregator(function = "sum"))
  ])),
  ("classifier", DecisionTreeClassifier())
])
pipeline.fit(X, y)

说明 - 您可以使用 sklearn_pandas.DataFrameMapper 定义列组,并对其应用转换。对于转换为 PMML 的工作,您需要提供转换器 class,而不是直接函数。也许您所有的转换需求都由 sklearn2pmml.preprocessing.Aggregator 转换器 class 处理。如果没有,您可以随时定义自己的。

虽然@makis 提供了 100% 有效的 Python 示例,但它在 Python-to-PMML 的情况下不起作用,因为转换器无法 parse/handle 自定义 Python 函数。