完整的R语言预测建模实例-从数据清理到建模预测

本文使用Kaggle上的一个公开数据集,从数据导入,清理整理一直介绍到最后数据多个算法建模,交叉验证以及多个预测模型的比较全过程,注重在实际数据建模过程中的实际问题和挑战,主要包括以下五个方面的挑战:

  1. 缺失值的挑战
  2. 异常值的挑战
  3. 不均衡分布的挑战
  4. (多重)共线性的挑战
  5. 预测因子的量纲差异

以上的几个主要挑战,对于熟悉机器学习的人来说,应该都是比较清楚的,这个案例中会涉及到五个挑战中的缺失值,量纲和共线性问题的挑战。

案例数据说明

本案例中的数据可以在下面的网址中下载: https://www.kaggle.com/primaryobjects/voicegender/downloads/voicegender.zip 下载到本地后解压缩会生成voice.csv文件 下面首先大概了解一下我们要用来建模的数据

数据共包含21个变量,最后一个变量label是需要我们进行预测的变量,即性别是男或者女 前面20个变量都是我们的预测因子,每一个都是用来描述声音的量化属性。 下面我们开始我们的具体过程

步骤1:基本准备工作

步骤1主要包含以下三项工作:

  1. 设定工作目录
  2. 载入需要使用的包
  3. 准备好并行计算

步骤2:数据的导入和理解

数据下载解压缩后就是一份名为‘voice.csv’ 的文件,我们将csv文件存到我们设定的工作目录之中,就可以导入数据了。

### read in original datasetvoice_Original <- read_csv("voice.csv",col_names=TRUE)
describe(voice_Original)

通过这个函数,我们现在可以对数据集中的每一个变量都有一个整体性把握。 我们可以看出我们共有21个变量,共计3168个观测值。

由于本数据集数据完整,没有缺失值,因而我们实际上并没有缺失值的挑战,但是为了跟实际的数据挖掘过程相匹配,我们会人为将一些数据设置为缺失值,并对这些缺失值进行插补,大家也可以实际看一下我们应用的插补法的效果:

可以看出,我们的插补出来的值和原始值之间的差异是比较小的,可以帮助我们进行下一步的建模工作。

另外一点,我们在实际工作中,我们用到的预测因子中,往往包含数值型和类别型的数据,但是我们数据中全部都是数值型的,所以我们要增加难度,将其中的一个因子转换为类别型数据,具体操作如下:

图形结果如下:

但是我们更关注的是,预测因子之间是不是存在高度的相关性,因为预测因子间的香瓜性对于一些模型,是有不利的影响的。 对于研究预测因子间的相关性,corrplot 包中的corrplot函数提供了很直观的图形方法:

###find correlations between factors
factor_Corr <- cor(voice_Original[,-c(9,21)])
corrplot(factor_Corr,method="number")

步骤3:数据分配与建模

在实际建模过程中,我们不会将所有的数据全部用来进行训练模型,因为相比较模型数据集在训练中的表现,我们更关注模型在训练集,也就是我们的模型没有遇到的数据中的预测表现。 因此,我们将我们的数据集的70%的数据用来训练模型,剩余的30%用来检验模型预测的结果。

### separate dataset into training and testing setssample_Index <- createDataPartition(voice_Original$label,p=0.7,list=FALSE)
voice_Train <- voice_Original[sample_Index,]
voice_Test <- voice_Original[-sample_Index,]

但是我们还没有解决之前我们发现的一些问题,数据的量纲实际上是不一样的,另外某些因子间存在高度的相关性,这对我们的建模是不利的,因此我们需要进行一些预处理,我们又需要用到preProcess 函数:

### preprocess factors for further modeling
pp <- preProcess(voice_Train,method=c("scale","center","pca"))voice_Train <- predict(pp,voice_Train)voice_Test <- predict(pp,voice_Test)

我们首先将数值型因子进行了标准化,确保所有的因子在一个量纲上,接着对已经标准化的数据进行主成分分析,消除因子中的高相关性。如果我们看一下我们的现在经过处理的数据,就可以看到:

原来的所有数值型因子已经被PC1-PC10取代了。

