决策树的保存——序列化和反序列化

根据数据集创建决策树的速度比较慢,即使数据量比较小,也需要几秒钟的时间,因此为了方便起见,在执行一次程序后,创建好树就把这棵保存起来,创建好的树是字典形式,由于写入和读出的必须是字符串格式,所以写入和读取需要使用到序列化和反序列化


方法一:使用json模块

def storeTree(inputTree,filename):
    import json
    fw = open(filename, 'w')   #只需要'w'
    fw.write( json.dumps(inputTree) )
    fw.close()

def grabTree(filename):
    import json
    fr = open(filename, 'r')   #只需要'r'
    data = json.loads( fr.read() )
    fr.close()
    return data

json创建的文本内容是正常显示的内容

json方法只能处理字符串,列表,字典等简单的数据类型,内存地址形式就不能处理

方法二:使用pickle模块

def storeTree(inputTree,filename):
    import pickle
    fw = open(filename, 'wb')    #用pickle序列化后的是二进制,所以此处用wb,以二进制写入,不然默认以字符串写入会出错
    fw.write( pickle.dumps(inputTree) )
    fw.close()

def grabTree(filename):
    import pickle
    fr = open(filename, 'rb')    #用'rb'
    data = pickle.loads( fr.read() )
    fr.close()
    return data

pickle创建的文本内容是有看似乱码实则是有对应关系的内容

import json
import pickle
myTree = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
print(json.dumps(myTree))
myTree = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
print(pickle.dumps(myTree))
{"no surfacing": {"0": "no", "1": {"flippers": {"0": "no", "1": "yes"}}}}
b'\x80\x03}q\x00X\x0c\x00\x00\x00no surfacingq\x01}q\x02(K\x00X\x02\x00\x00\x00noq\x03K\x01}q\x04X\x08\x00\x00\x00flippersq\x05}q\x06(K\x00h\x03K\x01X\x03\x00\x00\x00yesq\x07usus.'    #两种结果,一种是正常显示,一种是二进制





猜你喜欢

转载自blog.csdn.net/xiaobaicai4552/article/details/79144347