引言算法
R是一种普遍用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来。得益于全世界众多 爱好者的无尽努力,你们继而开发出了一种基于R但优于R基本文本编辑器的R Studio(用户的界面体验更好)。也正是因为全世界愈来愈多的数据科学社区和用户对R包的慷慨贡献,让R语言在全球范围内愈来愈流行。其中一些R包,例如MASS,SparkR, ggplot2,使数据操做,可视化和计算功能愈来愈强大。sql
咱们所说的机器学习和R有什么关系呢?我对R的第一印象是,它只是一个统计计算的一个软件。可是后来我发现R有足够的能力以一个快速和简单的方式来实现机器学习算法。这是用R来学习数据科学和机器学习的完整教程,读完本文,你将有使用机器学习的方法来构建预测模型的基本能力。编程
注:这篇文章对于以前没有不少数据科学知识的同窗们是特别值得一看的,同时掌握必定的代数和统计知识将会更有益于您的学习。微信
目录markdown
1、 初识R语言数据结构
一、 我为何要学R?机器学习
二、 如何安装R/R Studio?编辑器
三、 如何安装R包?svg
四、 R中的一些基本计算函数
2、 编程基础慨念及R包
一、 R中的数据类型和对象
二、 R中的控制语句简介
三、 经常使用的R包
3、 用R进行数据预处理
一、 数据集中基本概念
二、 图形展现
三、 缺失值处理
四、 连续性变量与分类变量的处理
五、 特征变量计算
六、标签编码和独热编码
4、 用机器学习的算法构建预测模型
一、 多元线性回归
二、 决策树
三、随机森林
1、初识R语言
一、为何学R ?
事实上,我没有编程经验,也没有学过计算机。可是我知道若是要学习数据科学,一我的必须学习R或Python做为开始学习的工具。我选择了前者,同时在学习过程当中我发现了一些使用R的好处:
二、如何安装R / Rstudio?
你能够https://www.r-project.org/官网下载并安装R,须要注意的是R的更新速度很快,下载新版本的体验会更好一些。
另外,我建议你从RStudio开始,由于RStudio的界面编程体验更好一些。你能够经过https://www.rstudio.com/products/rstudio/download/ 在“支持的平台上安装”部分中, 根据您的操做系统选择您须要的安装程序。点击桌面图标RStudio,就开始你的编程体验,以下图所示:
让咱们快速的了解:一下R界面
三、如何安装包?
R的计算能力在于它拥有强大的R包。在R中,大多数数据处理任务能够从两方面进行,使用R包和基本功能。在本教程中,咱们将介绍最方便的和强大的R包。特别的,通常不太建议直接在R软件的中直接安装加载包,由于这样可能会影响你的计算速度。咱们建议你直接在R的官网上下载好您所须要的R包,经过本地安装的形式进行安装,以下:
在软件中安装:install.packages(“package name”)
本地安装: install.packages(“E:/r/ggplot2_2.1.0.zip”)
四、用R进行基本的统计计算
让咱们开始熟悉R的编程环境及一些基本的计算,在R编程脚本窗口中输入程序,以下:
相似地,您也能够本身尝试各类组合的计算形式并获得结果。可是,若是你作了太多的计算,这样的编程未免过于麻烦,在这种状况下,建立变量是一个有用的方法。在R中,您能够建立变量的形式来简化。建立变量时使用< -或=符号,例如我想建立一个变量x计算7和8的总和,以下:
特别的,一旦咱们建立一个变量,你再也不直接获得的输出,此时咱们须要输入对应的变量而后再运行结果。注意,变量能够是字母,字母数字而不是数字,数字是不能建立数值变量的、
2、编程基础慨念及R包
一、R中的数据类型和对象
R中数据类型包括数值型,字符型,逻辑型,日期型及缺省值,这个数据类型咱们在运用数据的过程当中,你们很容易能够自行了解,在此不作详细解释。
R中的数据对象主要包括向量(数字、整数等)、列表、数据框和矩阵。让具体的进行了解:
1)向量
正如上面提到的,一个向量包含同一个类的对象。可是,你也能够混合不一样的类的对象。当对象的不一样的类混合在一个列表中,这种效应会致使不一样类型的对象转换成一个类。例如:
注:一、检查任何对象的类,使用class()函数的功能。
二、转换一个数据的类,使用as.()函数
相似地,您能够本身尝试改变其余任何的类向量
2)列表
一个列表是一种包含不一样的数据类型的元素特殊类型的向量。例如
能够看出,,列表的输出不一样于一个向量。这是由于不一样类型的全部对象。第一个双括号[1]显示了第一个元素包括的索引内容,依次类推。另外的,您本身还能够尝试:
3)矩阵
当一个向量与行和列即维度属性,它变成了一个矩阵。一个矩阵是由行和列组成的,让咱们试着建立一个3行2列的矩阵:
正如你所看到的,一个矩阵的维度你能够经过dim()或attributes()命令得到,从一个矩阵中提取一个特定元素,只需使用上面矩阵的形式。例如
一样的,,您还能够从个一个向量开始建立所须要的矩阵,咱们,须要作的是利用dim()分配好维度。以下所示:
另外,你也能够加入两个向量使用cbind()和rbind()函数。可是,须要确保两向量相同数量的元素。若是没有的话,它将返回NA值。
4)数据框
这是最经常使用的一种数据类型,它是用来存储列表数据的。它不一样于矩阵,在一个矩阵中,每个元素必须有相同的类。可是,在一个数据框里你能够把向量包含不一样类别的列表。这意味着,每一列的数据就像一个列表,每次你在R中读取数据将被存储在一个数据框中。例如:
让咱们解释一下上面的代码。df是数据框的名字。dim()返回数据框的规格是4行2列,str()返回的是一个数据框的结构,nrow()和ncol()返回是数据框的行数和列数。特别的,咱们须要理解一下R中缺失值的概念,NA表明缺失值,这也是预测建模的关键部分。如今,咱们示例检查是否一个数据集有缺失值。
缺失值的存在严重阻碍了咱们正常计算数据集。例如,由于有两个缺失值,它不能直接作均值得分。例如:
na.rm = TRUE告诉R计算时忽略缺失值,只是计算选定的列中剩余值的均值(得分)。删除在数据中的行和NA,您可使用na.omit
二、R中的控制语句
正如它的名字同样,这样的语句在编码中起控制函数的做用,写一个函数也是一组多个命令自动重复编码的过程。例如:你有10个数据集,你想找到存在于每个数据集中的“年龄”列。这能够经过两种方法,一种须要咱们运行一个特定的程序运行10次,另一种就须要经过编写一个控制语句来完成。咱们先了解下R中的控制结构简单的例子:
例子:
它首先测试条件,并只有在条件是正确的时才执行,一旦执行循环,条件是再次测试,直到知足指定的条件而后输出。下面是语法
固然,还有其余的控制结构,但不太经常使用的比上面的解释。例如:
Repeat 它执行一个无限循环
break——它打破循环的执行
next——它容许跳过一个迭代循环
return——它帮助退出函数
注意:若是你发现这部分的控制结构难以理解,不用担忧。R语言中来自于众多人贡献的包,会帮助你不少。
三、经常使用的R包
在R的镜像(CRAN)中,有超过7800个包可供你们调用,其中不少包能够用来预测建模在本文中,咱们在下面会简单的介绍其中几个。以前,咱们已经解释了安装包的方法,你们能够根据本身的须要去下载安装。
:R为数据的导入进口提供了普遍的包,而且能够接入任何格式的数据。如txt,,csv,,sql等都可快速导入大文件的数据,。
R一样能够用来构建绘图命令而且是建立简单的图表很是好用。可是,当建立的图形变得较为复杂时,你应该安装ggplot2。
R中有不少关于数据操做集合的包,他们能够作基本的和先进的快速计算、例如dplyr,plyr ,tidyr,lubricate,stringr等。
对于模型学习,caret包是强大到足以知足大多建立机器学习模型的必要。固然,您也能够安装算法包,例如对于随机森林,决策树等等。
到这里为止,你会以为对于R的相关组件都相对熟悉啦,从如今开始咱们开始介绍一些关于模型预测的知识。
3、用R进行数据预处理
从这一节开始,咱们将深刻阅读预测建模的不一样阶段。对于数据的预处理是很是重要的,这一阶段学习将强化咱们的对数据操做的应用,让咱们在接下来的R中去学习和应用一下。在本教程中,咱们以这个大市场销售预测数据集为例。首先,咱们先理解一下数据结构,以下图:
一、数据集中基础概念
1最后一列ItemOutlet_Sales为响应变量(因变量y),是咱们须要作出预测的。前面的变量是自变量xi,是用来预测因变量的。
○2数据集
预测模型通常是经过训练数据集创建,训练数据老是包括反变量;测试数据:一旦模型构建,它在测试数据集中的测试是较为准确的,这个数据老是比训练数据集包含更少数量的观察值,并且是它不包括反应变量的。
1)在使用R语言时一个重要设置是定义工做目录,即设置当前运行路径(这样你的所有数据和程序都将保存在该目录下)
一旦设置了目录,咱们能够很容易地导入数据,使用下面的命令导入csv文件:
经过R环境检查数据是否已成功加载,而后让咱们来探讨数据
从结果咱们能够看到训练集有8523行12列数据,测试集有5681行和11列训练数据,而且这也是正确的。测试数据应该老是少一列的。如今让咱们深刻探索训练数据集
二、图形表示
当使用图表来表示时,我想你们会更好的了解这些变量。通常来说,咱们能够从两个方面分析数据:单变量分析和双变量分析。对于单变量分析来说较为简单,在此不作解释。咱们本文以双变量分析为例:
(对于可视化,咱们将使用ggplot2包。这些图能够帮助咱们更好理解变量的分布和频率的数据集)
从图中,咱们能够看到大多数销售已从产品能见度小于0.2。这代表item_visibility < 0.2,则该变量必须是肯定销售的一个重要因素。
在这里,咱们推断多是OUT027的销量影响啦OUT35的销量紧随其后。OUT10和OUT19多是因为最少的客流量,从而致使最少的出口销售。
从这个图表,咱们能够推断出水果和蔬菜最有利于销售零食数量的出口,其次是家用产品。
此次咱们使用箱线图来表示,箱线图的好处在于咱们能够看到相应变量的异常值和平均误差水平。
在图中,,黑色的点就是一个异常值,盒子里黑色的线是每一个项目类型的平均值。
三、缺失值处理
缺失值对于自变量和因变量之间的关系有很大的影响。如今,让咱们理解一下缺失值的处理的知识。让咱们来作一些快速的数据探索,首先,咱们将检查数据是否有缺失值。
咱们能够看出在训练数据集中有1463个缺失值。让咱们检查这些缺失值的变量在哪里,其实不少数据科学家一再建议初学者在在数据探索阶段应密切关注缺失值。
所以,咱们看到列Item_Weight 有1463个缺失的数据。从这个数据咱们还能够获得更多的推论:
从图中,咱们能够看到每列的最小值,最大值,中位数,平均值,缺失值的信息等等。咱们看到变量Item_Weight中有缺失值,并且Item_Weight是一个连续变量。所以,在这种状况下,咱们通常用样本中变量的均值或中位数赋值给缺失值。计算变量item_weight的均值和中位数,这是最经常使用处理缺失值的的方法,其余的方法在此不赘述。
咱们能够先把两个数据集合并,这样就不须要编写独立编码训练和测试数据集,这也会节省咱们的计算时间。可是合并结合两个数据框,咱们必须确保他们相同的列,以下:
咱们知道,测试数据集有个少一列因变量。首先来添加列,咱们能够给这个列赋任何值。一个直观的方法是咱们能够从训练数据集中提取销售的平均值,并使用$Item_Outlet_Sales做为测试变量的销售列。不过,在此,咱们让它简单化给最后一列赋值为1。
接下来咱们先来计算中位数,选用中位数是由于它在离散值中颇有表明性。
四、连续变量和分类变量的处理
在数据处理中,对连续数据集和分类变量的分别处理是很是重要的。在这个数据集,咱们只有3个连续变量,其余的是分类变量。若是你仍然感到困惑,建议你再次使用str()查看数据集。
对于变量Item_Visibility,在上面的图中能够看到该项中有的能见度为零值,这几乎是不可行的。所以,咱们考虑将它当作缺失值,用中位数来处理。
如今让咱们继续处理一下分类变量。在初步的数据探索中,咱们看到有错误的水平变量须要纠正。
使用上面的命令,咱们指定的名称“others”为其余未命名的变量,简要划分了Item_Fat_Content的等级。
五、特征值变量计算
如今咱们已经进入了大数据时代,不少时候须要大量的数据算法计算,可是以前所选出的变量不必定会和模型拟合的效果很好。,因此咱们须要提取新的变量,提供尽量多的“新”的信息来帮助模型作出更准确的预测。以合并后的数据集为例,你以为哪些因素)可能会影响Item_Outlet_Sales?
在源数据中有10个不一样的门店,门店的数目越多,说明某种商品更容易在这个商店中售出。
注:管道函数的思路,将左边的值管道输出为右边调用的函数的第一个参数。
一样的,咱们也能够计算商品种类的信息,这样咱们能够经过结果看到商品在各家商店出现的频率。
咱们假设商店的成立时间越久,该商店的客流量和产品销量越会越多。
以第一个年份为例,这代表机构成立于1999年,已有14年的历史(以2013年为截止年份)。
注:mutate函数,是对已有列进行数据运算并添加为新列。
经过对商品所属类型的计算,咱们能够从其中发现人们的消费趋势。从数据中们能够看出仔细看商品标注DR的,大可能是能够吃的食物。对于FD,大可能是属于饮品类的。一样的咱们注意到到NC类,多是生活用品(非消耗品),可是NC类中的所标注较为复杂。因而,咱们将把这些变量提取出来,并放到一个新变量中。在这里我将使用substr()和gsub()函数来实现提取和重命名变量。
固然,你也能够试着去增长一些新变量帮助构建更好的模型,可是,增长新变量时必须使它与其余的变量之间是不相关的。若是你不肯定与其余变量之间是否存在相关关系,能够经过函数cor()来进行判断。
1)标签编码
这一部分的任务是将字符型的标签进行编码,例如在在咱们的数据集中,变量Item_Fat_Content有2个级别低脂肪和常规,咱们将低脂编码为0和常规型的编码为1 。由于这样可以帮助咱们进行定量的分析。 咱们能够经过ifelse语句来实现。
2)独热编码
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每一个状态都由有独立的寄存器位,而且在任意时候,其中只有一位有效。例如:变量Outlet_ Location_Type。它有三个层次在独热编码中,,将建立三个不一样变量1和0组成。1将表明变量存在,,0表明变量不存在。以下::
这是一个独热编码的示范。但愿你如今已经理解这个概念。如今这们将这种技术也适用于咱们的数据集分类变量中(不含ID变量)。
以上,咱们介绍了两种不一样方法在R中去作独热编码,咱们能够检查一下编码是否已经完成
咱们能够看出独热编码以后,以前的变量是已经自动被移除了数据集。
4、用机器学习方法进行预测建模
在进行构造数据模型前,咱们将删除以前已经被转过的原始变量,能够经过使用dplyr包中的select()实现,以下:
在本节中,我将介绍回归、决策树和随机森林等算法。这些算法的详细解释已经超出了本文的范围,若是你想详细的了解,推荐你们看机器学习的相关书籍。如今咱们要将两个数据集分开,以便咱们来进行预测建模。以下:
一、多元线性回归
使用多元回归建模时,通常用于响应变量(因变量)是连续型和可供预测变量有不少时。若是它因变量被分类,咱们通常会使用逻辑回归。在咱们作回归前,咱们先来了解一些回归的基本假设:
在R中咱们使用lm()函数来作回归,以下:
调整后的R2能够很好的衡量一个回归模型的拟合优度。R2越高说明模型拟合的越好从上图能够看出adjusted R2= 0.2084。这意味着咱们拟合的这个模型很不理想。并且能够p值看出这些新变量例如Item count, Outlet Count 和 Item_Type_New.对于咱们的模型构造而言并无什么帮助,由于它们的sign.远小于0.05的显著性水平。对模型重要的变量是p值小于0.05的变量,也就是上图中后面带有*的变量。另外,咱们知道变量之间存在相关性,会影响模型的准确性,咱们能够利用cor()函数来看一下各变量之间的相关关系。以下:
cor(new_train)
另外,您还可使用corrplot包来作相关系数,以下的程序就帮助咱们找到一个共线性很强的两个变量
能够看出变量Outlet_Count与变量Outlet_Type_Grocery Store成高度负相关关系。另外,咱们经过刚才的分析发现了模型中的一些问题:
接下来,咱们尝试建立不含编码和新变量的较大的回归模型。以下:
上图中能够看到,调整后的R2= 0.5623。这告诉咱们,有时只需你的计算过程简单一些可能会获得更精确的结果。让咱们从一些回归图中去发现一些可以提升模型精度的办法。
从左上的第一个残差拟合图中咱们能够看出实际值与预测值之间残差不是恒定的,这说明该模型中存在着异方差。解决异方差性的一个常见的作法就是对响应变量取对数(减小偏差)。
能够看出调整后的R2= 0.72,说明模型的构建有了显著的改善,咱们能够再作一次拟合回归图
上图中,残差值与拟合值之间已经没有了长期趋势,说明该模型的拟合效果理想。咱们也常常用RMSE来衡量模型的好坏,而且咱们能够经过这个值与其余算法相比较。以下所示
接下来让咱们进行决策树算法来改善咱们的RMSE得分
二、决策树
决策树算法通常优于线性回归模型,咱们简单介绍一下 ,在机器学习中决策树是一个预测模型。他表明的是对象属性与对象值之间的一种映射关系。树中每一个节点表示某个对象,而每一个分叉路径则表明的某个可能的属性值,而每一个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。
在R中,决策树算法的实现可使用rpart包。此外,咱们将使用caret包作交叉验证。经过交叉验证技术来构建较复杂的模型时可使模型不容易出现过分拟合的状况。(关于交叉验证读者可自行查阅)另外,,决策树使用参数CP来衡量训练集的复杂性和准确性。参数较小的CP值可能将致使更大的决策树,这也可能会出现过分拟合的模型。相反,参数大的CP值也致使拟合不充分的模型,也就是咱们不能准确的把握所需变量的信息。如下咱们选用五折交叉验证法来找出具备最优CP的模型。
从上图能够看出,参数cp = 0.01所对应的RMSE最小,在此咱们只提供了部分的数据,你能够在R consle中查询到更多信息。
main_tree <- rpart(Item_Outlet_Sales ~ ., data = new_train, control = rpart.control(cp=0.01)) #在cp=0.01下构造决策树 prp(main_tree) #输出决策树
以上就是咱们决策树模型的结构,并且咱们能够明显看出变量Item_MRP是最重要的根节点,做为最重要的变量也就是根节点,来划分预测将来的销售量。此外让咱们检查一下这个模型的RMSE是否有所改善。
能够看出,经过决策树作出的偏差为1102.774,比线性回归得出的偏差小。说明这种方法更优一些。固然你也能够经过调参数来进一步优化下降这个偏差(如使用十折交叉验证的方法)
三、随机森林
随机森林顾名思义,是用随机的方式创建一个森林,森林里面有不少的决策树组成,随机森林的每一棵决策树之间是没有关联的。在获得森林以后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),而后看看哪一类被选择最多,就预测这个样本为那一类。随机森林算法能够很好的处理缺失值,异常值和其余非线性的数据,其余相关知识读者能够自行查阅。
在以上的语句中,能够看到=“parRF”,这是随机森林的并行实现。这个包让你在计算随机森林时花费较短的时间。或者,你也能够尝试使用rf方法做为标准随机森林的功能。从以上结果中咱们选择RMSE最小的即选择mtry = 15,咱们尝试用1000棵树作计算,以下:
这个模型中可得出RMSE = 1132.04,并无改进决策树模型。另外,随机森林的一个功能是能够展现重要变量。咱们经过下图能够看到最重要的变量是Item_MRP(经过决策树算法也已经表示出来)。
显然,这个模型能够进一步进行尝试调优参数的。同时,让咱们用RMSE最好的决策树来对测试集作拟合。以下所示:
当预测其余样本外数据,咱们能够得出RMSE是1174.33,这个模型是也能够经过调参数达到更优的,如下列出几种方法:
你们有什么新的能使模型预测更优的方法均可以一块儿来讨论,期待与你们的思惟的碰撞。