现在,我们进行一些通用的设置,为不同的模型进行交叉验证比较做好准备。

可以看到随机森林的结果介于上面两个模型之间。但是模型的结果是存在一定的偶然性的,即因为都使用了交叉验证,每个模型都存在抽样的问题,因此结果之间存在一定的偶然性,所以我们需要对模型进行统计意义上的比较。

但是在此之前,我想提一下并行计算的问题,我们在开始建模之前就使用parallel 和doParallel 两个包设置了并行计算的参数,在modelControl中将allowParallel的值设为了TRUE,就可以帮助我们进行交叉验证时进行并行计算,下面这张图可以帮助我们看到差异:

因为原生的R只支持单进程,通过我们的设置,可以将四个核都使用起来,可以大为减少我们的计算时间。

我们最后的一个步骤就是要将三个模型进行比较,确定我们最优的一个模型:

结果从准确率和Kappa值两个方面对数据进行了比较,可以帮助我们了解模型的实际表现,当然我们也可以通过图形展现预测结果:

根据结果,我们可以看到,其实逻辑回归的结果还是比较好的。 所以我们可以将逻辑回归的结果作为我们最终使用的模型。

本文分享自微信公众号 - 大数据挖掘DT数据分析(datadw)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

用 TensorFlow 让你的机器人唱首原创给你听

Siraj 的视频 源码 今天想来看看 AI 是怎样作曲的。 本文会用 TensorFlow 来写一个音乐生成器。 当你对一个机器人说:我想要一种能够表达出希...

35960
来自专栏人工智能

机器学习教程:最大熵文本分类器

在本教程中,我们将讨论最大熵文本分类器,也称为MaxEnt分类器。最大熵分类器是自然语言处理,语音和信息检索问题中常用的判别分类器。使用像JAVA...

1.1K80
来自专栏算法channel

@all: 新浪 机器学习算法岗 面试实录

二面面试官来了。是个算法大佬。是个专门做算法的。直接手出题,他说时间不多,就让我说思路。

20720
来自专栏机器之心

教程 | 从超参数到架构,一文简述模型优化策略

模型可以在训练过程中通过修正超参数而逐步建立。这在迁移学习中最为常见,在这种环境中,我们试图将现有模型的知识应用到新领域或新任务中。这是持续学习中更常见的问题,...

10930
来自专栏机器之心

业界 | Tensor Core究竟有多快?全面对比英伟达Tesla V100/P100的RNN加速能力

43890
来自专栏专知

【干货】PyTorch实例:用ResNet进行交通标志分类

【导读】本文是机器学习工程师Pavel Surmenok撰写的一篇技术博客,用Pytorch实现ResNet网络,并用德国交通标志识别基准数据集进行实验。文中分...

1.1K80
来自专栏目标检测和深度学习

CVPR2018 | CMU&谷歌Spotlight论文:超越卷积的视觉推理框架

选自arXiv 作者:陈鑫磊等 机器之心编译 参与:张倩、李泽南 人类在看到图像时可以进行合理的推理与预测,而目前的神经网络系统却还难以做到。近日,来自卡耐基梅...

31260
来自专栏IT派

PyTorch实例:用ResNet进行交通标志分类

【导读】本文是机器学习工程师Pavel Surmenok撰写的一篇技术博客,用Pytorch实现ResNet网络,并用德国交通标志识别基准数据集进行实验。文中分...

3K00
来自专栏机器之心

CVPR2018 | CMU&amp;谷歌Spotlight论文:超越卷积的视觉推理框架

选自arXiv 作者:陈鑫磊等 机器之心编译 参与:张倩、李泽南 人类在看到图像时可以进行合理的推理与预测,而目前的神经网络系统却还难以做到。近日,来自卡耐基梅...

38180
来自专栏AI研习社

CNN+TensorFlow 就能教机器人作曲!

今天想来看看 AI 是怎样作曲的。 本文会用 TensorFlow 来写一个音乐生成器。 当你对一个机器人说:我想要一种能够表达出希望和奇迹的歌曲时,发生了什么...

51570

扫码关注云+社区

领取腾讯云代金券