python模型预测随机性去除:字典keys()和集合set()的顺序随机性

模型预测时一直去不掉随机性,固定seed也没有用,每次运行结果有略微不同。

 

后调试发现是由于字典keys()和集合set()的顺序随机性导致。(应该只有set,keys()不是,而且注意是不同次运行,而不是同一次运行的多次重复时,才会不一样。)

如下例,虽然后续有按非key的字段用sorted()排序,但是由于非key字段值可能重复,sorted()对于相同value又是按照输入顺序保序排序的,所以两次运行输入顺序不同,导致sorted后顺序也不同。

combined_answers = [(t, (o1.get(t, 0), o2.get(t, 0))) for t in list(set(o1.keys())|set(o2.keys()))]
# 上面的key顺序两次运行不固定,虽然下面根据字段1来sorted,但是字段1值相同的则顺序不固定,排序后依然不固定
answers_logits = sorted(combined_answers, key=lambda x: -sum(x[1]))
np.random.seed(1)  # 可固定seed
ids = list(set(set1.keys())&set(set2.keys()))
# 即使random可固定seed,但是上面ids顺序不固定,所以还是不固定
ids = np.random.permutation(list(ids))  # random

 

解决办法是对key字段排序,或set情况下list(set())后对列表排序,保证输入顺序相同。

后面如果要改变顺序,用np.random再随机化,则可通过在前面固定seed的方式使得结果可复现。

combined_answers = [(t, (o1.get(t, 0), o2.get(t, 0))) for t in sorted(list(set(o1.keys())|set(o2.keys())))]
# sorted对key排序
answers_logits = sorted(combined_answers, key=lambda x: -sum(x[1]))
np.random.seed(1)  # 可固定seed
ids = list(set(set1.keys())&set(set2.keys()))
ids = sorted(ids)  # 添加排序
ids = np.random.permutation(list(ids))  # random,前面固定seed
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值