自定义Python节点规范
1.模板
在 系统运维>数据挖掘配置>引擎设置 中, 下载自定义Python节点包模板或自定义Python算法节点包模板 。
如果自定义的Python脚本涉及算法训练、预测、评估,且希望和产品内置的训练、预测、评估节点兼容使用,则下载自定义Python算法节点包模板;否则下载自定义Python节点包模板。
模板中需要提供两个文件,一个是Python脚本,一个是节点定义,节点定义的文件格式为json。
例如:Python_split.py(Python脚本),Python_split.json(节点定义)。这两文件名字必须一样,同时也要跟节点定义中的name属性值一样。
2.节点定义
文件中必须包含的属性:"name", "alias", "configs", "inputs", "type", "path"。
Python_split.json:
{
"name":"Python_split",
"alias":"Python拆分",
"configs":[
{
"name":"datasetRatio",
"lable":"数据集占比",
"type":"double",
"value":0.7
}
],
"inputs":[
{
"order":0,
"type":[
"DATASET"
]
}
],
"outputs":[
{
"order":0,
"type":[
"DATASET"
]
},
{
"order":1,
"type":[
"DATASET"
]
}
],
"type":"Python",
"path":"/自定义模块"
}
2.1属性说明
属性名 |
必选 |
类型 |
描述 |
name |
是 |
String |
节点名称,注意这个名称与定义的json文件名相同(不能和已经存在的节点名称相同),与Python脚本文件名相同。 |
alias |
是 |
String |
节点别名,在界面上显示的名称 |
configs |
是 |
|
该节点相关配置项, 可以配置多个 name: 名称, Python程序中,可以通过这个名词获取配置的值 label: 配置项标签,在界面会有显示 type: 配置项数据类型,目前支持类型有:int,float,double,string value:配置项默认值 |
inputs |
是 |
|
节点的输入点,可以配置多个,配置了多少个,节点的顶端就显示多少个点 order: 表示输入点顺序,在节点顶端,会按照这个顺序排开 type: 支持输入点的数据类型, 目前暂时只支持DATASET |
outputs |
是 |
|
节点输出点,可以配置多个,配置了多少个,节点的底端就显示多少个点 order: 表示输入点顺序,在节点底端,会按照这个顺序排开 type: 支持输入点的数据类型, 目前暂时只支持DATASET |
type |
是 |
|
节点类型,这里只能是Python |
path |
是 |
|
节点路径,在节点树中所在的路径 |
3.Python脚本
· 文件内容不能为空,且首行只能为:# -*- coding: UTF-8 -*-
· 脚本中必须提供execute(inputs=None,configs=None)方法
· 返回必须是包含一个或多个pandas.DataFrame的列表
3.1示例一(不涉及算法的训练、预测、评估)
# -*- coding: UTF-8 -*-
from sklearn.model_selection import train_test_split
def execute(inputs=None, configs=None):
input0 = inputs[0]
df = input0["dataframe"]
train_ratio = configs['datasetRatio']
train_df, test_df = train_test_split(df, train_size=train_ratio)
return [train_df, test_df]
3.2示例二(涉及算法的训练、预测、评估)
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
# Can not change the name and params of method, only can write code in method body
# Param<df_train>: a pandas.DataFrame of need to train dataset
# Param<feature_cols>: a list of feature column name, if not then empty list
# Param<label_col>: a string of label column name, if not then empty string
# Param<configs>: a dict of node param configs, if not then empty dict
# Must return a model object, because predict step will need it
def fit(df_train=None, feature_cols=None, label_col=None, configs=None):
print("node param q: " + str(configs['q']))
from sklearn.linear_model import LinearRegression
x = df_train.loc[:, feature_cols].dropna()
y = df_train[label_col].values
model = LinearRegression()
model.fit(x, y)
# Must return a model object, because predict method will need it
return model
# Can not change the name and params of method, only can write code in method body
# Param<model>: a model object of trained by fit step return
# Param<df_test>: a pandas.DataFrame of need to predict
# Param<feature_cols>: a list of feature column name, if not then empty list
# Param<configs>: a dict of node param configs, if not then empty dict
# Must return a predict dataset as pandas.DataFrame, because evaluate step will need it
def predict(model=None, df_test=None, feature_cols=None, configs=None):
x = df_test.loc[:, feature_cols].dropna()
y_pred = model.predict(x)
y_pred2 = y_pred[:, np.newaxis]
result = np.concatenate((df_test, y_pred2), axis=1)
predict_df = pd.DataFrame(result).infer_objects()
columns = df_test.columns.values.tolist()
# a column name of predict result, you can name it as others.
columns += ['prediction']
predict_df.columns = columns
# Must return a predict dataset as pandas.DataFrame, because evaluate method will need it
return predict_df
# Can not change the name and params of method, only can write code in method body
# Param<predict_df>: a pandas.DataFrame of predict by predict step return
# Param<label_col>: a string of label column name, if not then empty string
# Param<configs>: a dict of node param configs, if not then empty dict
# Must return a dict object
def evaluate(predict_df=None, label_col=None, configs=None):
import sklearn.metrics as metrics
y_true = predict_df[label_col].values
# use the column name of predict result by predict step named
y_pred = predict_df['prediction'].values
mse = metrics.mean_squared_error(y_true, y_pred)
mae = metrics.mean_absolute_error(y_true, y_pred)
r2 = metrics.r2_score(y_true, y_pred)
rmse = np.sqrt(mse)
mape = np.mean(np.abs((y_pred - y_true) / y_true)) * 100
result = {
'mse': mse,
'mae': mae,
'rmse': rmse,
'r2': r2,
'mape': mape
}
# Must return a dict object
return result
3.3Python脚本execute方法参数说明
属性名 |
必选 |
类型 |
描述 |
inputs |
是 |
list |
是list对象,跟节点定义的inputs属性相对应。 如果输入为数据集的时候(目前只支持数据集),数据格式如下: [{
“dataframe”: df,
dataframe: 是一个pandas.DataFrame featureCols:特征字段,是前端所选择的特征字段。如果前端没有选择,所有字段都是特征字段 labelCol:标签字段,也是前端设置的,如果没有设置,便为空 |
configs |
是 |
dict |
是个字典对象,对应到节点定义的configs属性 比如:
{
|