python dict 结构存在的一个坑 以及使用 sklearn 用字典保存多个算法模型

希望生成一系列不同精度的 Naive Bayes 分类器,故需要保存多个这样的算法模型。

在python 语言中,可以用字典来保存 算法模型

import copy
##需要对模型进行 copy,故要 copy 模块
print('生成')
for i in np.arange(0,100):
    y_train = flip(y1,p[i])
    #print('翻转后元素真实标记比例', np.sum(y_train==y1) / y_train.shape[0])
    true_label_ratio.append(np.sum(y_train==y1) / y_train.shape[0])
    #names['model_%s'%i] = gnb.fit(X1, y1)
    model_i = gnb.fit(X1, y_train)  #当前 model
    
    w = copy.copy(model_i)
    model_all['%s'%i] = w
    ###若用 model_all['%s'%i] = model_i 则会出错##
    preds = model_i.predict(X2)
    #accu.append(accuracy_score(y2, preds))
    print(accuracy_score(y2, preds))
    #accu1.append(accuracy_score(y1, model_i.predict(X1)))  

但 python 语言的 dict 有一个坑,就是,为了减少内存的使用,其键值对是链接关系,并未进行复制生成新的键值,故不能用同一个局部变量生成多值,否则后面值会覆盖前面值。如下:

a = {}
for i in np.arange(1,4):
    a['%s'%i] = i   # 仅指向了变量 i

##a={'1':3,'2':3,'3':3}

  

处理上述问题的做法有,进行一个显示复制,这样python语言才会真正给这个变量分配内存

a = {}
for i in np.arange(1,4):
    b = i.copy()
    a['%s'%i] = b

##a={'1': 1, '2': 2, '3': 3}

  

2021.7.29 发现 dict() 的另外一个坑:

impression_day = [dict() for _ in range(len(all_categ))]  # 按照类别,统计每条新闻的曝光天数
# 注意 [dict()]*4 会有 bug

  

原文地址:https://www.cnblogs.com/Gelthin2017/p/9716930.html