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

2022-07-07 12:11:17

一、說明

本文分享基於 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 元件的資料輸出:

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

 

掃碼關注有驚喜!