MPC多方安全计算DT(决策树)实现
一、Github项目地址
-
decision-tree-mpc:https://github.com/csiro-mlai/decision-tree-mpc
二、实现步骤(可以使用自己的数据集)
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. 导入自己的数据 (二分类)
- 注意:是可以用
./download.sh
来下载数据的(如果需要的话),这个是从UCI Machine Learning Repository上面下载数据 - 提前把数据类别标签处理成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
参数的解释见下图:
目前只能做二分类问题,emul有结果(但是emul没有执行加密运算),sh2、sh3不一定有结果(非常非常慢) - 运行结果:
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码