数据挖掘十大算法

本文将介绍如何使用R实现数据挖掘的十大算法。

  • 1.C5.0算法
  • 2.k均值聚类
  • 3.支持向量机
  • 4.关联规则
  • 5.EM算法
  • 6.PageRank算法
  • 7.AdaBoost算法
  • 8.kNN算法
  • 9.朴素贝叶斯算法
  • 10.CART算法

准备工作

如题,本文主要介绍如何在R中实现数据挖掘的十大算法,故你得先保证你的电脑装有R的环境以及这些算法对应的R包,所以你得先做两步准备工作:

  • 1.安装R和RStudio

这部分参见微信公众号中学习课堂菜单R语言基础子菜单下的R及其拓展包的安装和使用,这里不再赘述。

建议安装R-3.2.5版本。

  • 2.安装数据挖掘相关包

打开Rstudio命令行控制台,输入以下命令:

install.packages(c("adabag", "arules", "C50", "dplyr", "e1071", "igraph", "mclust"))
install.packages(  'printr',  type = 'source',  repos = c('http://yihui.name/xran', 'http://cran.rstudio.com'))

安装完毕,就可以使用R开始你的数据挖掘之旅了。

1. C5.0算法

c4.5算法是决策树模型的一种算法,是原数据挖掘十大算法之一,而C5.0算法是C4.5算法的改进版,改进后的算法能够适用于大数据的情形,它运行起来速度更快,而且效果更好并且更稳健。

我们采用R中最常用的鸢尾花数据集iris进行算法的训练和测试。鸢尾花数据集150个观测,共三个种类。其中,Species表示花的种类,其他四列Sepal.Length,Sepal.Width,Petal.Length,Petal.Width分别表示花萼的长度和宽度以及花瓣的长度与宽度。

1.1 载入C5.0的算法包

library(C50)

1.2 划分训练和测试集

iris中随机选取100条数据作为训练集,剩下的则作为测试集:

set.seed(2016) # 设随机数种子
train.indeces <- sample(1:nrow(iris), 100) iris.train <- iris[train.indeces, ] iris.test <- iris[-train.indeces, ]

1.3 采用C5.0建立决策树模型

采用C5.0函数基于训练集iris.train建立决策树模型:

model <- C5.0(formula=Species ~ ., data = iris.train)

C5.0函数参数:

  • formula:模型的方程
  • data:训练集

1.4 做测试

采用测试数据集iris.test进行测试:

results <- predict(object = model, newdata = iris.test, type = "class")

采用predict泛型函数进行预测:

  • object:C5.0类的模型对象
  • newdata:测试集
  • type:预测类型,type = “class”返回所属的类,type = “prob”返回概率值

1.5 查看预测效果

生成混淆矩阵:

res <- table(results, iris.test$Species) res

results/ setosa versicolor virginica
setosa 12 0 0
versicolor 0 16 2
virginica 0 2 18

可以看到C5.0算法在测试集上有4个样本分类错误,预测的准确度为92%

2. K-均值聚类

K-均值算法是聚类分析算法的一种。通常情况下,我们可能不知道每个数据样本从属的类别,样本没有分类标签,这时我们可以尝试采用K-均值聚类来解决这个问题。

2.1 加载算法包

library(stats)

2.2 进行K-均值聚类

这时我们假定我们不知道iris数据集的分类标签,采用K-均值聚类把数据分为三类:

model <- kmeans(x = subset(iris, select = -Species), centers = 3)

2.3 测试聚类效果

同样生成混淆矩阵:

res <- table(model$cluster, iris$Species) res

/ setosa versicolor virginica
1 0 2 36
2 50 0 0
3 0 48 14

可以看到准确率为89.33%,效果还不错,能够起到初步探索数据的目的。

以上是K均值聚类的简单示例,这里其实假定我们已经知道最有的聚类数为3类,故而有相对理想的效果;而在实际遇到的问题中可能我们事先并不知道数据应该分为几类,这也是K均值聚类一直以来的一个重要课题,就是如何确定合理的聚类数目,这个我会在后续的文章中做详细介绍。

3. 支持向量机

支持向量机(以下简写为SVM)也是一种分类算法,我们同样采用iris数据集进行学习和测试,最后看看它的效果。

3.1 载入SVM算法包

library(e1071)

3.2 划分训练和测试集

划分训练和测试集时,采用set.seed函数设随机数种子,这能保证划分得到的训练和测试集与C5.0完全相同,方便后续测试效果的比较。

set.seed(2016) train.indeces <- sample(1:nrow(iris), 100) iris.train <- iris[train.indeces, ] iris.test <- iris[-train.indeces, ]

3.3 建立SVM模型

采用svm函数基于训练集iris.train建立SVM模型:

model <- svm(formula=Species ~ ., data = iris.train)

svm函数参数:

  • formula:模型的方程
  • data:训练集

3.4 测试数据

采用测试数据集iris.test进行测试:

results <- predict(object = model, newdata = iris.test, type = "class")

