R语言--不均衡问题处理

在机器学习分类任务中,常常会碰到样本不均衡问题,正确处理样本不均衡会提高模型的实用性和准确率,本文介绍不均衡问题以及用R语言解决。

介绍

样本不均衡问题是指在机器学习分类任务中,不同类型的样本占比差距悬殊。
比如训练数据有100个样本,其中只有5个正样本,其余均为负样本,这样正样本:负样本=5%:95%,训练数据中负样本过多,会导致模型无法充分学习到正样本的信息,这时候模型的正确率往往较高,但特异性却很低,即模型识别正样本的能力很差。这样的模型是无法投入实际项目中的,我们需要解决不均衡问题带来的影响。

解决方法

解决样本不均衡,采用的方法是重采样。根据采样的方法,分为欠采样、过采样和组合采样。

  • 欠采样 Unde-sampling
    减少训练数据中多数样本的比例,使正负样本比例大致为1:1。

  • 过采样 Over-sampling
    增加训练数据中少数样本的比例,使正负样本比例大致为1:1。

  • 组合采样 Combinaton-sampling
    减少多数样本的同时增加少数样本的比例,使正负样本比例大致为1:1。

R代码实现

在R语言中,ROSE包用于处理样本不均衡问题。
安装包

install.packages("ROSE")

加载示范数据,查看列联表。可以看到训练数据hacide.train出现了样本不均衡,正样本1只有20个,负样本0有980个。

library(ROSE)
data(hacide)
table(hacide.train$cls)
## 
##   0   1 
## 980  20
  • 欠采样处理
# 欠采样
balance.under <- ovun.sample(cls~.,data = hacide.train,
                             p=0.5,seed = 1,method = "under")$data
# 查看均衡处理后的数据
table(balance.under$cls)
## 
##  0  1 
## 19 20

欠采样会缩小训练数据。训练数据虽然正负样本均衡了,但由于原始的正样本很少,导致处理后总样本数减少很多。这个方法适用于训练数据很大,且正样本也较大的情况,可以用欠采样来减少训练数据规模,提高训练速度。

  • 过采样处理
# 过采样
balance.over <- ovun.sample(cls~.,data = hacide.train,
                            p=0.5,seed=1,method = "over")$data
# 查看均衡处理后的数据
table(balance.over$cls)
## 
##   0   1 
## 980 941

过采样会增大训练数据。该方法适用于训练数据中正样本数量较少的情况。

  • 组合采样处理
# 组合采样
balance.both <- ovun.sample(cls~.,data = hacide.train,
                            N = nrow(hacide.train),p=0.5,seed=1,method = "both")$data
# 查看均衡处理后的数据
table(balance.both$cls)
## 
##   0   1 
## 520 480

组合采样会同时增加正样本和减少负样本。参数N表示处理后样本总数,一般设置为训练数据样本数。

对比实验

不均衡样本对模型的训练结果会产生较大偏差,以实际分类问题为例,对比一下处理与不处理均衡样本的结果。

  • 数据准备
# 训练数据
trainData <- hacide.train
table(trainData$cls)
## 
##   0   1 
## 980  20
# 测试数据
set.seed(123)
testData <- hacide.test[sample(1:nrow(hacide.test),1000,replace = TRUE),] # 放大测试数据样本
table(testData$cls)
## 
##   0   1 
## 981  19
  • 训练数据均衡处理
balancedData <- ovun.sample(cls~.,data = trainData,
                         N = nrow(hacide.train),p=0.5,seed=1,method = "both")$data
  • 模型训练
    采用knn算法实现二分类模型,用caret包实现。
library(caret)
# 不均衡处理训练模型
fit1 <- train(cls~.,data = trainData,method="knn")
# 均衡处理后训练模型
fit2 <- train(cls~.,data = balancedData,method="knn")
  • 模型预测
# 不均衡处理预测
predict1 <- predict(fit1,testData)
# 均衡处理预测
predict2 <- predict(fit2,testData)
  • 结果
# 不均衡处理预测结果混淆矩阵
confusionMatrix(predict1,testData$cls)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 981  12
##          1   0   7
##                                           
##                Accuracy : 0.988           
##                  95% CI : (0.9791, 0.9938)
##     No Information Rate : 0.981           
##     P-Value [Acc > NIR] : 0.058838        
##                                           
##                   Kappa : 0.5337          
##                                           
##  Mcnemar's Test P-Value : 0.001496        
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.3684          
##          Pos Pred Value : 0.9879          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.9810          
##          Detection Rate : 0.9810          
##    Detection Prevalence : 0.9930          
##       Balanced Accuracy : 0.6842          
##                                           
##        'Positive' Class : 0               
## 
# 均衡处理预测结果混淆矩阵
confusionMatrix(predict2,testData$cls)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 968   5
##          1  13  14
##                                           
##                Accuracy : 0.982           
##                  95% CI : (0.9717, 0.9893)
##     No Information Rate : 0.981           
##     P-Value [Acc > NIR] : 0.46861         
##                                           
##                   Kappa : 0.5998          
##                                           
##  Mcnemar's Test P-Value : 0.09896         
##                                           
##             Sensitivity : 0.9867          
##             Specificity : 0.7368          
##          Pos Pred Value : 0.9949          
##          Neg Pred Value : 0.5185          
##              Prevalence : 0.9810          
##          Detection Rate : 0.9680          
##    Detection Prevalence : 0.9730          
##       Balanced Accuracy : 0.8618          
##                                           
##        'Positive' Class : 0               
## 

从预测的结果来看,均衡处理与不均衡处理的模型准确率都很高,都超过了98%,貌似模型都很好。但均衡处理后模型的特异性达到了73.68%,未采用均衡处理的模型只有36.84%,显然均衡处理能提高模型的特异性

总结

处理样本不均衡问题是做分类问题不可或缺的的一步,针对训练数据的情况,可以采用不同的均衡处理方法。均衡处理的目的是尽可能多的且高效的利用训练数据里的信息,不至于后续训练出的模型学习的不够充分,出现较大偏差。均衡处理对于既要求准确率高,又要求特异性高的模型来说尤为重要。

发布了11 篇原创文章 · 获赞 5 · 访问量 1183
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览