MPC多方安全计算DT(决策树)实现

一、Github项目地址

  • decision-tree-mpc:https://github.com/csiro-mlai/decision-tree-mpc

  • MP-SPDZ:https://github.com/data61/MP-SPDZ/

二、实现步骤(可以使用自己的数据集)

1. 环境:linux系统(ubuntu)

2. git clone “decision-tree-mpc”项目至本地

git clone https://github.com/csiro-mlai/decision-tree-mpc.git

注意:如果网络代理有问题的话,可以尝试取消代理,或者在github.com前面加gitclone.com/

3. 安装MP-SPDZ文件

  • 下载地址:https://github.com/data61/MP-SPDZ/releases
  • mp-spdz-0.3.4.tar.xyz解压到文件夹 decision-tree-mpc/下,并重命名为MP-SPDZ
  • 接着执行:
cd MP-SPDZ
Scripts/tldr.sh
make boost mpir
cd ..
./build-mp-spdz.sh

注意:这个过程中会报各种各样的错误,应该基本上都是缺少包,或者是网络代理的问题,可以从这个方向上解决。

3. 导入自己的数据 (二分类)

  • 提前把数据类别标签处理成0和1,并分好训练集、测试集
  • 将数据复制到文件夹decision-tree-mpc/.data.test格式,可以用编辑器打开csv, 在 , 后面加空格,然后复制训练数据到 .data文件中,复制测试数据到 .test文件中)
  • 修改prepare.py文件(下面是修改过的版本,另外根据自己的数据还需要进行修改的地方用注释标注)
#!/usr/bin/python3

import sys

binary = 'binary' in sys.argv
mixed = 'mixed' in sys.argv
nocap = 'nocap' in sys.argv

if binary:
    out = open('binary', 'w')
elif mixed:
    out = open('mixed', 'w')
elif nocap:
    out = open('nocap', 'w')
else:
    out = open('data', 'w')

for start, suffix in (0, 'data'), (1, 'test'):
    data = [l.strip().split(', ') for l in open('bibtex.%s' % suffix)]    #修改此处,把文件名替换掉(比如这里的文件名是bibtex)
    print(' '.join(str(int(x[-1].startswith('1'))) for x in data), file=out)
    total = 0
    max_value = 0

    if not binary:
        if nocap:
            attrs = 0, 4, 12
        else:
            attrs = [i for i in range(1836)] #修改此处,range()里是属性列的数量(比如此处有1836列属性列
        for i in attrs:
            print(' '.join(str(int(float(x[i])*100)) for x in data), file=out)
            print(' '.join(str(int(float(x[i])*100)) for x in data))
            total += 1
            for x in data:
              max_value = 1

    print(len(data), 'items')
    print(total, 'attributes')
    print('max value', max_value) 
  • 进入文件夹 MP-SPDZ/Programs/Source,修改文件adult.mpc(下面是修改过的版本,另外根据自己数据还需要修改的地方用注释标注)
m = 1836  #此处需要修改,改为属性列的数量
n_train = 5473  #此处需要修改,改为训练数据的行数
n_test = 200  #此处需要修改,改为测试数据的行数

combo = 'combo' in program.args
binary = 'binary' in program.args
mixed = 'mixed' in program.args
nocap = 'nocap' in program.args

try:
   n_threads = int(program.args[2])
except:
   n_threads = None

if combo:
   n_train += n_test

if binary:
   m = 67
   attr_lengths = [1] * m
elif mixed or nocap:
   cont = 1836    #此处需要修改,改为属性列数量
   m = 1836  #此处需要修改,改为属性列数量
   attr_lengths = [0] * cont
else:
   attr_lengths = None

program.set_bit_length(32)
program.options_from_args()

train = sint.Array(n_train), sint.Matrix(m, n_train)
test = sint.Array(n_test), sint.Matrix(m, n_test)

for x in train + test:
    x.input_from(0)

import decision_tree, util

#decision_tree.debug_layers = True
decision_tree.max_leaves = 3000

if 'nearest' in program.args:
   sfix.round_nearest = True

sfix.set_precision_from_args(program, True)

trainer = decision_tree.TreeTrainer(
   train[1], train[0], int(program.args[1]), attr_lengths=attr_lengths,
   n_threads=n_threads)
trainer.debug_selection = 'debug_selection' in program.args
trainer.debug_gini = True
layers = trainer.train_with_testing(*test)

#decision_tree.output_decision_tree(layers)

4. 训练模型

  • 进入文件夹decision-tree-mpc/,运行:
./convert.sh
./run-local.sh emul 20 2

注意:如果报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录,
很可能是.sh文件中的空行有/r出现,可以运行sed 's/\r//' -i XXX.sh(XXX是文件名)来去掉/r

  • 关于./run-local.sh emul 20 2参数的解释见下图:
    MPC多方安全计算DT(决策树)实现_第1张图片
    目前只能做二分类问题,emul有结果,sh2、sh3不一定有结果
  • 运行结果:
    MPC多方安全计算DT(决策树)实现_第2张图片

你可能感兴趣的:(决策树,python,安全,c++)