功能介绍
V0.24.0版本的MindOpt优化求解器新增了数据脱敏功能,可以对输入模型文件进行数据脱敏。将优化问题中问题名、决策变量、约束条件名称这些和业务场景相关的数据进行脱敏变更,使得优化问题的数据仅保留看不出用途的数值信息,隐藏业务信息。方便外发数据去做技术可行性验证、方案咨询、测试等。
数据脱敏可以称为数据的去隐私化,是对敏感数据进行修改或者转换的一种技术机制,在很大程度上能解决敏感数据直接在非可靠环境下使用的问题。比如在电商行业快递单上,会使用**号部分遮挡买家的个人信息,也能有效将数据脱敏,提供给外部使用。
优化建模文件中的主要敏感数据是业务的逻辑,比如优化问题名字、决策变量和约束条件名。业界的脱敏方案大致有这几种:无效化、随机值、数据替换、对称加密、平均值、偏移和取整。MindOpt求解器使用的是“数据替换”这一方案,顾名思义,数据替换就是设置一个虚拟值去替换真值。
如下表示意,脱敏前后的文件内容片段对比,脱敏前名称字符里面包含了业务逻辑,脱敏后信息都用固定的顺序数字来表示,删除业务逻辑,实现脱敏。
脱敏前 |
脱敏后 |
NAME AFIRO ROWS E ToTalR E StaffR10 L WorkX05 L WorkX21 E WorkR12 E SkillR13 L SkillX17 L SkillX18 L SkillX19 L GenderX20 E GenderR19 E GenderR20 COLUMNS CostX01 WorkX05 .301 R09 -1. CostX02 SkillR13 -1.06 X05 1. CostX03 SkillX18 -1. R09 1. CostX04 GenderR20 -.4 |
NAME Prob0001 FREE OBJSENSE MIN ROWS N OBJROW E R00000001 E R00000002 L R00000003 L R00000004 E R00000005 E R00000006 L R00000007 L R00000008 L R00000009 L R0000000A E R0000000B E R0000000C COLUMNS C000001 R00000003 0.301 C000002 R00000006 -1.06 C000003 R00000008 -1 C000004 R0000000C -0.4 |
使用方法
执行脱敏
MinOpt新增的脱敏功能是在命令行里面。 主要通过以下两个命令行参数调用:
- sanitize :对模型文件中的敏感数据进行重命名脱敏。
- undo_sanitize :对已脱敏后的模型文件进行反脱敏(恢复数据)。
在命令行 Terminal 或者 Notebook的Cell magic运行(增加感叹号!),可以看到接口说明。
用户可以根据文档指引下载本地运行版的安装包,安装到自己本机来运行数据脱敏。下载地址:https://help.aliyun.com/document_detail/298275.html
脱敏功能支持 .mps/.lp 以及对应的压缩文件(.bz2/.gz)的文件格式,我们可以用安装包examples中的模型文件afiro.mps
作为例子,如下方式运行来实现脱敏。
mindopt <path/to/data>/afiro.mps --sanitize #<path/to/data>为文件路径
比如云平台的Notebook中可以这样运行
!mindopt /home/jupyter/mindopt/0.24.0/examples/data/afiro.mps MaxTime=10800 SPX/MaxIterations=1000000000 --sanitize
运行完成后,会输出结果的说明:
Reader started. File : /home/jupyter/mindopt/0.24.0/examples/data/afiro.mps Reader terminated. Time : 0.001s ProbName sanitized. Sanitized variables count : 32 Sanitized constraints count : 27 File desensitized : /home/jupyter/mindopt/0.24.0/examples/data/afiro_sanitized.mps File Mapping : /home/jupyter/mindopt/0.24.0/examples/data/afiro_mapping.json
第1行:展示了读的是哪个文件
第6-7行:总结了模型有多少个变量,多少个约束。
第8-9行:脱敏完成,输出文件映射的地址,并在脱敏前文件的同级目录下生成脱敏后模型文件 afiro_sanitized.mps 和映射文件 afiro_mapping.json。
检查是否脱敏后数据
我们打开脱敏的优化问题文件 afiro_sanitized.mps,可以里面名称中的敏感信息是否已经被替换掉。命名规以R/C开头,十六进制整数递增就代表脱敏成功了,再检查没有其他问题就可以外发去测试了。
脱敏后的数据保留的数值还是原来的对应关系,不影响求解结果,比如我们用MindOpt运行脱敏后的文件:
mindopt afiro_sanitized.mps
运行后得到结果如下,与脱敏前运行结果一致。
反脱敏
脱敏时,生成的映射文件 afiro_mapping.json是用来后面恢复数据用的。此功能没有实际用途,主要是方便验证,请外发的时候不要发此映射文件。
这里我们打开映射文件 afiro_mapping.json
查看一下映射关系,文件格式如下所示。如果脱敏前文件不包含模型名或模型名为空时,映射文件不展示 ProbName
。
这里我们可以把数据存在同一个目录,然后执行反脱敏命令:
!mindopt ./data/afiro_mapping.json --undo_sanitize
会得到如下输出示意:
./data/afiro_sanitized.mps Reader started. File : ./data/afiro_sanitized.mps Reader terminated. Time : 0.000s ProbName undo sensitized. Undo sanitized variables count : 32 Undo sanitized constraints count : 27 File undo sanitized : ./data/afiro_sanitized_sanitized.mps
运行后还原脱敏模型文件,生成afiro_sanitized_sanitized.mps
文件。
运行afiro_sanitized_sanitized.mps
文件结果与上文一致。