首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sklearn2pmml PMMLPipeline中的自定义函数

sklearn2pmml PMMLPipeline中的自定义函数
EN

Stack Overflow用户
提问于 2019-11-15 19:40:35
回答 2查看 1.9K关注 0票数 0

我试图创建一个机器学习模型,根据中风患者对各种问卷和评估的反应,提出治疗建议。例如,患者将被要求评估手指、肘部、肩部和胸肌的僵硬程度(每个评分在0到100之间),或者回答14个与心理健康有关的问题(每个问题的评分为0到3)。

我想创建一个滑雪板管道,大致如下:

1.对病人的反应进行聚合。例如,四个刚度响应应平均为一个单一的“刚度”值,而14个心理健康问题应被归结为一个单一的“心理健康”值。然后,“刚性”和“心理健康”值将成为模型的特征。

2.在对特征进行聚类处理后,对标记数据进行决策树分类器训练,使每个患者接受适当的治疗。

3.将经过训练的管道作为pmml文件出口生产。

我假设这样的代码一定是可以做到的:

代码语言:javascript
复制
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应用于一组列,但并不能像通过求和或平均来折叠一组列那样简单。有人知道我该怎么做吗?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-16 15:25:45

样本代码:

代码语言:javascript
复制
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工作的转换,您需要提供一个转换器类,而不是直接函数。也许所有的转换需求都是由sklearn2pmml.preprocessing.Aggregator转换器类处理的。如果没有,您可以定义自己的。

虽然@makis提供了一个100%有效的Python示例,但它在Python到PMML的情况下不能工作,因为转换器无法解析/处理自定义Python函数。

票数 0
EN

Stack Overflow用户

发布于 2019-11-15 20:29:31

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

以下是完整的代码:

代码语言:javascript
复制
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),
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58883628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档