如何在 r 中使用 smote 处理不平衡数据(附示例)
在使用机器学习分类算法时,数据集中的类别通常会不平衡。
例如:
- 包含大学球员是否被选入 NBA 信息的数据集可能有 98% 的球员未被选秀,2% 的球员被选秀。
- 包含患者是否患有癌症信息的数据集可能包含 99% 没有癌症的患者,而只有 1% 患有癌症。
- 包含银行欺诈信息的数据集可能包含 96% 的合法交易和 4% 的欺诈交易。
由于这些不平衡的类别,您构建的预测模型可能不适用于少数类别。
更糟糕的是,少数群体往往是我们最想预测的群体。
解决这种不平衡问题的一种方法是使用合成少数过采样技术,通常缩写为SMOTE 。
该技术涉及通过对少数类的观察值进行过采样来创建新的数据集,从而生成具有更平衡类的数据集。
在 R 中使用 SMOTE 最简单的方法是使用DMwR包中的SMOTE()函数。
该函数使用以下基本语法:
SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)
金子:
- form :描述您想要适应的模型的公式
- data : 数据框的名称
- perc.over :决定生成少数类的额外案例的数字
- perc.under :决定生成多少个多数类的附加案例的数字
下面的例子展示了如何在实际中使用这个功能。
示例:如何在 R 中使用 SMOTE
假设我们有以下数据集,其中 R 中有 100 个观测值,其中 90 个响应变量具有“是”类,10 个具有“否”类:
#make this example reproducible set. seed ( 0 ) #create data frame with one response variable and two predictor variables df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )), x1=rnorm( 100 ), x2=rnorm( 100 )) #view first six rows of data frame head(df) y x1 x2 1 Yes 1.2629543 0.7818592 2 Yes -0.3262334 -0.7767766 3 Yes 1.3297993 -0.6159899 4 Yes 1.2724293 0.0465803 5 Yes 0.4146414 -1.1303858 6 Yes -1.5399500 0.5767188 #view distribution of response variable table(df$y) Drowned 10 90
这是不平衡数据集的典型示例,因为我们预测的响应变量有 90 个属于“是”类别的观测值,而只有 10 个属于“否”类别的观测值。
为了创建更平衡的数据集,我们可以使用DMwR包中的SMOTE()函数:
library ( DMwR) #use SMOTE to create new dataset that is more balanced new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 ) #view distribution of response variable in new dataset table(new_df$y) Drowned 210,800
生成的数据集包含 210 个以“否”为类别的观察值和 800 个以“是”为类别的观察值。
以下是 SMOTE 函数生成这个新数据集的具体方式:
- perc.over参数指定我们想要将现有少数观测值数量的 2000/100(或 20)倍添加到数据集中。由于原始数据集中存在 10 个观测值,因此我们添加了 20*10 = 200 个额外的少数观测值。
- perc.under参数指定我们希望使多数观测值的数量等于添加到现有少数观测值的少数观测值数量的 400/100(或 4)倍。由于添加了 200 个额外的少数观测值,因此我们使多数观测值的数量等于 200 * 4 = 800 个多数观测值。
最终结果是一个仍然包含更多多数类的数据集,但仍然比原始数据集更加平衡。
现在,您可以使您选择的分类算法适应这个新数据集,该算法应该在少数类上表现更好,因为这个新数据集中有更多来自少数类的观察结果。
注意:随意使用 SMOTE 函数中的perc.over和perc.under参数来获取适合您需求的数据集。
其他资源
以下教程解释了如何在 R 中执行其他常见任务: