乐趣区

关于java:隐私计算FATE多分类神经网络算法测试

一、阐明

本文分享基于 Fate 应用 横向联邦 神经网络算法 多分类 的数据进行 模型训练 ,并应用该模型对数据进行 多分类预测

  • 二分类算法:是指待预测的 label 标签的取值只有两种;直白来讲就是每个实例的可能类别只有两种 (0 或者 1),例如性别只有 或者 ;此时的分类算法其实是在构建一个分类线将数据划分为两个类别。
  • 多分类算法:是指待预测的 label 标签的取值可能有多种状况,例如个人爱好可能有 篮球 足球 电影 等等多种类型。常见算法:Softmax、SVM、KNN、决策树。

对于 Fate 的外围概念、单机部署、训练以及预测请参考以下相干文章:

  • 《隐衷计算 FATE- 要害概念与单机部署指南》
  • 《隐衷计算 FATE- 模型训练》
  • 《隐衷计算 FATE- 离线预测》

 

二、筹备训练数据

上传到 Fate 里的数据有两个字段名必须是规定的,别离是主键为 id 字段和分类字段为 y 字段,y 字段就是所谓的待预测的 label 标签;其余的特色字段 (属性) 可任意填写,例如上面例子中的 x0x9

例如有一条用户数据为:支出 : 10000, 负债 : 5000, 是否有还款能力 : 1;数据中的 支出 负债 就是特色字段,而 是否有还款能力 就是分类字段。

本文只形容要害局部,对于具体的模型训练步骤,请查看文章《隐衷计算 FATE- 模型训练》

2.1. guest 端

10 条数据,蕴含 1 个分类字段 y 和 10 个标签字段 x0x9

y 值有 0、1、2、3 四个分类

上传到 Fate 中,表名为 muti_breast_homo_guest 命名空间为 experiment

 

2.2. host 端

10 条数据,字段与 guest 端一样,然而内容不一样

上传到 Fate 中,表名为 muti_breast_homo_host 命名空间为 experiment

 

三、执行训练任务

3.1. 筹备 dsl 文件

创立文件 homo_nn_dsl.json 内容如下:

{
    "components": {
        "reader_0": {
            "module": "Reader",
            "output": {
                "data": ["data"]
            }
        },
        "data_transform_0": {
            "module": "DataTransform",
            "input": {
                "data": {
                    "data": ["reader_0.data"]
                }
            },
            "output": {
                "data": ["data"],
                "model": ["model"]
            }
        },
        "homo_nn_0": {
            "module": "HomoNN",
            "input": {
                "data": {
                    "train_data": ["data_transform_0.data"]
                }
            },
            "output": {
                "data": ["data"],
                "model": ["model"]
            }
        }
    }
}

 

3.2. 筹备 conf 文件

创立文件 homo_nn_multi_label_conf.json 内容如下:

