点击上方“Datawhale”,选择“星标”公众号
第一时间获取价值内容
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/8901dcac697028950246caf20ad56072.png)
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/2e5cec834e48842a3df2187e3b66e5df.png)
数据科学最需要创意的方面。
像对待其他任何创造性工作一样对待特征工程,例如喜剧表演:
一起头脑风暴
创建特征工程的模板/公式
检查/重新检查以前的工作
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/cb421bc6230dfc8513089b5d0bc8889b.png)
类别特征
几乎总是需要一些处理
高基数类别特征会导致非常稀疏的数据
难以做缺失值插补
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/0cac4b2e0292cb924332b60076ee3013.png)
Onehot编码
对长度为K的数组进行K编码。
可以与大多数线性算法一起使用
删除第一列可避免共线性(pd.get_dummies中有参数可以达到这个目的,其实就是用全0来表示一种类别其它都用1-0表示)
稀疏格式对于内存友好(csr_matrix)
大多数当前的处理方法都不能很好地对待缺失值,以及新数据中的新类别
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/e81a0641322afc4520b50af7c7f321cd.png)
一个简单的例子
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/60ca796fe684250d932d30a5ff5a1350.png)
哈希编码
对固定长度的数组执行“ OneHot编码”。(不同的hash编码通过不同的算法将类别映射为一个唯一的值,例如对于类别A通过hash编码可能映射为qwe456这种6维序列,然后我们再去做onehot展开)
避免极为稀疏的数据
可能会引起碰撞(例如10000个类别用2位的hash编码,很容易出现不同类别最终映射的hash值是相同的,此现象称为碰撞—collisions)
可以重复使用不同的哈希函数和袋结果,以降低准确性(意思应该是用不同的hash算法得到不同的编码值然后concat到一起尽量避免碰撞的发生)
碰撞collisions通常会降低结果,但可能会改善结果(增强泛化性能)。
优雅地处理新变量(例如:新的用户代理)(新的类别重新hash然后合并即可)(关于hash编码可见facebook对于文本的处理的那篇论文,忘了叫啥了,回头补充在编码的文章里好了)
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/6e9c6eaf7cbc9372dea7bc8c5ecf271d.png)
一个简单的例子
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/02e863889581371622fb4ee9d114ae3f.png)
为每个类别变量赋予唯一的数字ID
对于基于非线性树的算法很有用(仅限于lightgbm和catboost这类可以直接处理类别的算法,xgb还是要进行别的处理)
不增加维度
将cat_var-> num_id映射随机化,然后进行平均再训练,以降低准确性。(没看明白)
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/381dbe6dac050cd4c28fc95ce3331d9f.png)
一个简单的例子