隱私計算FATE-多分類神經網絡算法測試

一、說明

本文分享基於 Fate 使用 橫向聯邦 神經網絡算法多分類 的數據進行 模型訓練,並使用該模型對數據進行 多分類預測

  • 二分類算法:是指待預測的 label 標籤的取值只有兩種;直白來講就是每個實例的可能類別只有兩種(0 或者 1),例如性別只有 或者 ;此時的分類算法其實是在構建一個分類線將數據劃分爲兩個類別。
  • 多分類算法:是指待預測的 label 標籤的取值可能有多種情況,例如個人愛好可能有 籃球足球電影 等等多種類型。常見算法:Softmax、SVM、KNN、決策樹。

關於 Fate 的核心概念、單機部署、訓練以及預測請參考以下相關文章:

 

二、準備訓練數據

上傳到 Fate 裏的數據有兩個字段名必需是規定的,分別是主鍵爲 id 字段和分類字段爲 y 字段,y 字段就是所謂的待預測的 label 標籤;其他的特徵字段(屬性)可任意填寫,例如下面例子中的 x0 - x9

例如有一條用戶數據爲: 收入 : 10000,負債 : 5000,是否有還款能力 : 1 ;數據中的 收入負債 就是特徵字段,而 是否有還款能力 就是分類字段。

本文只描述關鍵部分,關於詳細的模型訓練步驟,請查看文章《隱私計算FATE-模型訓練

2.1. guest端

10條數據,包含1個分類字段 y 和 10 個標籤字段 x0 - x9

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 組件的數據輸出:

可以看到算法輸出的預測結果。

 

掃碼關注有驚喜!

file

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章