R语言做数据挖掘教程
当前位置:以往代写 > 其他教程 >R语言做数据挖掘教程
2019-06-14

R语言做数据挖掘教程

R语言做数据挖掘教程

我们所说的呆板进修和R有什么干系呢?我对R的第一印象是,它只是一个统计计较的一个软件。可是厥后我发明R有足够的本领以一个快速和简朴的方法来实现呆板进修算法。这是用R来进修数据科学和呆板进修的完整教程,读完本文,你将有利用呆板进修的要领来构建预测模子的根基本领。

注:这篇文章对付之前没有很大都据科学常识的同学们是出格值得一看的,同时把握必然的代数和统计常识将会更有益于您的进修。

### 目次
#### 一、 初识R语言
1、 我为什么要学R?
2、 如何安装R/R Studio?
3、 如何安装R包?
4、 R中的一些根基计较

#### 二、 编程基本慨念及R包
1、 R中的数据范例和工具
2、 R中的节制语句简介
3、 常用的R包

#### 三、 用R举办数据预处理惩罚
1、 数据会合根基观念
2、 图形展示
3、 缺失值处理惩罚
4、 持续性变量与分类变量的处理惩罚
5、 特征变量计较
6、标签编码和独热编码

#### 四、 用呆板进修的算法构建预测模子
1、 多元线性回归
2、 决定树
3、随机丛林

### 一、初识R语言  
1、为什么学R ?  
 事实上,我没有编程履历,也没有学过计较机。可是我知道假如要进修数据科学,一小我私家必需进修R或Python作为开始进修的东西。我选择了前者,同时在进修进程中我发明白一些利用R的长处:
 用R语言编码很是的简朴;  
 R是一个免费的开源软件,同时它可以直接在官网上下载;  
 R语言中有来自于全世界喜好者孝敬的即时会见高出7800个用于差异计较的R包。  
 R语言尚有遍布全世界的进修社区及论坛,你能很轻松的获取辅佐;  
 我们凭借R包可以或许得到高机能的计较体验;   
 它是,数据阐明公司高度寻求技术之一。
