(1)准备数据过程中,遇到了缺失值的问题。以往都是自己手动写代码,用缺失值样本所在类别的均值或者众数替换掉,结果今天发现,DMwR2包就有处理缺失值的函数,而且思想一致【大哭】
先奉上代码:
- install.packages("DMwR2");
- library(DMwR2) ;
- knnImputation(YourDataFrame)
(2)准备用SMOTE函数时,发现DMwR包在老早之前,就从R语言 CRAN中移除了。多方搜索,找到了DMwR包的网页下载路劲:https://cran.r-project.org/src/contrib/Archive/DMwR/?C=D;O=A。直接下载最新版,下载后将Zip文件存放至R语言目标文件夹的library中(主要是方便以后别人需要,我可以很快找到这个东西在哪里)。
比如,我的存放路径是:D:\Software\R-4.1.1\library
那么,现在回到R语言编程界面,输入代码:install.packages("D:/Software/R-4.1.1/library/DMwR_0.4.1.tar.gz", repos=NULL, type="source"),执行。【在这里我犯了一个小错,输入路径时候,把压缩包的后缀‘.gz‘落下了,由此走了好多弯路,解决不了,还下载R语言的2个老版本企图解决问题,不过还好问题没解决,我又发现了这个小错误。】
结果报错:“ERROR: dependency ‘abind‘ is not available for package ‘DMwR‘”。于是,再手动install.packages("abind"),安装成功后,再次执行install.packages("D:/Software/R-4.1.1/library/DMwR_0.4.1.tar.gz", repos=NULL, type="source")。到这里,我的DMwR就成功了。
如果上面这个ERROR后还跟了其他的包也缺失的话,就多单独安装一下。
(3)SMOTE函数的运用
完成上述的操作,library(DMwR)即可调用SMOTE函数。
SMOTE函数如下:SMOTE(form, data, perc.over = 200, k = 5, perc.under = 200, learner = NULL, …)。
1) form是公式,直接Y~.即可(这个Y就是你因变量的名称)。值得注意的是,这里的Y,如果是数据集中是数值型的话,一定要转换成factor类型(DataFrame[,"Y"] <- factor(DataFrame[,"Y"]) 即可);
2)data,我们的数据集,包含了因变量和很多自变量的表;
3)perc.over:指定从少数样本中采样的比例;
4)perc.under:对多数样本下采样,有多少比例的样本被选入新的数据集中;
5)k:跟K近邻的思想一致,理解为通过周围都少个邻居决定生成数据吧;
6)重点!!!!怎么确定perc.over和perc.under的输入数值呢?
这里,针对我们的数据集做几个假设:
- 数据集中少数样本个数:N=30
- 数据集中少数样本个数:M=100
- 想要生成的少数样本数量TarN;多数样本TarM;| TarN=60;TarM=0
- perc.over:X; perc.under:Y
- 现在,我想生成90个少数类样本,多数类不变。怎么确定我的X和Y呢?
且看公式:
X =(TarN)*100/N = 200
Y =(M+TarM)*100*100/(X*N) = 166.6667(保留3-4位小数就可以比较精准了)
这时候,再看我们的数据集,就有N+TarN+M+TarM条数据了。这篇博客的计算公式主要参考如下链接: https://blog.csdn.net/qq_34139222/article/details/57461398,但是在实际验证的过程中,发现该博客在perc.over确定的时候,跟实际情况对不上。所以做了修改。经验证,上述X,Y的最终计算结果应该是木有问题的了。
最后,用SMOTE处理了数据的时候,记得一定要在原始数据集中分出一批数据,不参与Smote的扩增处理,保证一批干净的数据用于后续模型的验证。但是多次碰到一个问题,就是用SMOTE处理了数据后,在内部验证的结果都非常好,但一用前面说的干净数据集验证时,结果特别差。以前没有仔细找原因,今天特地看了一下自己的生成数据,发现一个问题:我的数据集中有很多类别型变量,但是用smote算法后,它由于是靠距离决定的,所以模拟数据的结果,所有的变量都是数值型变量。因此,生成了模拟数据后,还需要再做一步的工作是,对类别型变量做一个round(X,0)的处理,不要小数点,不要变成数值型数据。
做了这一步改进之后,结果依然很差。后续会再来一篇博客,单独思考,SMOTE后的数据,为啥这么容易过拟合的问题。希望能找到原因及破解之法。