![220c05fb440823e0a8999641b89e073a.png](https://i-blog.csdnimg.cn/blog_migrate/8015c43b5bb65de9bcc94ee844b40c2f.jpeg)
前几天在用pyspark建模的时候,遇到一个非常怪异的情况,我对特征做完编码后,数据量变为了1/3,我顿时感觉很惊讶,怎么突然少了这么多,那结果还准确嘛?
offline原始dfcnt
这就是当时的数据情况,基本意思是,我对特征做完均值填充后还有642402个样本,到onehot后就只剩下276848个样本了,后面做归一化后又变了,难道做个onehot编码样本数还会变吗?
我又找了具体的代码看了下
![ffb981240f4e68022b2d944d3a9a86be.png](https://i-blog.csdnimg.cn/blog_migrate/5a7cc371da7878b4437506c227e7707d.jpeg)
从代码中可以看到,从填充完均值到计算onehot编码,中间经历了StringIndexer编码(函数名貌似写反了)和onehot编码,又找到我的封装函数
![bc4d76cb8e18aaa106e29f95c1102bda.png](https://i-blog.csdnimg.cn/blog_migrate/aedd18a93f8757fdcb8f83a796989ffe.jpeg)
看了函数,觉得也没有异常的地方,唯一有问题的可能就是第95行dropLast=False了,我查了下官方文档,基本意思是说,是否删除最后一个stringindex编码的序号,最后一个就是重复次数最少,特征出现最少的取值,这里是False就是说不丢,即保留原有特征的各个取值,所以这里应该是不会导致出现样本数减少的原因。
继续找,那应该就很大可能是出现在StringIndexer编码上了,上代码:
![d680df9e99d91d5a8e0396a9b9750459.png](https://i-blog.csdnimg.cn/blog_migrate/dd631ac9d71221e2b4071d8ad7dc2a4d.jpeg)
突然发现这里有一个HANDTYPE的参数,之前看了官方文档,没明白其中的含义,这下直接明白了,先看下官方文档
![4730fb00ee6f2bb8d825dcda0156eecc.png](https://i-blog.csdnimg.cn/blog_migrate/0963334b41428c3ddccb8bc25a5ad7f7.png)
之前看着觉得很奇怪,就没有深究,这会再看,豁然开朗,HANDTYPE可以选择skip/error/keep三种值,刚好我选择的是skip,这就意味着在String Index编码时,会过滤掉有空值的样本,这下找到原因了,好了改成keep和error都分别测试了下,果然样本数没减少了
本质上,一般来讲跳过空值可能会对模型有利一些,不过我们得知道样本损失在什么地方了,做到心中有数,模型效果好能知道为什么好,不好又是因为什么而不好。