采用predict泛型函数进行预测:

  • object:svm类的模型对象
  • newdata:测试集
  • type:预测类型,type = “class”返回所属的类,type = “prob”返回概率值

3.5 查看预测效果

res <- table(results, iris.test$Species) res

results/ setosa versicolor virginica
setosa 12 0 0
versicolor 0 18 2
virginica 0 0 18

可以看到SVM算法在测试集上的预测准确度为96%,仅有2个样本分类错误。在这个数据集上,采用SVM算法效果最好,C5.0算法次之,K均值的表现相对较差。

4. 关联规则

说起关联规则,如果你对它稍有了解的话就会想到那个著名的啤酒和尿布的故事。这里我们不说故事,只说算法。下面我们通过一个例子来说明关联规则的用法。

4.1 载入关联规则算法包

载入arules算法包的同时,加载包中自带的数据集Adult,该数据集是收入普查的数据,共48842个样本,15列变量,变量包括年龄,性别,种族,工作类型,收入情况,受教育程度等等。

library(arules)
data("Adult")

4.2 生成关联规则

采用apriori函数生成关联规则集:

rules <- apriori(data = Adult,
   parameter = list(support = 0.4, confidence = 0.7),
   appearance = list(rhs = c("race=White", "sex=Male"),
default = "lhs"))

apriori函数参数:

  • data:训练数据
  • parameter:设置关联规则的参数,如置信度,支持度等
  • appearance: 设置需要显示的规则

上述命令表示,对Adult做关联规则,在置信度为70%,支持度为40%的条件下,生成右边关于“race=White”或者“sex=Male”的规则集。

4.3 提取规则

比如按提升度提取前五条规则:

rules.sorted <- sort(rules, by = "lift") top5.rules <- head(rules.sorted, 5)
as(top5.rules, "data.frame")


这样便生成了5条规则,我们来试着解读一下:

  • 1.丈夫几乎和男性同时出现,这条没有什么好奇怪的,奇怪的反倒是它不等于100%;
  • 2.和第一条一样,在规则的右边加了一条城市夫妇;
  • 3、4.在出现城市夫妇时候,白人和男性的机会更大;
  • 5.当出现国籍是美国的同时,白人出现的概率更高。

可以看出,通过关联规则提取出的规则集有些可能根本毫无意义,但是它给我们提供了一种去寻找未知规则的方法,在做数据探索时,用关联规则分析可能会得到一些令人惊喜的结果哦。

5. EM算法

EM算法译作最大期望算法,它是一种迭代算法,分两步进行,第一步计算期望,利用对隐藏变量的现有估计值,计算其最大似然估计值;第二步是最大化上一步上的最大似然值来计算参数的值。以上两步交替运行,直至收敛。EM算法和K均值算法一样,通常也会被用来做聚类。

5.1 载入EM算法包

library(mclust)

This code removes the Species column from the iris dataset. Then it uses Mclust to create clusters:

5.2 采用EM算法建立模型

具体采用Mclust函数对无标签的iris数据集建模:

model <- Mclust(data=subset(iris, select = -Species))

5.3 查看预测效果

生成混淆矩阵:

table(model$classification, iris$Species)

/ setosa versicolor virginica
1 50 0 0
2 0 50 50

可以看出,EM算法能很好的区分setosa类与其他两类数据,但是在区分versicolorvirginica类上存在问题。

6. PageRank算法

PageRank算法是google搜索引擎优化中应用的重要算法之一,它被来确定超链接的相对重要程度。概括来说,用PageRank算法可以在一张图上确定对象的相对重要性。

6.1 载入算法包

library(igraph)
library(dplyr)

6.2 生成一张图

采用random.graph.game函数生成一个包含10个对象的随机有向图:

g <- random.graph.game(n = 10, p.or.m = 1/4, directed = TRUE)
plot(g)


6.3 计算每个对象的PageRank值

pr <- page.rank(g)$vector

6.4 按PageRank值排序

df <- data.frame(Object = 1:10, PageRank = pr)
arrange(df, desc(PageRank))

Object PageRank
6 0.2252179
3 0.2216291
4 0.1872577
8 0.1082083
2 0.0796605
1 0.0463270
7 0.0459023
10 0.0431658
5 0.0262379
9 0.0163934

可以看出,在这个图中,对象6的重要程度最高。

7. AdaBoost算法

AdaBoost算法是一种集成学习的分类算法,它会集成多个弱分类器,最终形成一个预测精度较好的分类器。 我们同样采用iris数据集做示例数据。

7.1 加载算法包

library(adabag)

7.2 划分训练和测试集

set.seed(2016) train.indeces <- sample(1:nrow(iris), 100) iris.train <- iris[train.indeces, ] iris.test <- iris[-train.indeces, ]

7.3 采用AdaBoost算法建立模型

利用boosting函数基于训练集iris.train建立模型:

model <- boosting(Species ~ ., data = iris.train)

boosting函数参数:

  • formula:模型的方程
  • data:训练集

7.4 测试

利用predict泛型函数对测试集iris.test进行预测:

