Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn2pmml PMMLPipeline中的自定义函数_Python_Pandas_Scikit Learn_Pmml - Fatal编程技术网

Python sklearn2pmml PMMLPipeline中的自定义函数

Python sklearn2pmml PMMLPipeline中的自定义函数,python,pandas,scikit-learn,pmml,Python,Pandas,Scikit Learn,Pmml,我试图创建一个机器学习模型,根据中风患者对各种问卷和评估的反应,为他们提供治疗建议。例如,患者将被要求对手指、肘部、肩部和胸肌的僵硬程度进行评分(评分范围为0到100),或回答14个与心理健康相关的问题(评分范围为0到3) 我想大致如下创建一个sklearn管道: 1.汇总患者的反应。例如,应将四个僵硬反应求平均值以创建单个“僵硬”值,而应将十四个心理健康问题求和以创建单个“心理健康”值。“僵硬”和“心理健康”值将成为模型中的特征 2.一旦以这种方式对特征进行聚合,决策树分类器将根据标记数据进行

我试图创建一个机器学习模型,根据中风患者对各种问卷和评估的反应,为他们提供治疗建议。例如,患者将被要求对手指、肘部、肩部和胸肌的僵硬程度进行评分(评分范围为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应用于一组列的方法,但不知道如何做一些简单的事情,比如通过求和或求平均来折叠一组列。有人对我如何做到这一点有任何提示吗


谢谢您的帮助。

您只需定义一个自定义函数,并在
管道中使用它

以下是完整的代码:

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\u.DataFrameMapper
定义列组,并对其应用转换。要转换为PMML工作,需要提供transformer类,而不是直接函数。也许您所有的转换需求都由
sklearn2pmml.preprocessing.Aggregator
transformer类处理。如果没有,你可以定义你自己的


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

这听起来非常简单。你的想法很好。您需要一个自定义函数来实现
“输入聚合”,Something()
,以便在管道中进行求和和平均。如果我的答案有帮助,请告诉我