在R的DMwR包中提供了SMOTE函数用于不平衡的分类问题,其背后的原理是SMOTE算法。SMOTE函数产生一个新的数据集来解决分类不平衡的问题。 SMOTE(Synthetic Minority Oversampling Technique),合成少数类过采样技术.它是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General),SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体如下图所示,算法流程如下。 (1)对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其k近邻。 (2)根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn。 (3)对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本。 SMOTE算法的思想是合成新的少数类样本,合成的策略是对每个少数类样本a,从它的最近邻中随机选一个样本b,然后在a、b之间的连线上随机选一点作为新合成的少数类样本。如图所示: 用法: SMOTE(form, data, perc.over = 200, k = 5, perc.under = 200, learner = NULL, …) 参数解释: form:描述预测问题的公式 data:原始的不平衡的数据集 k:用于产生新的少数派样本的最近邻数量(与kNN中的k类似) learner:可选参数,指定一个分类算法的函数名称(类型为字符串),这个函数将对结果进行分类 perc.over:指定从少数样本中采样的比例。 perc.under:对多数样本下采样,有多少比例的样本被选入新的数据集中 关于perc.over和perc.under的具体解释: 假设初始数据集中有N个少数样本和M个多数的样本,perc.over=a,perc.under=b。首先增加少数派样本的数量,平均每个样本增加a/100个新样本,一共新增了aN/100个全新的少数派样本,并把最初的少数派样本和新增的少数派样本都放入新的数据集中。然后对多数派的样本进行采样,采样数量为(b/100) * aN/100,得到新的多数派样本,将新的多数派样本放入到新的数据集中,这样新的数据集中,少数派样本有(1+a/100)N个,多数派样本有(b/100) * aN/100个 perc.over 不能为0 在R的help文档中符了一个案例: ## A small example with a data set created artificially from the IRIS ## data data(iris) data <- iris[, c(1, 2, 5)] data$Species <- factor(ifelse(data$Species == "setosa","rare","common")) ## checking the class distribution of this artificial data set table(data$Species) ## now using SMOTE to create a more "balanced problem" newData <- SMOTE(Species ~ ., data, perc.over = 600,perc.under=100) table(newData$Species) ## Checking visually the created data ## Not run: par(mfrow = c(1, 2)) plot(data[, 1], data[, 2], pch = 19 + as.integer(data[, 3]), main = "Original Data") plot(newData[, 1], newData[, 2], pch = 19 + as.integer(newData[,3]), main = "SMOTE'd Data") ## End(Not run) ## Now an example where we obtain a model with the "balanced" data classTree <- SMOTE(Species ~ ., data, perc.over = 600,perc.under=100, learner='rpartXse',se=0.5) ## check the resulting classification tree classTree ## The tree with the unbalanced data set would be rpartXse(Species ~ .,data,se=0.5) ———————————————— 版权声明:本文为CSDN博主「君溪竹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_34139222/article/details/57461398 |
|