数据分布不平衡及多种解决方法介绍


点击下面就可以蓝色字体就行

不平衡理论原理及多种解决方法介绍

SMOTE算法
SMOTE全称是Synthetic Minority Oversampling Technique即合成少数类过采样技术,它是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General),SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体如图下2所示,算法流程如下。

1 对于少数类中每一个样本xx,以欧氏距离为标准计算它到少数类样本集SminS_min中所有样本的距离,得到其k近邻。
2 根据样本不平衡比例设置一个采样比例以确定采样倍率NN,对于每一个少数类样本xx,从其k近邻中随机选择若干个样本,假设选择的近邻为x^\hat{x}。
3 对于每一个随机选出的近邻x^\hat{x},分别与原样本按照如下的公式构建新的样本。


SMOTE算法摒弃了随机过采样复制样本的做法,可以防止随机过采样易过拟合的问题,实践证明此方法可以提高分类器的性能。但是由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠(Overlapping)的问题,为了解决SMOTE算法的这一缺点提出一些改进算法,其中的一种是Borderline-SMOTE算法,如图3所示。
在Borderline-SMOTE中,若少数类样本的每个样本xix_i求k近邻,记作Si−knnS_i-knn,且Si−knnS_i-knn属于整个样本集合S<script type="math/tex" id="MathJax-Element-68">S</script>而不再是少数类样本,若满足


原文链接:http://www.jianshu.com/p/3e8b9f2764c8


看了原理,让我们来实践下,看看是否有效果?
本文采用SMOTE预处理不平衡数据,尽量让 正样本和负样本比例为1:1,然后选用svm模型分类,代码如下:

install.packages('DMwR')
install.packages('pROC')
install.packages('el071')library('pROC')
library('DMwR')
library("e1071")dt = read.csv("C://Users//yelang//Desktop//matlabyewu//r业务//svm//ww.csv") #读入数据
df =dt
sum(is.na(df))df[complete.cases(df[,9]),] #去除婚否的缺失值df[complete.cases(df['MaritalStatus']),]
df[complete.cases(df['VehiclePrice']),]df['Age']
attach(df)
Age[Age == 0] =  median(as.numeric(as.matrix(df['Age'])))  #所有缺失值换成38
VehiclePrice[VehiclePrice == 0] =0.5
df = data.frame(df,Age,VehiclePrice)colnames(df) #所有列明
df=na.omit(df) #删除其他缺失值
sum(is.na(df)) #查看缺失值table(df$FraudFound)df<-df[,c(-8,-10,-14)]# 删掉这几列set.seed(100) # for reproducing results
rowIndices <- 1 : nrow(df) # prepare row indices
sampleSize <- 0.8 * length(rowIndices) # training sample size
trainingRows <- sample (rowIndices, sampleSize) # random sampling
trainingData <- df[trainingRows, ] # training data
testData <- df[-trainingRows, ] # test dataprop.table(table(trainingData$FraudFound))
prop.table(table(testData$FraudFound)) trainingData$FraudFound<-as.factor(trainingData$FraudFound)
trainingData<-SMOTE(FraudFound~.,trainingData,perc.over=400,perc.under=100)
trainingData$FraudFound<-as.numeric(trainingData$FraudFound)
# 我们再次用prop.table()函数检查结果的平衡性,确定我们已经让阴性、阳性数据达到相同。
prop.table(table(trainingData$FraudFound))
##
##   1   2
## #tuned1 <- tune.svm(FraudFound ~ ., data = trainingData,  type="nu-classification" , gamma = 10^(-1:-4), cost = 10^(1:5)) # tune
#summary (tuned1) # to select best gamma and cost
svmfit <- svm (FraudFound ~ ., data = trainingData, type="nu-classification" , kernel = "radial", cost = 1000, gamma=0.0001, scale = FALSE) # radial svm, scaling turned OFF
print(svmfit)#打印svm模型概要
colnames(trainingData) #输出列明compareTable <- cbind(testData[,12]+1, predict(svmfit, testData[,-12]))  # comparison tableView(compareTable)#观察预测结果
jg = as.numeric(predict(svmfit, testData[,-12])) #测试预测结果
testtarget = testData[,12]+1 #目标变量加1,为了和输出更好匹配
jglen =  length(jg)
count = length(which((testtarget==2)))
cheat = sum(abs((jg[1:count ]-testtarget[1:count ])))/as.numeric(length(jg[1:count ]))#欺诈模型错误率
cheataccuracy = 1-cheat# 欺诈模型正确率count1 = length(which((testtarget==1)))#计算原始变量里面1的个数cheatnot = sum(abs(na.omit(jg[count+1:jglen ]-testtarget[count+1:jglen ])))/count1
cheatnotaccuracy  = 1-cheatnot  # 非欺诈正确率zaccuracy= 1- (sum(abs((jg-testtarget)))/as.numeric(length(jg)) ) #总的正确率write.csv(testData ,file="C://Users//yelang//Desktop//matlabyewu//r业务//svm//testdata.csv")#写出数据,测试数据预测结果和测试数据本身目标值一起输出
write.csv(compareTable,file="C://Users//yelang//Desktop//matlabyewu//r业务//svm//jg.csv")#写出数据,测试数据预测结果和测试数据本身目标值一起输出

