Python sklearn2pmml PMMLPipeline中的自定义函数
我试图创建一个机器学习模型,根据中风患者对各种问卷和评估的反应,为他们提供治疗建议。例如,患者将被要求对手指、肘部、肩部和胸肌的僵硬程度进行评分(评分范围为0到100),或回答14个与心理健康相关的问题(评分范围为0到3) 我想大致如下创建一个sklearn管道: 1.汇总患者的反应。例如,应将四个僵硬反应求平均值以创建单个“僵硬”值,而应将十四个心理健康问题求和以创建单个“心理健康”值。“僵硬”和“心理健康”值将成为模型中的特征 2.一旦以这种方式对特征进行聚合,决策树分类器将根据标记数据进行训练,以将每个患者分配到适当的治疗 3.经过培训的管道将作为pmml文件导出以供生产 我假设这在一些代码中是可行的,比如:Python sklearn2pmml PMMLPipeline中的自定义函数,python,pandas,scikit-learn,pmml,Python,Pandas,Scikit Learn,Pmml,我试图创建一个机器学习模型,根据中风患者对各种问卷和评估的反应,为他们提供治疗建议。例如,患者将被要求对手指、肘部、肩部和胸肌的僵硬程度进行评分(评分范围为0到100),或回答14个与心理健康相关的问题(评分范围为0到3) 我想大致如下创建一个sklearn管道: 1.汇总患者的反应。例如,应将四个僵硬反应求平均值以创建单个“僵硬”值,而应将十四个心理健康问题求和以创建单个“心理健康”值。“僵硬”和“心理健康”值将成为模型中的特征 2.一旦以这种方式对特征进行聚合,决策树分类器将根据标记数据进行
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()
,以便在管道中进行求和和平均。如果我的答案有帮助,请告诉我