2、如何安装R / Rstudio?
你可以https://www.r-project.org/官网下载并安装R,需要留意的是R的更新速度很快,下载新版本的体验会更好一些。
别的,我发起你从RStudio开始,因为RStudio的界面编程体验更好一些。你可以通过https://www.rstudio.com/products/rstudio/download/ 在“支持的平台上安装”部门中, 按照您的操纵系统选择您需要的安装措施。点击桌面图标RStudio,就开始你的编程体验,如下图所示:
![](http://img.shujuren.org/pictures/XB/571f2fe411b55.png)

让我们快速的相识:一下R界面
 R script::在这个空间里可以写代码,要运行这些代码,只需选择的代码行和按下Ctrl + R即可可能,你可以点击“运行”按钮位置在右上角R的剧本。
 R console:这个区域显示的输出代码运行:,同时你可以在节制台直接写代码。可是代码直接进入R节制台无法追踪。
 R情况:这个空间是显示配置的外部元素增补道。这内里包罗数据集、变量向量,还可以查抄R数据是否被正确加载。
 图形输出窗口:这个空间显示图表中建设的摸索性数据阐明。不只仅输出图形,您可以选择包,寻求辅佐和嵌入式R的官方文档。
3、如何安装包?
R的计较本领在于它拥有强大的R包。在R中,大大都数据处理惩罚任务可以从两方面举办,利用R包和根基成果。在本教程中,我们将先容最利便的和强大的R包。出格的,一般不太发起直接在R软件的中直接安装加载包,因为这样大概会影响你的计较速度。我们发起你直接在R的官网上下载好您所需要的R包,通过当地安装的形式举办安装,如下:
在软件中安装:install.packages("package name")
当地安装: install.packages("E:/r/ggplot2_2.1.0.zip")
4、用R举办根基的统计计较
让我们开始熟悉R的编程情况及一些根基的计较,在R编程剧本窗口中输入措施,如下:
“`
> 2 + 3
> 5
> 6 / 3
> 2
> (3*8)/(2*3)
> 4
> log(12)
> 1.07
> sqrt (121)
> 11
“`
雷同地,您也可以本身实验各类组合的计较形式并获得功效。可是,假如你做了太多的计较,这样的编程未免过于贫苦,在这种环境下,建设变量是一个有用的要领。在R中,您可以建设变量的形式来简化。建设变量时利用< -或=标记,譬喻我想建设一个变量x计较7和8的总和,如下:
“`
> x <- 8 + 7
> x
> 15
“`

出格的,一旦我们建设一个变量,你不再直接获得的输出,此时我们需要输入对应的变量然后再运行功效。留意,变量可以是字母,字母数字而不是数字,数字是不能建设数值变量的、

### 二、编程基本慨念及R包
1、R中的数据范例和工具
 数据范例
R中数据范例包罗数值型,字符型,逻辑型,日期型及缺省值,这个数据范例我们在运用数据的进程中,各人很容易可以自行相识,在此不做具体表明。
“`
> a <- c(1.8, 4.5) #数值型
> b <- c(1 + 2i, 3 – 6i) #殽杂型
> c <- c("zhangsan",”lisi” ) #字符型
“`
 数据工具
R中的数据工具主要包罗向量(数字、整数等)、列表、数据框和矩阵。让详细的举办相识:
○1向量
正如上面提到的,一个向量包括同一个类的工具。可是,你也可以殽杂差异的类的工具。当工具的差异的类殽杂在一个列表中,这种效应会导致差异范例的工具转换成一个类。譬喻:
“`
> qt <- c("Time", 24, "October", TRUE, 3.33) #字符型
> ab <- c(TRUE, 24) #数值型
> cd <- c(2.5, "May") #字符型
> qt
[1] "Time" "24" "October" "TRUE" "3.33"
> ab
[1] 1 24
> cd
[1] "2.5" "May
“`
注:1、查抄任何工具的类,利用class()函数的成果。
2、转换一个数据的类,利用as.()函数
“`
> class(qt)
>"character"
> bar <- 0:5
> class(bar)
> "integer"
> as.numeric(bar)
> class(bar)
> "numeric"
> as.character(bar)
> class(bar)
> "character"
“`
雷同地,您可以本身实验改变其他任何的类向量
○2列表
一个列表是一种包括差异的数据范例的元素非凡范例的向量。譬喻
“`
> my_list <- list(22, "ab", TRUE, 1 + 2i)
> my_list
[[1]]
[1] 22
[[2]]
[1] "ab"
[[3]]
[1] TRUE
[[4]]
[1] 1+2i
“`
可以看出,,列表的输出差异于一个向量。这是因为差异范例的所有工具。第一个双括号[1]显示了第一个元素包罗的索引内容,依次类推。别的的,您本身还可以实验:
“`
> my_list[[3]]
> [1] TRUE
> my_list[3]
> [[1]]
[1] TRUE
“`
○3矩阵
当一个向量与行和列即维度属性,它酿成了一个矩阵。一个矩阵是由行和列构成的,让我们试着建设一个3行2列的矩阵:
“`
> my_matrix <- matrix(1:6, nrow=3, ncol=2)
> my_matrix
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> dim(my_matrix)
[1] 3 2
> attributes(my_matrix)
$dim
[1] 3 2
“`
正如你所看到的,一个矩阵的维度你可以通过dim()或attributes()呼吁得到,从一个矩阵中提取一个特定元素,只需利用上面矩阵的形式。譬喻
“`
> my_matrix[,2] #提取出第二列
> my_matrix[,1] #提取出第二列
> my_matrix[2,] #提取出第二行
> my_matrix[1,] #提取出第二行
“`
同样的,,您还可以从个一个向量开始建设所需要的矩阵,我们,需要做的是操作dim()分派好维度。如下所示:
“`
> age <- c(23, 44, 15, 12, 31, 16)
> age
[1] 23 44 15 12 31 16
> dim(age) <- c(2,3)
> age
[,1] [,2] [,3]
[1,] 23 15 31
[2,] 44 12 16
> class(age)
[1] "matrix"
“`
别的,你也可以插手两个向量利用cbind()和rbind()函数。可是,需要确保两向量沟通数量的元素。假如没有的话,它将返回NA值。
“`
> x <- c(1, 2, 3, 4, 5, 6)
> y <- c(20, 30, 40, 50, 60)
> cbind(x, y)
> cbind(x, y)
x y
[1,] 1 20
[2,] 2 30
[3,] 3 40
[4,] 4 50
[5,] 5 60
[6,] 6 70
> class(cbind(x, y))
[1] “matrix
“`
○4数据框
这是最常用的一种数据范例,它是用来存储列表数据的。它差异于矩阵,在一个矩阵中,每一个元素必需有沟通的类。可是,在一个数据框里你可以把向量包括差异类此外列表。这意味着,每一列的数据就像一个列表,每次你在R中读取数据将被存储在一个数据框中。譬喻:
“`
> df <- data.frame(name = c("ash","jane","paul","mark"), score = c(67,56,87,91))
> df
name score
1 ash 67
2 jane 56
3 paul 87
4 mark 91

> dim(df)
[1] 4 2

> str(df)
‘data.frame’: 4 obs. of 2 variables:
$ name : Factor w/ 4 levels "ash","jane","mark",..: 1 2 4 3
$ score: num 67 56 87 91

> nrow(df)
[1] 4

> ncol(df)
[1] 2
“`
让我们表明一下上面的代码。df是数据框的名字。dim()返回数据框的规格是4行2列,str()返回的是一个数据框的布局,nrow()和ncol()返回是数据框的行数和列数。出格的,我们需要领略一下R中缺失值的观念,NA代表缺失值,这也是预测建模的要害部门。此刻,我们示例查抄是否一个数据集有缺失值。
“`
> df[1:2,2] <- NA #令前两行第二列的数值为NA
> df
name score
1 ash NA
2 jane NA
3 paul 87
4 mark 91
> is.na(df) #查抄整个数据集缺失值和返回逻辑输出值
name score
[1,] FALSE TRUE
[2,] FALSE TRUE
[3,] FALSE FALSE
[4,] FALSE FALSE
> table(is.na(df)) #返回逻辑值种种的数量
FALSE TRUE
6 2
> df[!complete.cases(df),] #返回缺失值地址的行值
name score
1 ash NA
2 jane NA
“`
缺失值的存在严重阻碍了我们正常计较数据集。譬喻,因为有两个缺失值,它不能直接做均值得分。譬喻:
“`
mean(df$score)
[1] NA
> mean(df$score, na.rm = TRUE)
[1] 89
“`
na.rm = TRUE汇报R计较时忽略缺失值,只是计较选定的列中剩余值的均值(得分)。删除在数据中的行和NA,您可以利用na.omit
“`
> new_df <- na.omit(df)
> new_df
name score
3 paul 87
4 mark 91
“`
2、R中的节制语句
正如它的名字一样,这样的语句在编码中起节制函数的浸染,写一个函数也是一组多个呼吁自动反复编码的进程。譬喻:你有10个数据集,你想找到存在于每一个数据会合的“年数”列。这可以通过两种要领,一种需要我们运行一个特定的措施运行10次,别的一种就需要通过编写一个节制语句来完成。我们先相识下R中的节制布局简朴的例子:
 If.else,这个布局是用来测试一个条件的,下面是语法:
“`
if (<condition>){
##do something
} else {
##do something
}
“`
例子:
“`
#initialize a variable
N <- 10
#check if this variable * 5 is > 40
if (N * 5 > 40){
print("This is easy!")
} else {
print ("It’s not easy!")
}
[1] "This is easy!"
“`
 For语句,这个布局是当一个轮回执行牢靠的次数时利用。下面是语法:
“`
for (<search condition>){
#do something
}
Example
#initialize a vector
y <- c(99,45,34,65,76,23)
#print the first 4 numbers of this vector
for(i in 1:4){
print (y[i])
}
[1] 99
[1] 45
[1] 34
[1] 65
“`
 while,语句
它首先测试条件,并只有在条件是正确的时才执行,一旦执行轮回,条件是再次测试,直到满意指定的条件然后输出。下面是语法
“`
#初始化条件
Age <- 12
#检讨年数是否小于17
while(Age < 17){
print(Age)
Age <- Age + 1 }
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
“`
虽然,尚有其他的节制布局,但不太常用的比上面的表明。譬喻:
Repeat 它执行一个无限轮回  
break——它冲破轮回的执行  
next——它答允跳过一个迭代轮回 
return——它辅佐退出函数
留意:假如你发明这部门的节制布局难以领略,不消担忧。R语言中来自于浩瀚人孝敬的包,会辅佐你许多。
3、常用的R包
在R的镜像(CRAN)中,有高出7800个包可供各人挪用,个中许多包可以用来预测建模在本文中,我们在下面会简朴的先容个中几个。之前,我们已经表明白安装包的要领,各人可以按照本身的需要去下载安装。

 导入数据
:R为数据的导入入口提供了遍及的包,而且可以接入任何名目标数据。如txt,,csv,,sql等均可快速导入大文件的数据,。
 数据可视化
R同样可以用来构建画图呼吁而且是建设简朴的图表很是好用。可是,当建设的图形变得较为巨大时,你应该安装ggplot2。
 数据操纵
R中有许多关于数据操纵荟萃的包,他们可以做根基的和先进的快速计较、譬喻dplyr,plyr ,tidyr,lubricate,stringr等。
 建模进修/呆板进修
对付模子进修,caret包是强大到足以满意大多建设呆板进修模子的须要。虽然,您也可以安装算法包,譬喻对付随机丛林,决定树等等。
到这里为止,你会以为对付R的相关组件都相对熟悉啦,以后刻开始我们开始先容一些关于模子预测的常识。

### 三、用R举办数据预处理惩罚
从这一节开始,我们将深入阅读预测建模的差异阶段。对付数据的预处理惩罚长短常重要的,这一阶段进修将强化我们的对数据操纵的应用,让我们在接下来的R中去进修和应用一下。在本教程中,我们以这个大市场销售预测数据集为例。首先,我们先领略一下数据布局,如下图:
![](http://img.shujuren.org/pictures/3I/571f2fff08893.png)

1、数据会合基本观念
○1最后一列ItemOutlet_Sales为响应变量(因变量y),是我们需要做出预测的。前面的变量是自变量xi,是用来预测因变量的。
○2数据集
预测模子一般是通过练习数据集成立,练习数据老是包罗反变量;测试数据:一旦模子构建,它在测试数据会合的测试是较为精确的,这个数据老是比练习数据集包括更少数量的调查值,并且是它不包罗回响变量的。
 数据的导入和根基摸索
○1在利用R语言时一个重要配置是界说事情目次,即配置当前运行路径(这样你的全部数据和措施都将生存在该目次下)
“`
#设定当前事情目次
setwd(“E:/r”)
“`
一旦配置了目次,我们可以很容易地导入数据,利用下面的呼吁导入csv文件:
“`
#载入数据集
train <- read.csv("E:/r/Train_UWu5bXk.csv")
test <- read.csv("E:/r/Test_u94Q5KV.csv")
“`
通过R情况查抄数据是否已乐成加载,然后让我们来探讨数据
“`
#查察数据的维度
> dim(train)
[1] 8523 12
> dim(test)
[1] 5681 11
“`
从功效我们可以看到练习集有8523行12列数据,测试集有5681行和11列练习数据,而且这也是正确的。测试数据应该老是少一列的。此刻让我们深入摸索练习数据集
“`
#查抄练习会合的变量和范例
> str(train)
‘data.frame’: 8523 obs. of 12 variables:
$ Item_Identifier : Factor w/ 1559 levels "DRA12","DRA24",..: 157 9 663 1122 1298 759 697 739 441 991 …
$ Item_Weight : num 9.3 5.92 17.5 19.2 8.93 …
$ Item_Fat_Content : Factor w/ 5 levels "LF","low fat",..: 3 5 3 5 3 5 5 3 5 5 …
$ Item_Visibility : num 0.016 0.0193 0.0168 0 0 …
$ Item_Type : Factor w/ 16 levels "Baking Goods",..: 5 15 11 7 10 1 14 14 6 6 …
$ Item_MRP : num 249.8 48.3 141.6 182.1 53.9 …
$ Outlet_Identifier : Factor w/ 10 levels "OUT010","OUT013",..: 10 4 10 1 2 4 2 6 8 3 …
$ Outlet_Establishment_Year: int 1999 2009 1999 1998 1987 2009 1987 1985 2002 2007 …
$ Outlet_Size : Factor w/ 4 levels "","High","Medium",..: 3 3 3 1 2 3 2 3 1 1 …
$ Outlet_Location_Type : Factor w/ 3 levels "Tier 1","Tier 2",..: 1 3 1 3 3 3 3 3 2 2 …
$ Outlet_Type : Factor w/ 4 levels "Grocery Store",..: 2 3 2 1 2 3 2 4 2 2 …
$ Item_Outlet_Sales : num 3735 443 2097 732 995 …
“`
2、图形暗示
当利用图表来暗示时,我想各人会更好的相识这些变量。一般来讲,我们可以从两个方面阐明数据:单变量阐明和双变量阐明。对付单变量阐明来讲较为简朴,在此不做表明。我们本文以双变量阐明为例:
(对付可视化,我们将利用ggplot2包。这些图可以辅佐我们更好领略变量的漫衍和频率的数据集)
 首先做出Item_Visibility和Item_Outlet_Sales两个变量的散点图
“`
ggplot(train, aes(x= Item_Visibility, y = Item_Outlet_Sales)) + geom_point(size = 2.5, color="navy") + xlab("Item Visibility") + ylab("Item Outlet Sales") + ggtitle("Item Visibility vs Item Outlet Sales")
“`
![](http://img.shujuren.org/pictures/BK/571f3020b43d7.png)

从图中,我们可以看到大大都销售已从产物能见度小于0.2。这表白item_visibility < 0.2,则该变量必需是确定销售的一个重要因素。
 做出Outlet_Identifier和Item_Outlet_Sales两个变量的柱状干系图
“`
ggplot(train, aes(Outlet_Identifier, Item_Outlet_Sales)) + geom_bar(stat = "identity", color = "purple") +theme(axis.text.x = element_text(angle = 70, vjust = 0.5, color = "black")) + ggtitle("Outlets vs Total Sales") + theme_bw()
“`
![](http://img.shujuren.org/pictures/J4/571f3040aa815.png)

在这里,我们揣度大概是OUT027的销量影响啦OUT35的销量紧随其后。OUT10和OUT19大概是由于最少的客流量,从而导致最少的出口销售。
 做出Outlet_type和Item_Outlet_Sales两个变量的箱体图
“`

ggplot(train, aes(Item_Type, Item_Outlet_Sales)) + geom_bar( stat = "identity") +theme(axis.text.x = element_text(angle = 70, vjust = 0.5, color = "navy"))
“`
![](http://img.shujuren.org/pictures/L0/571f30787231e.png)

从这个图表,我们可以揣度出水果和蔬菜最有利于销售零食数量的出口,其次是家用产物。
 做出Item_Type和Item_MRP两个变量的箱线图
这次我们利用箱线图来暗示,箱线图的长处在于我们可以看到相应变量的异常值僻静均毛病程度。
“`
ggplot(train, aes(Item_Type, Item_MRP)) +geom_boxplot() +ggtitle("Box Plot") + theme(axis.text.x = element_text(angle = 70, vjust = 0.5, color = "red")) + xlab("Item Type") + ylab("Item MRP") + ggtitle("Item Type vs Item MRP")
“`

在图中,,玄色的点就是一个异常值,盒子里玄色的线是每个项目范例的平均值。
3、缺失值处理惩罚
缺失值对付自变量和因变量之间的干系有很大的影响。此刻,让我们领略一下缺失值的处理惩罚的常识。让我们来做一些快速的数据摸索,首先,我们将查抄数据是否有缺失值。
“`
> table(is.na(train))
FALSE TRUE
100813 1463
“`
我们可以看出在练习数据会合有1463个缺失值。让我们查抄这些缺失值的变量在那边,其实很大都据科学家一再发起初学者在在数据摸索阶段应密切存眷缺失值。
“`
> colsums(is.na(train))
Item_Identifier Item_Weight
0 1463
Item_Fat_Content Item_Visibility
0 0
Item_Type Item_MRP
0 0
Outlet_Identifier Outlet_Establishment_Year
0 0
Outlet_Size Outlet_Location_Type
0 0
Outlet_Type Item_Outlet_Sales
0 0
“`
因此,我们看到列Item_Weight 有1463个缺失的数据。从这个数据我们还可以获得更多的推论:
“`
> summary(train)
“`
![](http://img.shujuren.org/pictures/4W/571f31a473721.png)
从图中,我们可以看到每列的最小值,最大值,中位数,平均值,缺失值的信息等等。我们看到变量Item_Weight中有缺失值,并且Item_Weight是一个持续变量。因此,在这种环境下,我们一般用样本中变量的均值或中位数赋值给缺失值。计较变量item_weight的均值和中位数,这是最常用处理惩罚缺失值的的要领,其他的要领在此不赘述。  
我们可以先把两个数据集归并,这样就不需要编写独立编码练习和测试数据集,这也会节减我们的计较时间。可是归并团结两个数据框,我们必需确保他们沟通的列,如下:
“`
> dim(train)
[1] 8523 12

> dim(test)
[1] 5681 11
“`
我们知道,测试数据集有个少一列因变量。首先来添加列,我们可以给这个列赋任何值。一个直观的要领是我们可以从练习数据会合提取销售的平均值,并利用$Item_Outlet_Sales作为测试变量的销售列。不外,在此,我们让它简朴化给最后一列赋值为1。
“`
test$Item_Outlet_Sales <- 1
> combi <- rbind(train, test)
“`
接下来我们先来计较中位数,选用中位数是因为它在离散值中很有代表性。
“`
combi$Item_Weight[is.na(combi$Item_Weight)] <- median(combi$Item_Weight, na.rm = TRUE)
> table(is.na(combi$Item_Weight))
FALSE
14204
“`
4、持续变量和分类变量的处理惩罚
在数据处理惩罚中,对持续数据集和分类变量的非别处理惩罚长短常重要的。在这个数据集,我们只有3个持续变量,其他的是分类变量。假如你仍然感想狐疑,发起你再次利用str()查察数据集。
对付变量Item_Visibility,在上面的图中可以看到该项中有的能见度为零值,这险些是不行行的。因此,我们思量将它当作缺失值,用中位数来处理惩罚。
“`
> combi$Item_Visibility <- ifelse(combi$Item_Visibility == 0,
median(combi$Item_Visibility)
“`
此刻让我们继承处理惩罚一下分类变量。在劈头的数据摸索中,我们看到有错误的程度变量需要更正。
“`
levels(combi$Outlet_Size)[1] <- "Other"
> library(plyr)
> combi$Item_Fat_Content <- revalue(Combi$Item_Fat_Content,c("LF" = "Low Fat", "reg" = "Regular")) #将源数据中“LF”重定名为“Low Fat”
>combi$Item_Fat_Content <- revalue(Combi$Item_Fat_Content, c("low fat" = "Low Fat")) #将源数据中“low fat”重定名为“Low Fat”
> table(combi$Item_Fat_Content) #计较各程度下的频数
Low Fat Regular
9185 5019
“`
利用上面的呼吁,我们指定的名称“others”为其他未定名的变量,扼要分别了Item_Fat_Content的品级。
5、特征值变量计较
此刻我们已经进入了大数据时代,许多时候需要大量的数据算法计较,可是之前所选出的变量不必然会和模子拟合的结果很好。,所以我们需要提取新的变量,提供尽大概多的“新”的信息来辅佐模子做出更精确的预测。以归并后的数据集为例,你以为哪些因素)大概会影响Item_Outlet_Sales?

 关于商店种类变量计较
在源数据中有10个差异的门店,门店的数目越多,说明某种商品更容易在这个商店中售出。
“`
> library(dplyr)
> a <- combi%>%
group_by(Outlet_Identifier)%>%
tally() #用管道函数对门店按编码分类计数
> head(a)
Source: local data frame [6 x 2] Outlet_Identifier n
(fctr) (int)
1 OUT010 925
2 OUT013 1553
3 OUT017 1543
4 OUT018 1546
5 OUT019 880
6 OUT027 1559
> names(a)[2] <- "Outlet_Count"
> combi <- full_join(a, combi, by = "Outlet_Identifier")
“`
注:管道函数的思路,将左边的值管道输出为右边挪用的函数的第一个参数。

 商品种类计较
同样的,我们也可以计较商品种类的信息,这样我们可以通过功效看到商品在各家商店呈现的频率。
“`
> b <- combi%>%。
group_by(Item_Identifier)%>%
tally()
> names(b)[2] <- "Item_Count"
> b
Item_Identifier Item_Count #数量较多纷歧一罗列
Source: local data frame [1,559 x 2]

Item_Identifier Item_Count
(fctr) (int)
1 DRA12 9
2 DRA24 10
3 DRA59 10
4 DRB01 8
5 DRB13 9
6 DRB24 8
7 DRB25 10
8 DRB48 9
9 DRC01 9
10 DRC12 8
.. … …
> combi <- merge(b, combi, by = “Item_Identifier”)
“`
 商店的创立时间的变量摸索
我们假设商店的创立时间越久,该商店的客流量和产物销量越会越多。
“`
> c <- combi%>%
select(Outlet_Establishment_Year)%>%
mutate(Outlet_Year = 2013 – combi$Outlet_Establishment_Year)
> head(c)
Outlet_Establishment_Year Outlet_Year
1 1999 14
2 2009 4
3 1999 14
4 1998 15
5 1987 26
6 2009 4
> combi <- full_join(c, combi)
“`
以第一个年份为例,这表白机构创立于1999年,已有14年的汗青(以2013年为截至年份)。
注:mutate函数,是对已有罗列办数据运算并添加为新列。

 商品所属范例的相关计较
  通过对商品所属范例的计较,我们可以从个中发明人们的消费趋势。从数据中们可以看出仔细看商品标注DR的,大多是可以吃的食物。对付FD,大多是属于饮品类的。同样的我们留意到到NC类,大概是糊口用品(非耗损品),可是NC类中的所标注较为巨大。于是,我们将把这些变量提取出来,并放到一个新变量中。在这里我将利用substr()和gsub()函数来实现提取和重定名变量。
“`
> q <- substr(combi$Item_Identifier,1,2) #字符中的特征值识别为FD和DR
> q <- gsub("FD","Food",q) #将数据中FD标志为Food
> q <- gsub("DR","Drinks",q) #将数据中DR标志为Drinks
> q <- gsub("NC","Non-Consumable",q) #将数据中NC标Non-Consumable

> table(q)
Drinks Food Non-Consumable
1317 10201 2686
> combi$Item_Type_New <- q #将处理惩罚过的变量范例定名为Item_Type_New
“`
虽然,你也可以试着去增加一些新变量辅佐构建更好的模子,可是,增加新变量时必需使它与其他的变量之间是不相关的。假如你不确定与其他变量之间是否存在相关干系,可以通过函数cor()来举办判定。

 对字符变量举办编码
○1标签编码
这一部门的任务是将字符型的标签举办编码,譬喻在在我们的数据会合,变量Item_Fat_Content有2个级别低脂肪和通例,我们将低脂编码为0和通例型的编码为1 。因为这样可以或许辅佐我们举办定量的阐明。 我们可以通过ifelse语句来实现。
“`
> combi$Item_Fat_Content <- ifelse(combi$Item_Fat_Content == "Regular",1,0) # 将低脂编码为0和通例型的编码为1
“`
○2独热编码
独热编码即 One-Hot 编码,又称一位有效编码,其要领是利用N位状态寄存器来对N个状态举办编码,每个状态都由有独立的寄存器位,而且在任意时候,个中只有一位有效。譬喻:变量Outlet_ Location_Type。它有三个条理在独热编码中,,将建设三个差异变量1和0构成。1将代表变量存在,,0代表变量不存在。如下::
“`
sample <- select(combi, Outlet_Location_Type)
> demo_sample <- data.frame(model.matrix(~.-1,sample))
> head(demo_sample)
Outlet_Location_TypeTier.1 Outlet_Location_TypeTier.2 Outlet_Location_TypeTier.3
1 1 0 0
2 0 0 1
3 1 0 0
4 0 0 1
5 0 0 1
6 0 0 1
“`
这是一个独热编码的示范。但愿你此刻已司领略这个观念。此刻这们将这种技能也合用于我们的数据集分类变量中(不含ID变量)。
“`
>library(dummies)
>combi <- dummy.data.frame(combi, names = c(‘Outlet_Size’,’Outlet_Location_Type’,’Outlet_Type’, ‘Item_Type_New’), sep=’_’)
“`
以上,我们先容了两种差异要领在R中去做独热编码,我们可以查抄一下编码是否已经完成
“`
> str (combi)
$ Outlet_Size_Other : int 0 1 1 0 1 0 0 0 0 0 …
$ Outlet_Size_High : int 0 0 0 1 0 0 0 0 0 0 …
$ Outlet_Size_Medium : int 1 0 0 0 0 0 1 1 0 1 …
$ Outlet_Size_Small : int 0 0 0 0 0 1 0 0 1 0 …
$ Outlet_Location_Type_Tier 1 : int 1 0 0 0 0 0 0 0 1 0 …
$ Outlet_Location_Type_Tier 2 : int 0 1 0 0 1 1 0 0 0 0 …
$ Outlet_Location_Type_Tier 3 : int 0 0 1 1 0 0 1 1 0 1 …
$ Outlet_Type_Grocery Store : int 0 0 1 0 0 0 0 0 0 0 …
$ Outlet_Type_Supermarket Type1: int 1 1 0 1 1 1 0 0 1 0 …
$ Outlet_Type_Supermarket Type2: int 0 0 0 0 0 0 0 1 0 0 …
$ Outlet_Type_Supermarket Type3: int 0 0 0 0 0 0 1 0 0 1 …
$ Item_Outlet_Sales : num 1 3829 284 2553 2553 …
$ Year : num 14 11 15 26 6 9 28 4 16 28 …
$ Item_Type_New_Drinks : int 1 1 1 1 1 1 1 1 1 1 …
$ Item_Type_New_Food : int 0 0 0 0 0 0 0 0 0 0 …
$ Item_Type_New_Non-Consumable : int 0 0 0 0 0 0 0 0 0 0 …
“`
我们可以看出独热编码之后,之前的变量是已经自动被移除了数据集。

### 四、用呆板进修要领举办预测建模
在举办结构数据模子前,我们将删除之前已经被转过的原始变量,可以通过利用dplyr包中的select()实现,如下:
“`
> combi <- select(combi, -c(Item_Identifier, Item_Fat_Content ,Outlet_Identifier,, Outlet_Establishment_Year,Item_Type))
> str(combi)
“`
在本节中,我将先容**回归、决定树和随机丛林等算法**。这些算法的具体表明已经超出了本文的范畴,假如你想具体的相识,推荐各人看呆板进修的相关书籍。此刻我们要将两个数据集分隔,以便我们来举办预测建模。如下:
“`
> new_train <- combi[1:nrow(train),]
> new_test <- combi[-(1:nrow(train)),]
“`
##### 1、多元线性回归
利用多元回归建模时,一般用于响应变量(因变量)是持续型和可供预测变量有许多时。假如它因变量被分类,我们一般会利用逻辑回归。在我们做回归前,我们先来相识一些回归的根基假设:
 在响应变量和自变量之间存在某种线性干系; 
 各个自变量之间是不相关的,假如存在相关干系,我们称这个模子呈现了多重共线性。 
 误差项也是要求不相关的。不然,它将导致模子呈现自相关。 
 误差项必需有恒定方差。不然,它将导致模子呈现异方差性。
在R中我们利用lm()函数来做回归,如下:
“`
linear_model <- lm(Item_Outlet_Sales ~ ., data = new_train) #构建模子
> summary(linear_model)
“`
![](http://img.shujuren.org/pictures/6X/571f31cd8e0e7.png)
调解后的R²可以很好的权衡一个回归模子的拟合优度。R²越高说明模子拟合的越好从上图可以看出adjusted R²= 0.2084。这意味着我们拟合的这个模子很不抱负。并且可以p值看出这些新变量譬喻Item count, Outlet Count 和 Item_Type_New.对付我们的模子结构而言并没有什么辅佐,因为它们的sign.远小于0.05的显著性程度。对模子重要的变量是p值小于0.05的变量,也就是上图中后头带有*的变量。别的,我们知道变量之间存在相关性,会影响模子的精确性,我们可以操作cor()函数来看一下各变量之间的相关干系。如下:
cor(new_train)
别的,您还可以利用corrplot包来做相干系数,如下的措施就辅佐我们找到一个共线性很强的两个变量
“`
cor(new_train$Outlet_Count, new_train$`Outlet_Type_Grocery Store`)
[1] -0.9991203
“`
可以看出变量Outlet_Count与变量Outlet_Type_Grocery Store成高度负相关干系。别的,我们通过适才的阐明发明白模子中的一些问题:
 模子中有相关干系的变量存在;  
 我们做了独热编码编码和标签编码,但从功效来看,通过建设虚拟变量对付这个线性回归模子的建设意义不大。 
 建设的新变量对付回归模子的拟合也没有很大影响。
接下来,我们实验建设不含编码和新变量的较大的回归模子。如下:
“`
#载入数据
train <- read.csv("E:/r/Train_UWu5bXk.csv")
test <- read.csv("E:/r/Test_u94Q5KV.csv")
> test$Item_Outlet_Sales <- 1 #给测试样本中的响应变量赋值
#归并练习集和测试集
> combi <- rbind(train, test)
#impute missing value in Item_Weight
> combi$Item_Weight[is.na(combi$Item_Weight)] <- median(combi$Item_Weight, na.rm = TRUE)
#用中位数处理惩罚缺失值
> combi$Item_Visibility <- ifelse(combi$Item_Visibility == 0, median(combi$Item_Visibility), combi$Item_Visibility)
#给变量 Outlet_Size整理品级程度
> levels(combi$Outlet_Size)[1] <- "Other"
#给变量Item_Fat_Content重定名
> library(plyr)
> combi$Item_Fat_Content <- revalue(combi$Item_Fat_Content,c("LF" = "Low Fat", "reg" ="Regular"))
> combi$Item_Fat_Content <- revalue(combi$Item_Fat_Content, c("low fat" = "Low Fat"))
#建设一个新列
> combi$Year <- 2013 – combi$Outlet_Establishment_Year
#删除模子中不需要的变量
> library(dplyr)
> combi <- select(combi, -c(Item_Identifier, Outlet_Identifier, Outlet_Establishment_Year))
#拆分数据集
> new_train <- combi[1:nrow(train),]
> new_test <- combi[-(1:nrow(train)),]
#线性回归
> linear_model <- lm(Item_Outlet_Sales ~ ., data = new_train)
> summary(linear_model)
“`
![](http://img.shujuren.org/pictures/OD/571f32077799b.png)

上图中可以看到,调解后的R²= 0.5623。这汇报我们,有时只需你的计较进程简朴一些大概会获得更准确的功效。让我们从一些回归图中去发明一些可以或许提高模子精度的步伐。
“`
> par(mfrow=c(2,2))
> plot(linear_model)
“`
![](http://img.shujuren.org/pictures/7M/571f32b2b93bc.png)
 

从左上的第一个残差拟合图中我们可以看出实际值与预测值之间残差不是恒定的,这说明该模子中存在着异方差。办理异方差性的一个常见的做法就是对响应变量取对数(淘汰误差)。
“`
>linear_model <- lm(log(Item_Outlet_Sales) ~ ., data = new_train)
> summary(linear_model)
“`
![](http://img.shujuren.org/pictures/KU/571f32ce9a693.png)

可以看出调解后的R²= 0.72,说明模子的构建有了显著的改进,我们可以再做一次拟合回归图
“`
> par(mfrow=c(2,2))
> plot(linear_model)
“`
![](http://img.shujuren.org/pictures/S1/571f32e94db3c.png)

上图中,残差值与拟合值之间已经没有了恒久趋势,说明该模子的拟合结果抱负。我们也常常用RMSE来权衡模子的优劣,而且我们可以通过这个值与其他算法对较量。如下所示
“`
install.packages("E:/r/ Metrics_0.1.1.zip ")
> library(Metrics)
> rmse(new_train$Item_Outlet_Sales, exp(linear_model$fitted.values))
[1] 1140.004
“`
接下来让我们举办决定树算法来改进我们的RMSE得分

##### 2、决定树
决定树算法一般优于线性回归模子,我们简朴先容一下 ,在呆板进修中决定树是一个预测模子。他代表的是工具属性与工具值之间的一种映射干系。树中每个节点暗示某个工具,而每个分叉路径则代表的某个大概的属性值,而每个叶结点则对应从根节点到该叶节点所经验的路径所暗示的工具的值。
在R中,决定树算法的实现可以利用rpart包。另外,我们将利用caret包做交错验证。通过交错验证技能来构建较巨大的模子时可以使模子不容易呈现太过拟合的环境。(关于交错验证读者可自行查阅)别的,,决定树利用参数CP来权衡练习集的巨大性和精确性。参数较小的CP值大概将导致更大的决定树,这也大概会呈现太过拟合的模子。相反,参数大的CP值也导致拟合不充实的模子,也就是我们不能精确的掌握所需变量的信息。以下我们选用五折交错验证法来找出具有最优CP的模子。
“`
# 加载所需的包
> library(rpart)
> library(e1071)
> library(rpart.plot)
> library(caret)
#配置决定树的节制参数
> fitControl <- trainControl(method = "cv", number = 5) #选用五折交错验证的要领
> cartGrid <- expand.grid(.cp=(1:50)*0.01)
#decision tree
> tree_model <- train(Item_Outlet_Sales ~ ., data = new_train, method = "rpart", trControl = fitControl, tuneGrid = cartGrid)
> print(tree_model)
“`
![](http://img.shujuren.org/pictures/PS/571f331fd8d9a.png)
从上图可以看出,参数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) #输出决定树
![](http://img.shujuren.org/pictures/8B/571f3344e8830.png)

以上就是我们决定树模子的布局,并且我们可以明明看出变量Item_MRP是最重要的根节点,作为最重要的变量也就是根节点,来分别预测将来的销售量。另外让我们查抄一下这个模子的RMSE是否有所改进。
“`
> pre_score <- predict(main_tree, type = "vector")
> rmse(new_train$Item_Outlet_Sales, pre_score) #计较均方根误差
[1] 1102.774
“`
可以看出,通过决定树做出的误差为1102.774,比线性回归得出的误差小。说明这种要领更优一些。虽然你也可以通过调参数来进一步优化低落这个误差(如利用十折交错验证的要领)

##### 3、随机丛林
随机丛林顾名思义,是用随机的方法成立一个丛林,丛林内里有许多的决定树构成,随机丛林的每一棵决定树之间是没有关联的。在获得丛林之后,当有一个新的输入样本进入的时候,就让丛林中的每一棵决定树别离举办一下判定,看看这个样本应该属于哪一类(对付分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。随机丛林算法可以很好的处理惩罚缺失值,异常值和其他非线性的数据,其他相关常识读者可以自行查阅。
“`
#加载随机丛林算法的包
> library(randomForest)
#配置参数
> control <- trainControl(method = "cv", number = 5)
#模子构建
> rf_model <- train(Item_Outlet_Sales ~ ., data = new_train, method = "parRF", trControl = control, prox = TRUE, allowParallel = TRUE)
#通过功效选择参数
> print(rf_model)
“`
![](http://img.shujuren.org/pictures/32/571f336808cf8.png)

在以上的语句中,可以看到=“parRF”,这是随机丛林的并行实现。这个包让你在计较随机丛林时耗费较短的时间。可能,你也可以实验利用rf要领作为尺度随机丛林的成果。从以上功效中我们选择RMSE最小的即选择mtry = 15,我们实验用1000棵树做计较,如下:
“`
> forest_model <- randomForest(Item_Outlet_Sales ~ ., data = new_train, mtry = 15, ntree = 1000) #随机丛林模子
> print(forest_model)
> varImpPlot(forest_model)
“`
这个模子中可得出RMSE = 1132.04,并没有改造决定树模子。别的,随机丛林的一个成果是可以展示重要变量。我们通过下图可以看到最重要的变量是Item_MRP(通过决定树算法也已经暗示出来)。
![](http://img.shujuren.org/pictures/NW/571f338eebf16.png)

显然,这个模子可以进一步举办实验调优参数的。同时,让我们用RMSE最好的决定树来对测试集做拟合。如下所示:
“`
>main_predict <- predict(main_tree, newdata = new_test, type = "vector")
> sub_file <- data.frame(Item_Identifier = test$Item_Identifier, Outlet_Identifier = test$Outlet_Identifier, Item_Outlet_Sales = main_predict)
> write.csv(sub_file, ‘Decision_tree_sales.csv’)
“`
当预测其他样本外数据,我们可以得出RMSE是1174.33,这个模子是也可以通过调参数到达更优的,以下列出几种要领:
 本例我们没有利用标签编码和独热编码,但愿你可以实验以下编码来做随机丛林模子。 
 调解相关的参数。  
 利用Gradient Boosting来做模子。 
 成立一个新的整体模子。
各人有什么新的能使模子预测更优的要领都可以一起来接头,等候与各人的思维的碰撞。

>网作者:薛丽丹
暨南大学统计学研究生,网编辑,热爱数据阐明和数据科学。

    关键字:

在线提交作业