不平衡数据分类实证-R语言相关推荐

  1. R语言KNN模型数据分类实战

    R语言KNN模型数据分类实战 目录 R语言KNN模型数据分类实战 #KNN基本原理 #案例分析 ​#数据集说明

  2. R语言SVM支持向量机模型数据分类实战:探索性数据分析、模型调优、特征选择、核函数选择

    R语言SVM支持向量机模型数据分类实战:探索性数据分析.模型调优.特征选择.核函数选择 目录 R语言SVM支持向量机模型数据分类实战:探索性数据分析.模型调优.特征选择.核函数选择 ​ #SVM基本原 ...

  3. 实证操作:R语言实现分位数回归的介绍

    "分位数回归是估计一组回归变量X与被解释变量Y的分位数之间线性关系的建模方法.从最小二乘法可以看出,传统回归中最小化残差的平方极易受极端值的影响,而且属于均值回归,这种方法不能得到不同分布下 ...

  4. R语言(六)——横截面数据分类:机器学习(决策树、SVM、KNN、BP)

    数据 胎心宫缩监护(CTG.xls)数据有2129个观测值及23个变量,包含了致命心律的各种度量以及基于监护记录的由专家分类的公所特征.数据可以从http://archive.ics.uci.edu/ ...

  5. r语言 林元震_科学网—ASReml-R之简介 - 林元震的博文

    目前用于遗传分析的主要统计软件有SAS和SPSS等,并已经开发出了包括WOMBAT.MCMCglmm(R语言的程序包)等在内一系列遗传方差组份估计软件.ASReml是一个非常强大的统计软件,由NSW ...

  6. r语言怎么以第二列绘制线图_用卫星图像绘制世界海岸线图-第二部分

    r语言怎么以第二列绘制线图 Part I of this blog series is here. 本博客系列的第一部分 在这里 . At the UKHO we are interested in ...

  7. pvrect r语言 聚类_R语言常用统计方法包+机器学习包(名称、简介)

    上期帮大家盘点了一下R中常用的可视化包,这期将简要盘点一下关于统计分析与机器学习的R包,并通过简要介绍包的特点来帮助读者深入理解可视化包. 本文作者为"食物链顶端"学习群中的小伙伴 ...

  8. 格兰杰因果关系检验r语言_R语言系列第四期:R语言单样本双样本差异性检验

    之前详细介绍了利用R语言进行统计描述,详情点击:R语言系列第三期:①R语言单组汇总及图形展示.R语言系列第三期:②R语言多组汇总及图形展示.R语言系列第三期:③R语言表格及其图形展示 从这个部分我们就 ...

  9. predict函数 R_RROC三剑客(一)使用R语言手撕ROC曲线

    之前因工作需要绘制ROC曲线,所以对该曲线的计算细节进行了一番摸索.刚开始我搜索ROC曲线一般跟机器学习相关联,导致我对它的概念有了曲解,理所当然地以为它只是一个用于机器学习的分类器评估标准,所以在绘 ...

  10. R语言-神经网络包RSNNS

    <!DOCTYPE html> 斯图加特神经网络模拟器(Stuttgart Neural Network Simulator) 人工神经网络(Artificial Neural Netwo ...

最新文章

  1. 如何解决传输模式解决FTP连接问题
  2. Java控制内存的功力
  3. 精通Android开发 1
  4. opencv 模板匹配(cvMatchTemplate)
  5. android adb杀死服务,Android app是如何杀掉的
  6. 人生价值观的培养和建立
  7. java mvc .net mvc_.NET MVC 和 JAVA MVC有什么区别?
  8. 在Eclipse4.2x中安装最新版插件WindowsBuilder
  9. 金蝶K3 Wise—BOM批量多级展开
  10. BRVAH的基本使用
  11. Python实现简易语音转文字功能模块
  12. linux中打开caj文件,Ubuntu20.04使用CAJViewer for Linux(可双击打开.caj文件)
  13. 阿里技术专家:从程序员到技术总监,我的十五年IT路!
  14. node.js实现微信授权登陆
  15. 一些提供代理服务器IP列表的链接
  16. oracle min(date),Oracle / PLSQL MIN函数
  17. VMWare、Ubuntu、ROS安装参考汇总
  18. kettle运行spoon.sh启动图形化界面报错处理
  19. label smooth方法论文调研
  20. wps里面如何使用计算机,wps表格中怎么在多行之间每行插一行?

热门文章

  1. android 重力传感器gsensor,浅谈Android重力感应
  2. 找到一份满意的工作到底要花多少钱?
  3. 三城记:中国创客地图
  4. android蓝牙传输文件到mysql_使用Android将图像发送到MySQL数据库
  5. 人物渲染篇(二) —— 基础卡通渲染 下
  6. 组归一化(Group Normalization)的解释
  7. SAP中的录屏BDC最贱实践
  8. php phalcon 中文手册,基础教程 · Phalcon 3.4中文手册 · 看云
  9. 易捷文件共享web服务器 v3.5,易捷文件共享Web服务器 官方版
  10. 移动硬盘在计算机中不显示数据能恢复,移动硬盘无法访问提示'此卷不包含可识别的文件系统'怎么办?...