2017.11.08 encode_test方法中遇到的问题
1. 几乎花了一天的时间完成对测试数据集进行woe编码的方法,由于字典的层次很多,必须保持头脑清醒,遇到的几个问题或者说难点小结一下
- 字典的深拷贝与浅拷贝,这个问题让我又查了半天bug,字典浅拷贝的形式有dict_a.copy()或者dict(dict_a),浅拷贝很奇怪,只对dict的第一层结构进行拷贝,也就是说修改第一层键值不会影响原来的dict,但是内部的对象却是引用的形式,修改内部对象会影响原来的dict;字典的深拷贝要用copy module,from copy import deepcopy
- 测试集某个变量的范围可能超过训练集该变量的范围,这个时候编码就要把woe分组两头的范围进行相应扩展,这里我的程序必须要求缺失值用负数表示,这样两头的值的扩展方式就是,大的一边扩展到无穷大,小的一边扩展到0
- 把一个dataframe copy出来,比如df_c = df.copy(),这个时候可以写这种格式的筛选df_c[column][df[column]==x],因为df和df_c序号是一样的,df[column]==x返回的是一个bool型的Series,而且我发现这种筛选方式还不会报那个copy warning,这是什么原因呢?还有就是那个warning虽然一直报但是赋值都是没问题的
- df[column][3 >= df[column] >= 1],这种内部筛选用连等式会报错,报的错是Truth value of a Series is ambiguous. 这是因为df或者series筛选的时候不能用and/or,而是要用bitwise位运算,可以推测3 >= df[column] >=1这种形式就等价于(3 >= df[column]) and (df[column] >= 1),这就会报错,应该用&,所以连不等式的写法就不对,这些bitwise的操作符被重载成element-wise
2. 添加scorecard方法的同时,完成了kaggle Insurance competition,和我local CV的结果非常接近,可以推断,这种就是非常standard的数据集,public LB的集合就抽取自全部dataset,我们也可以看到评分卡方法是比较欠拟合的,尤其是数据量有这么大了过后,就应该用更复杂的方法来完成这个事情,去过拟合LB
留言
張貼留言