分类算法简介 基于R
最近的关键字:分类算法,outlier detection, machine learning
简介:
此文将 k-means,decision tree,random forest,SVM(support vector mechine),人工神经网络(Artificial Neural Network,简称ANN )这几种常见的算法 apply 在同一个数据集
spam,看各种方法预测错误率,或准确率,旨在追求预测准确性,辨识出这几种方法的实用性,对背后的理论依据,大量的数学公式,不作讨论(能力有限,看不懂数学公式,,,)
ps:这两天看代码。又发现不少好玩的方法和网站,哦哈哈
先分享几个tips、R blog:
a) 如何快速找到自己想要的R package。到 Available CRAN Packages By Date of Publication control+F 找,快得很。
b) 如何找到一个小领域 一些列相关的R包。以 randomForest 为例,到这个包的页面,你会看到一个 In views:Environmetrics, MachineLearning,接下来就可以把机器学习算法的R包一网打尽。帅呆了,好么,再也不用一个个查了。
c) 挺好的一个 R blog http://mkseo.pe.kr/stats/ 里面有韩文和英文写的文章,不知道博主是个是个韩国妹子呢,,,想多了,,,妹子怎么去coding,,,
d)再推荐一个blog 。拷过来,变成了这样,,戳吧,少年。
实际应用:
(1)k-means
#----------------------------
基于数据集 spam来看看k-means
library(kernlab)
library(magrittr)
data(spam)
set.seed(124)
res <- kmeans(spam[,-58]%>%sapply(scale),2)
table(spam$type,res$cluster)
1 2
nonspam 2754 34
spam 1813 0
# 错误率是 1-2754/nrow(spam) = 0.4014345
# 假设spam 和 nonspam 五五开,如果完全是蒙,出错率也就50%吧,,,
总结:
分类变量不能用于k-means,不能简单将分类变量编号为1,2,3。能给出每个类别之间的距离,是可以用kmeans的。
必须对每列预先scale。
#----------------------------
(2)decision tree
library(tree)
library(kernlab)
library(dplyr)
library(magrittr)
data(spam)
#create train and test dataset
set.seed(1859)
train <- sample(nrow(spam),nrow(spam)*0.7,replace = FALSE)
df.train <- spam[train,]
df.test <- spam[-train,]
#modeling
tree.fit <- tree(type~.,data=df.train)
summary(tree.fit)
# plot decision tree
plot(tree.fit, type ="uniform")
text(tree.fit, pretty =1, all=TRUE,cex=0.7)
# predication
pred <- predict(tree.fit,df.test,type = c("class"))
#查看预测结果
confusionMatrix(pred,df.test[,58])
Confusion Matrix and Statistics
Reference
Prediction nonspam spam
nonspam 819 84
spam 34 444
Accuracy : 0.9146
# decision tree 选择变量模型会自动帮你选择选择,预测错误率是 0.08
放个图
总结:
引用tree这个包帮助文档的一句话:The left-hand-side (response) should be either a numerical vector when a regression tree will be fitted or a factor,when a classification tree is produced. 既可以做classification 也可以 regression!
如果是做classification,Factor predictor variables can have up to 32 levels.
decision tree 会不会 overfitting?我看下来,是不会,用tree.fit对测试集预测时,准确率依然是很高。
帮助文档是这样说的:The split which maximizes the reduction in impurity is chosen, the data set split and the process repeated. Splitting continues until the terminal nodes are too small or too few to be split.
看下面的代码,也可以证明不存在overfitting吧
> summary(tree.fit)
Classification tree:
tree(formula = type ~ ., data = df.train)
Variables actually used in tree construction:
[1] "charDollar" "remove" "charExclamation"
[4] "george" "hp" "capitalLong"
[7] "edu" "num650" "capitalTotal"
[10] "free" "capitalAve"
Number of terminal nodes: 16
Residual mean deviance: 0.432 = 1384 / 3204
Misclassification error rate: 0.08416 = 271 / 3220
放一篇 文章 Decision Tree - Overfitting
#---------------------------
(3)random forest
library(randomForest)
library(magrittr)
library(dplyr)
data(spam)
train <- sample(nrow(spam),nrow(spam)*0.7,replace = FALSE)
df.train <- spam[train,]
df.test <- spam[-train,]
# random forest 要预先设定随机种子,结果才能一样。
set.seed(189)
spam.rf <- randomForest(type~.,data=df.train,mtry=3,do.trace=100,ntree=500,importance=TRUE,proximity=TRUE)
#下面是运行时,种到第几百棵树的时候,error rate是多少
ntree OOB 1 2
100: 5.56% 2.95% 9.49%
200: 5.59% 2.69% 9.96%
300: 5.53% 2.79% 9.65%
400: 5.40% 2.84% 9.26%
500: 5.28% 2.69% 9.18%
spam.rf
pred <- predict(spam.rf,df.test[,-58],type="class")
confusionMatrix(pred,df.test[,58])
Confusion Matrix and Statistics
Reference
Prediction nonspam spam
nonspam 833 41
spam 20 487
Accuracy : 0.9558
# 错误率很低
# random forest 已经自己选择了关键变量,不存在过度拟合的问题
# 下面的命令是看那些变量重要
varImpPlot(spam.rf)
varImpPlot(spam.rf)的运行结果是一张图,charExclamation 这个变量对于预测是不是垃圾邮件,至关重要。
总结:
random forest会不会 overfitting?Random Forest - How to handle overfitting
Breiman claims that RF does not overfit. stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
从预测结果看,是不会overfitting。另外这个包的开发者都声称不会overfitting了,,,
random forest 也是classification 和regression 都能做
放一篇这个包作者的文章:http://www.bios.unc.edu/~dzeng/BIOS740/randomforest.pdf
#---------------------------
(4)SVM (supprot vector mechine)
先看e1071这个包的SVM
library(e1071)
library(rpart)
set.seed(1871)
train <- sample(nrow(spam),nrow(spam)*0.7,replace = FALSE)
df.train <- spam[train,]
df.test <- spam[-train,]
model <- svm(df.train[,-58], df.train[,58])
print(model)
summary(model)
pred <- predict(model, df.test[,-58])
confusionMatrix(pred,df.test[,58])
Confusion Matrix and Statistics
Reference
Prediction nonspam spam
nonspam 789 59
spam 37 496
Accuracy : 0.9305
再看另一个,来自于caret包,参考 Computational Prediction这篇文章
library(caret)
library(doMC)
data(spam)
set.seed(89)
train <- sample(nrow(spam),nrow(spam)*0.7,replace = FALSE)
df.train <- spam[train,]
df.test <- spam[-train,]
# 多线程,是doMC包的函数,看了监视器,确实cpu使用率瞬间飙到90%+。
# 回头仔细研究下和parallel包有什么区别
registerDoMC(cores=4)
model <- train(df.train[, -58], df.train[, 58], method="svmRadial")
predict(model,df.test[,-58])%>%confusionMatrix(df.test[,58])
# 准确率也还可以
Confusion Matrix and Statistics
Reference
Prediction nonspam spam
nonspam 816 70
spam 42 453 Accuracy : 0.9189
Computational Prediction 这篇里面还发现一个好玩的地方,就是可以用一小函数人为的造出一些缺失值,然后用Bagged tree imputation 补缺失值,还没研究它补缺失值的逻辑是什么,先放一篇文章备查。
Bagged tree imputation for missing values using caret。
fillInNa <- function(d) {
naCount <- NROW(d) * 0.1
for (i in sample(NROW(d), naCount)) {
d[i, sample(4, 1)] <- NA
}
return(d)
}
#---------------------------
(5)人工神经网络(Artificial Neural Network)
参考 R语言中最强的神经网络包RSNNS 和RSNNS 帮助文档,帮助文档在 confusionMatrix(iris$targetsTrain,fitted.values(model)),这一句有错误,必须encodeClassLabels才可以,正确的写法是:confusionMatrix(encodeClassLabels(iris$targetsTrain),encodeClassLabels(fitted.values(model)))
library(RSNNS)
library(doMC)
data(spam)
set.seed(199)
spam <- spam[sample(1:nrow(spam) ,nrow(spam)), 1:ncol(spam)]
spamValues <- spam[,-58]
spamTargets <- spam[,58]
spamDecTargets <- decodeClassLabels(spamTargets)
spam <- splitForTrainingAndTest(spamValues, spamDecTargets, ratio = 0.3)
spam <- normTrainingAndTestSet(spam)
#The model is then built with:
# registerDoMC(cores=4) 看了下活动监视器,CPU使用率在30%左右,这东西在这里没卵用。
# 下面这个函数很耗时
model <- mlp(spam$inputsTrain, spam$targetsTrain, size = 5
,learnFuncParams = c(0.1), maxit = 60
,inputsTest = spam$inputsTest
,targetsTest = spam$targetsTest) predictions <- predict(model, spam$inputsTest)
confusionMatrix(encodeClassLabels(spam$targetsTest),encodeClassLabels(predictions))
Confusion Matrix and Statistics
Reference
Prediction 1 2
1 805 42
2 34 500 Accuracy : 0.945
95% CI : (0.9316, 0.9564)
No Information Rate : 0.6075
P-Value [Acc > NIR] : <2e-16 Kappa : 0.8843
Mcnemar's Test P-Value : 0.422 Sensitivity : 0.9595
Specificity : 0.9225
Pos Pred Value : 0.9504
Neg Pred Value : 0.9363
Prevalence : 0.6075
Detection Rate : 0.5829
Detection Prevalence : 0.6133
Balanced Accuracy : 0.9410 'Positive' Class : 1
预测准确率略低于randomForest,和之前老板提到几个算法中randomForest最牛逼是吻合的。不过人工神经网络计算很耗时间,又回去重新计算,看了下时间
用户 系统 流逝
248.671 26.796 283.194
#---------------------------
(6)贝叶斯网络
最后:
以上各种方法的理论部分,还需继续学习。
对于上面的几种方法介绍,我的代码肯定还有纰漏,或者错误,请允许我慢慢改进,轻拍。
2015-08-23更新:
决策树有很多包都可以实现,不局限于tree这个包,这篇文章A Brief Tour of the Trees and Forests,介绍的很详细。
C50包也可以做decision tree
library(C50)
library(kernlab)
data(spam)
train <- sample(1:nrow(spam),nrow(spam)*0.7,replace=F)
df.train <- spam[train,]
df.test <- spam[-train,]
model <- C50::C5.0(type~.,data=df.train)
summary(model)
pre <- C50::predict.C5.0(model,newdata=df.test[,-58],type='class')
confusionMatrix(pre,df.test[,58])
分类算法简介 基于R的更多相关文章
- 分类算法简介 分类: B10_计算机基础 2015-03-09 11:08 257人阅读 评论(0) 收藏
一.决策树 决策树是用于分类和预测的主要技术之一,决策树学习是以实例为基础的归纳学习算法,它着眼于从一组无次序.无规则的实例中 推理出以决策树表示的分类规则.构造决策树的目的是找出属性和类别间的关系, ...
- Newton-Raphson算法简介及其R实现
本文简要介绍了Newton-Raphson方法及其R语言实现并给出几道练习题供参考使用. 下载PDF格式文档(Academia.edu) Newton-Raphson Method Let $f(x) ...
- Mahout 分类算法
实验简介 本次课程学习了Mahout 的 Bayes 分类算法. 一.实验环境说明 1. 环境登录 无需密码自动登录,系统用户名 shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu ...
- R语言与分类算法的绩效评估(转)
关于分类算法我们之前也讨论过了KNN.决策树.naivebayes.SVM.ANN.logistic回归.关于这么多的分类算法,我们自然需要考虑谁的表现更加的优秀. 既然要对分类算法进行评价,那么我们 ...
- 基于机器学习和TFIDF的情感分类算法,详解自然语言处理
摘要:这篇文章将详细讲解自然语言处理过程,基于机器学习和TFIDF的情感分类算法,并进行了各种分类算法(SVM.RF.LR.Boosting)对比 本文分享自华为云社区<[Python人工智能] ...
- 分类算法的R语言实现案例
最近在读<R语言与网站分析>,书中对分类.聚类算法的讲解通俗易懂,和数据挖掘理论一起看的话,有很好的参照效果. 然而,这么好的讲解,作者居然没提供对应的数据集.手痒之余,我自己动手整理了一 ...
- R语言分类算法之随机森林
R语言分类算法之随机森林 1.原理分析: 随机森林是通过自助法(boot-strap)重采样技术,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练集样本集合,然后根据自助样本集生成k个决策 ...
- LM-MLC 一种基于完型填空的多标签分类算法
LM-MLC 一种基于完型填空的多标签分类算法 1 前言 本文主要介绍本人在全球人工智能技术创新大赛[赛道一]设计的一种基于完型填空(模板)的多标签分类算法:LM-MLC,该算法拟合能力很强能感知标签 ...
- 第二篇:基于K-近邻分类算法的约会对象智能匹配系统
前言 假如你想到某个在线约会网站寻找约会对象,那么你很可能将该约会网站的所有用户归为三类: 1. 不喜欢的 2. 有点魅力的 3. 很有魅力的 你如何决定某个用户属于上述的哪一类呢?想必你会分析用户的 ...
随机推荐
- 【ACM】会场安排问题
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工 ...
- my.兽决_等_价格
1.20170411 音乐洒水车,升50级 送了 兽决 隐身,摆摊推荐价格 20000金,大家都卖26000金 2.20170417 音乐洒水车 挖到 必杀 魔决,推荐价格 19820金,我以 -10 ...
- 大型分布式java应用与SOA
1.基于消息方式.远程调用方式的架构带来的问题: 1.1 系统多元化的问题 [解决]: 对共用逻辑部分进行抽象: 1.2 系统访问量.数据量上涨后带来的问题 [解决]: 拆分系统: 1.3 在构建共用 ...
- JAVA中 List和ArrayList的区别
List是一个接口,而ListArray是一个类. ListArray继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造. ...
- Mongodb installation & userguide
1.Mongodb Installation in Ubuntu (1) Download from: https://www.mongodb.org/downloads File: mongodb- ...
- vue进阶 --- 实例演示
这篇博客将通过一个实例来对vue构建项目的过程有一个了解. 主要用到的知识点如下所示: vue-router 2.0路由配置 router-view 和 router-link的使用 transiti ...
- php 自带加密、解密函数
php 自带的加密函数 不可逆的加密函数为:md5().crypt() md5() 用来计算 MD5 哈稀.语法为:string md5(string str); crypt() 将字符串用 UNI ...
- 根据时间显示不同的问候语的JavaScript代码
对于最近有许多的初学开发者问我关于根据时间显示不同的问候语的JavaScript代码问题,所以今天将自己整理的一些代码在这里分享出来,供初学者参考,如果在运行过程中有问题,可以给我在下方留言. < ...
- Razor,aspx的占位控件(母版页)
1.razor: 母版页中:@*类似master的占位控件*@ @RenderSection("scripts", required: false) 部分页中: @section ...
- Active Directory 域服务对象
局域网计算机控制中心 可以在DC上控制所有局域网资源(计算机 .用户.设备) 大中型企业管理必备. 最后,它还可以让开发人员集成LDAP身份认证,使用域账号登录应用. 也就是说,此企业的所有系统,都可 ...