results <- predict(object = model, newdata = iris.test, type = "class")

predict函数参数:

  • object:boosting类的模型对象
  • newdata:测试集
  • type:预测类型,type = “class”返回所属的类,type = “prob”返回概率值

7.5 查看预测效果

res <- results$confusion res

Predicted Class/Observed Class setosa versicolor virginica
setosa 12 0 0
versicolor 0 17 2
virginica 0 1 18

可以看到AdaBoost算法在测试集上的预测准确度为94%,仅有3个样本分类错误。与前文的SVM算法以及C5.0算法相比,效果也不差。

8. kNN算法

kNN算法是一种惰性的分类学习算法,何为惰性,就是它不能通过学习得到一个确定的模型或者规则,在每来一个数据样本需要进行测试或者预测时,都需要重新计算才能判定新来的点的类的归属。

8.1 载入kNN算法包

library(class)

8.2 划分训练和测试集

set.seed(2016) train.indeces <- sample(1:nrow(iris), 100) iris.train <- iris[train.indeces, ] iris.test <- iris[-train.indeces, ]

8.3 采用kNN算法做预测

因为kNN算法是惰性的,所以训练测试同时进行,代码如下:

results <- knn(train = subset(iris.train, select = -Species),
test = subset(iris.test, select = -Species),
cl = iris.train$Species)

8.4 查看预测效果

生成混淆矩阵:

res <- table(results, iris.test$Species) res

results/ setosa versicolor virginica
setosa 12 0 0
versicolor 0 18 2
virginica 0 0 18

可以看出,kNN算法的效果还不错,预测准确度达到了96%

9. 朴素贝叶斯算法

朴素贝叶斯算法是基于概率论的一种经典算法,它也可以用来做分类,我们继续用iris数据集来做训练和测试。

9.1 加载算法包

library(e1071)

9.2 划分训练和测试集

set.seed(2016) train.indeces <- sample(1:nrow(iris), 100) iris.train <- iris[train.indeces, ] iris.test <- iris[-train.indeces, ]

9.3 采用朴素贝叶斯算法建立模型

采用naiveBayes函数基于训练集iris.train建立模型:

model <- naiveBayes(x = subset(iris.train,select=-Species),    y = iris.train$Species)

naiveBayes函数参数:

  • x:训练数据集
  • y:分类标签 值得注意的是,采用朴素贝叶斯建立模型时,特征变量和分类标签是作为两个输入参数xy输入的,而不是像其他算法直接采用数据框整体输入。

9.4 预测

采用predict泛型函数对测试集iris.test进行预测:

results <- predict(object = model, newdata = iris.test, type = "class")

predict函数参数:

  • object:naiveBayes类的模型对象
  • newdata:测试集
  • type:预测类型,type = “class”返回所属的类,type = “prob”返回概率值

9.5 查看预测效果

生成混淆矩阵:

res <- table(results, iris.test$Species) res

results/ setosa versicolor virginica
setosa 12 0 0
versicolor 0 18 2
virginica 0 0 18

朴素贝叶斯算法在测试集上的效果也还不错,预测准确度达到了96%

10. CART算法

CART算法是一种决策树算法,下面我们介绍如何利用CART算法建立决策树。

10.1 载入CART算法包

library(rpart)

10.2 划分训练和测试集

set.seed(2016) train.indeces <- sample(1:nrow(iris), 100) iris.train <- iris[train.indeces, ] iris.test <- iris[-train.indeces, ]

10.3 采用CART算法建立决策树模型

采用rpart函数基于训练集iris.train建立决策树模型:

model <- rpart(formula=Species ~ ., data = iris.train)

rpart函数参数:

  • formula:模型的方程
  • data:训练集

10.4 预测

采用predict泛型函数对测试集iris.test进行预测:

results <- predict(object = model, newdata = iris.test, type = "class")

predict函数参数:

  • object:naiveBayes类的模型对象
  • newdata:测试集
  • type:预测类型,type = “class”返回所属的类,type = “prob”返回概率值

10.5 查看预测结果

生成混淆矩阵

res <- table(results, iris.test$Species) res

results/ setosa versicolor virginica
setosa 12 0 0
versicolor 0 16 2
virginica 0 2 18

CART算法在测试集上的效果一般,预测准确率为92%

小结

  • 本文中演示数据集比较简单,所以算法都能有着不错的效果。
  • 文中列出算法准确率的高低并不能代表算法的优劣。实际上,一个算法的优劣不能简单的通过一个数据集或者一个评判指标来衡量,不同的算法都有着它的适用场景,需要因地制宜。

本文仅介绍了十大算法的R应用,愚以为要真正用好十大算法还是需要在理论基础上多下功夫,只有深刻理解算法才能真正在使用上做到游刃有余。数据挖掘之路漫漫而修远,潜心修炼方能修成正果,共勉之。

未经允许不得转载:氢网 » 数据挖掘十大算法

支付宝扫码打赏 微信打赏

欢迎点击上方按钮对我打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!