{
    "dsl_version": 2,
    "initiator": {
        "role": "guest",
        "party_id": 9999
    },
    "role": {
        "arbiter": [10000],
        "host": [10000],
        "guest": [9999]
    },
    "component_parameters": {
        "common": {
            "data_transform_0": {"with_label": true},
            "homo_nn_0": {
                "encode_label": true,
                "max_iter": 15,
                "batch_size": -1,
                "early_stop": {
                    "early_stop": "diff",
                    "eps": 0.0001
                },
                "optimizer": {
                    "learning_rate": 0.05,
                    "decay": 0.0,
                    "beta_1": 0.9,
                    "beta_2": 0.999,
                    "epsilon": 1e-07,
                    "amsgrad": false,
                    "optimizer": "Adam"
                },
                "loss": "categorical_crossentropy",
                "metrics": ["accuracy"],
                "nn_define": {
                    "class_name": "Sequential",
                    "config": {
                        "name": "sequential",
                        "layers": [
                            {
                                "class_name": "Dense",
                                "config": {
                                    "name": "dense",
                                    "trainable": true,
                                    "batch_input_shape": [
                                        null,
                                        18
                                    ],
                                    "dtype": "float32",
                                    "units": 5,
                                    "activation": "relu",
                                    "use_bias": true,
                                    "kernel_initializer": {
                                        "class_name": "GlorotUniform",
                                        "config": {
                                            "seed": null,
                                            "dtype": "float32"
                                        }
                                    },
                                    "bias_initializer": {
                                        "class_name": "Zeros",
                                        "config": {"dtype": "float32"}
                                    },
                                    "kernel_regularizer": null,
                                    "bias_regularizer": null,
                                    "activity_regularizer": null,
                                    "kernel_constraint": null,
                                    "bias_constraint": null
                                }
                            },
                            {
                                "class_name": "Dense",
                                "config": {
                                    "name": "dense_1",
                                    "trainable": true,
                                    "dtype": "float32",
                                    "units": 4,
                                    "activation": "sigmoid",
                                    "use_bias": true,
                                    "kernel_initializer": {
                                        "class_name": "GlorotUniform",
                                        "config": {
                                            "seed": null,
                                            "dtype": "float32"
                                        }
                                    },
                                    "bias_initializer": {
                                        "class_name": "Zeros",
                                        "config": {"dtype": "float32"}
                                    },
                                    "kernel_regularizer": null,
                                    "bias_regularizer": null,
                                    "activity_regularizer": null,
                                    "kernel_constraint": null,
                                    "bias_constraint": null
                                }
                            }
                        ]
                    },
                    "keras_version": "2.2.4-tf",
                    "backend": "tensorflow"
                },
                "config_type": "keras"
            }
        },
        "role": {
            "host": {
                "0": {
                    "reader_0": {
                        "table": {
                            "name": "muti_breast_homo_host",
                            "namespace": "experiment"
                        }
                    }
                }
            },
            "guest": {
                "0": {
                    "reader_0": {
                        "table": {
                            "name": "muti_breast_homo_guest",
                            "namespace": "experiment"
                        }
                    }
                }
            }
        }
    }
}

留神 reader_0 组件的表名和命名空间需与上传数据时配置的统一。

 

3.3. 提交工作

执行以下命令:

flow job submit -d homo_nn_dsl.json -c homo_nn_multi_label_conf.json

执行胜利后,查看 dashboard 显示:

 

四、筹备预测数据

与后面训练的数据字段一样,然而内容不一样,y 值全为 0

4.1. guest 端

上传到 Fate 中,表名为 predict_muti_breast_homo_guest 命名空间为 experiment

 

4.2. host 端

上传到 Fate 中,表名为 predict_muti_breast_homo_host 命名空间为 experiment

 

五、筹备预测配置

本文只形容要害局部,对于具体的预测步骤,请查看文章《隐衷计算 FATE- 离线预测》

创立文件 homo_nn_multi_label_predict.json 内容如下:

{
    "dsl_version": 2,
    "initiator": {
        "role": "guest",
        "party_id": 9999
    },
    "role": {
        "arbiter": [10000],
        "host": [10000],
        "guest": [9999]
    },
    "job_parameters": {
        "common": {
            "model_id": "arbiter-10000#guest-9999#host-10000#model",
            "model_version": "202207061504081543620",
            "job_type": "predict"
        }
    },
    "component_parameters": {
        "role": {
            "guest": {
                "0": {
                    "reader_0": {
                        "table": {
                            "name": "predict_muti_breast_homo_guest",
                            "namespace": "experiment"
                        }
                    }
                }
            },
            "host": {
                "0": {
                    "reader_0": {
                        "table": {
                            "name": "predict_muti_breast_homo_host",
                            "namespace": "experiment"
                        }
                    }
                }
            }
        }
    }
}

留神以下两点:

  1. model_idmodel_version 需批改为模型部署后的版本号。
  2. reader_0 组件的表名和命名空间需与上传数据时配置的统一。

 

五、执行预测工作

执行以下命令:

flow job submit -c homo_nn_multi_label_predict.json

执行胜利后,查看 homo_nn_0 组件的数据输入:

能够看到算法输入的预测后果。

 

扫码关注有惊喜!

退出移动版