转自 雪晴网

【R】如何确定最适合数据集的机器学习算法

抽查(Spot checking)机器学习算法是指如何找出最适合于给定数据集的算法模型。本文中我将介绍八个常用于抽查的机器学习算法,文中还包括各个算法的 R 语言代码,你可以将其保存并运用到下一个机器学习项目中。

适用于你的数据集的最佳算法

你无法在建模前就知道哪个算法最适用于你的数据集。你必须通过反复试验的方法来寻找出可以解决你的问题的最佳算法,我称这个过程为 spot checking。我们所遇到的问题不是我应该采用哪个算法来处理我的数据集?,而是我应该抽查哪些算法来处理我的数据集?

抽查哪些算法?

首先,你可以思考哪些算法可能适用于你的数据集。

其次,我建议尽可能地尝试混合算法并观察哪个方法最适用于你的数据集。

尝试混合算法(如事件模型和树模型)

尝试混合不同的学习算法(如处理相同类型数据的不同算法)

尝试混合不同类型的模型(如线性和非线性函数或者参数和非参数模型)

让我们具体看下如何实现这几个想法。下一章中我们将看到如何在 R 语言中实现相应的机器学习算法。

如何在 R 语言中抽查算法?

R 语言中存在数百种可用的机器学习算法。如果你的项目要求较高的预测精度且你有充足的时间,我建议你可以在实践过程中尽可能多地探索不同的算法。通常情况下,我们没有太多的时间用于测试,因此我们需要了解一些常用且重要的算法。

本章中你将会接触到一些 R 语言中经常用于抽查处理的线性和非线性算法,但是其中并不包括类似于boosting和bagging的集成算法。每个算法都会从两个视角进行呈现:

常规的训练和预测方法

caret包的用法

你需要知道给定算法对应的软件包和函数,同时你还需了解如何利用caret包实现这些常用的算法,从而你可以利用caret包的预处理、算法评估和参数调优的能力高效地评估算法的精度。本文中将用到两个标准的数据集:

回归模型:BHD(Boston Housing Dataset)

分类模型: PIDD(Pima Indians Diabetes Dataset)

下文中的所有代码都是完整的,因此你可以将其保存下来并运用到下个机器学习项目中。

线性算法

这类方法对模型的函数形式有严格的假设条件,虽然这些方法的运算速度快,但是其结果偏倚较大。

这类模型的最终结果通常易于解读,因此如果线性模型的结果足够精确,那么你没有必要采用较为复杂的非线性模型。

线性回归模型

  1. stat包中的lm()函数可以利用最小二乘估计拟合线性回归模型。
  2. # load the library
  3. library(mlbench)
  4. # load data
  5. data(BostonHousing)
  6. # fit model
  7. fit <- lm(mdev~>, BostonHousing)
  8. # summarize the fit
  9. print(fit)
  10. # make predictions
  11. predictions <- predict(fit, BostonHousing)
  12. # summarize accuracy
  13. mse <- mean((BostonHousing$medv - predictions)^2)
  14. print(mse)
  15. # caret
  16. # load libraries
  17. library(caret)
  18. library(mlbench)
  19. # load dataset
  20. data(BostonHousing)
  21. # train
  22. set.seed(7)
  23. control <- trainControl(method="cv", number=5)
  24. fit.lm <- train(medv~., data=BostonHousing, method="lm", metric="RMSE", preProc=c("center", "scale"), trControl=control)
  25. # summarize fit
  26. print(fit.lm)

罗吉斯回归模型

  1. stat包中glm()函数可以用于拟合广义线性模型。它可以用于拟合处理二元分类问题的罗吉斯回归模型。
  2. # load the library
  3. library(mlbench)
  4. # Load the dataset
  5. data(PimaIndiansDiabetes)
  6. # fit model
  7. fit <- glm(diabetes~., data=PimaIndiansDiabetes, family=binomial(link='logit'))
  8. # summarize the fit
  9. print(fit)
  10. # make predictions
  11. probabilities <- predict(fit, PimaIndiansDiabetes[,1:8], type='response')
  12. predictions <- ifelse(probabilities > 0.5,'pos','neg')
  13. # summarize accuracy
  14. table(predictions, PimaIndiansDiabetes$diabetes)
  15. # caret
  16. # load libraries
  17. library(caret)
  18. library(mlbench)
  19. # Load the dataset
  20. data(PimaIndiansDiabetes)
  21. # train
  22. set.seed(7)
  23. control <- trainControl(method="cv", number=5)
  24. fit.glm <- train(diabetes~., data=PimaIndiansDiabetes, method="glm", metric="Accuracy", preProc=c("center", "scale"), trControl=control)
  25. # summarize fit
  26. print(fit.glm)

线性判别分析

  1. MASS包中的lda()函数可以用于拟合线性判别分析模型。
  2. # load the libraries
  3. library(MASS)
  4. library(mlbench)
  5. # Load the dataset
  6. data(PimaIndiansDiabetes)
  7. # fit model
  8. fit <- lda(diabetes~., data=PimaIndiansDiabetes)
  9. # summarize the fit
  10. print(fit)
  11. # make predictions
  12. predictions <- predict(fit, PimaIndiansDiabetes[,1:8])$class
  13. # summarize accuracy
  14. table(predictions, PimaIndiansDiabetes$diabetes)
  15. # caret
  16. # load libraries
  17. library(caret)
  18. library(mlbench)
  19. # Load the dataset
  20. data(PimaIndiansDiabetes)
  21. # train
  22. set.seed(7)
  23. control <- trainControl(method="cv", number=5)
  24. fit.lda <- train(diabetes~., data=PimaIndiansDiabetes, method="lda", metric="Accuracy", preProc=c("center", "scale"), trControl=control)
  25. # summarize fit
  26. print(fit.lda)

正则化回归

  1. glmnet包中的glmnet()函数可以用于拟合正则化分类或回归模型。
  2. 分类模型:
  3. # load the library
  4. library(glmnet)
  5. library(mlbench)
  6. # load data
  7. data(PimaIndiansDiabetes)
  8. x <- as.matrix(PimaIndiansDiabetes[,1:8])
  9. y <- as.matrix(PimaIndiansDiabetes[,9])
  10. # fit model
  11. fit <- glmnet(x, y, family="binomial", alpha=0.5, lambda=0.001)
  12. # summarize the fit
  13. print(fit)
  14. # make predictions
  15. predictions <- predict(fit, x, type="class")
  16. # summarize accuracy
  17. table(predictions, PimaIndiansDiabetes$diabetes)
  18. # caret
  19. # load libraries
  20. library(caret)
  21. library(mlbench)
  22. library(glmnet)
  23. # Load the dataset
  24. data(PimaIndiansDiabetes)
  25. # train
  26. set.seed(7)
  27. control <- trainControl(method="cv", number=5)
  28. fit.glmnet <- train(diabetes~., data=PimaIndiansDiabetes, method="glmnet", metric="Accuracy", preProc=c("center", "scale"), trControl=control)
  29. # summarize fit
  30. print(fit.glmnet)
  31. 回归模型:
  32. # load the libraries
  33. library(glmnet)
  34. library(mlbench)
  35. # load data
  36. data(BostonHousing)
  37. BostonHousing$chas <- as.numeric(as.character(BostonHousing$chas))
  38. x <- as.matrix(BostonHousing[,1:13])
  39. y <- as.matrix(BostonHousing[,14])
  40. # fit model
  41. fit <- glmnet(x, y, family="gaussian", alpha=0.5, lambda=0.001)
  42. # summarize the fit
  43. print(fit)
  44. # make predictions
  45. predictions <- predict(fit, x, type="link")
  46. # summarize accuracy
  47. mse <- mean((y - predictions)^2)
  48. print(mse)
  49. # caret
  50. # load libraries
  51. library(caret)
  52. library(mlbench)
  53. library(glmnet)
  54. # Load the dataset
  55. data(BostonHousing)
  56. # train
  57. set.seed(7)
  58. control <- trainControl(method="cv", number=5)
  59. fit.glmnet <- train(medv~., data=BostonHousing, method="glmnet", metric="RMSE", preProc=c("center", "scale"), trControl=control)
  60. # summarize fit
  61. print(fit.glmnet)

非线性算法

  1. 非线性算法对模型函数形式的限定较少,这类模型通常具有高精度和方差大的特点。
  2. k近邻法
  3. caret包中的knn3()函数并没有建立模型,而是直接对训练集数据作出预测。它既可以用于分类模型也可以用于回归模型。
  4. 分类模型:
  5. # knn direct classification
  6. # load the libraries
  7. library(caret)
  8. library(mlbench)
  9. # Load the dataset
  10. data(PimaIndiansDiabetes)
  11. # fit model
  12. fit <- knn3(diabetes~., data=PimaIndiansDiabetes, k=3)
  13. # summarize the fit
  14. print(fit)
  15. # make predictions
  16. predictions <- predict(fit, PimaIndiansDiabetes[,1:8], type="class")
  17. # summarize accuracy
  18. table(predictions, PimaIndiansDiabetes$diabetes)
  19. # caret
  20. # load libraries
  21. library(caret)
  22. library(mlbench)
  23. # Load the dataset
  24. data(PimaIndiansDiabetes)
  25. # train
  26. set.seed(7)
  27. control <- trainControl(method="cv", number=5)
  28. fit.knn <- train(diabetes~., data=PimaIndiansDiabetes, method="knn", metric="Accuracy", preProc=c("center", "scale"), trControl=control)
  29. # summarize fit
  30. print(fit.knn)
  31. 回归模型:
  32. # load the libraries
  33. library(caret)
  34. library(mlbench)
  35. # load data
  36. data(BostonHousing)
  37. BostonHousing$chas <- as.numeric(as.character(BostonHousing$chas))
  38. x <- as.matrix(BostonHousing[,1:13])
  39. y <- as.matrix(BostonHousing[,14])
  40. # fit model
  41. fit <- knnreg(x, y, k=3)
  42. # summarize the fit
  43. print(fit)
  44. # make predictions
  45. predictions <- predict(fit, x)
  46. # summarize accuracy
  47. mse <- mean((BostonHousing$medv - predictions)^2)
  48. print(mse)
  49. # caret
  50. # load libraries
  51. library(caret)
  52. data(BostonHousing)
  53. # Load the dataset
  54. data(BostonHousing)
  55. # train
  56. set.seed(7)
  57. control <- trainControl(method="cv", number=5)
  58. fit.knn <- train(medv~., data=BostonHousing, method="knn", metric="RMSE", preProc=c("center", "scale"), trControl=control)
  59. # summarize fit
  60. print(fit.knn)

朴素贝叶斯算法

e1071包中的naiveBayes()函数可用于拟合分类问题中的朴素贝叶斯模型。

  1. # load the libraries
  2. library(e1071)
  3. library(mlbench)
  4. # Load the dataset
  5. data(PimaIndiansDiabetes)
  6. # fit model
  7. fit <- naiveBayes(diabetes~., data=PimaIndiansDiabetes)
  8. # summarize the fit
  9. print(fit)
  10. # make predictions
  11. predictions <- predict(fit, PimaIndiansDiabetes[,1:8])
  12. # summarize accuracy
  13. table(predictions, PimaIndiansDiabetes$diabetes)
  14. # caret
  15. # load libraries
  16. library(caret)
  17. library(mlbench)
  18. # Load the dataset
  19. data(PimaIndiansDiabetes)
  20. # train
  21. set.seed(7)
  22. control <- trainControl(method="cv", number=5)
  23. fit.nb <- train(diabetes~., data=PimaIndiansDiabetes, method="nb", metric="Accuracy", trControl=control)
  24. # summarize fit
  25. print(fit.nb)

支持向量机算法

kernlab包中的ksvm()函数可用于拟合分类和回归问题中的支持向量机模型。

  1. 分类模型:
  2. # Classification Example:
  3. # load the libraries
  4. library(kernlab)
  5. library(mlbench)
  6. # Load the dataset
  7. data(PimaIndiansDiabetes)
  8. # fit model
  9. fit <- ksvm(diabetes~., data=PimaIndiansDiabetes, kernel="rbfdot")
  10. # summarize the fit
  11. print(fit)
  12. # make predictions
  13. predictions <- predict(fit, PimaIndiansDiabetes[,1:8], type="response")
  14. # summarize accuracy
  15. table(predictions, PimaIndiansDiabetes$diabetes)
  16. # caret
  17. # load libraries
  18. library(caret)
  19. library(mlbench)
  20. # Load the dataset
  21. data(PimaIndiansDiabetes)
  22. # train
  23. set.seed(7)
  24. control <- trainControl(method="cv", number=5)
  25. fit.svmRadial <- train(diabetes~., data=PimaIndiansDiabetes, method="svmRadial", metric="Accuracy", trControl=control)
  26. # summarize fit
  27. print(fit.svmRadial)
  28. 回归模型:
  29. # Regression Example:
  30. # load the libraries
  31. library(kernlab)
  32. library(mlbench)
  33. # load data
  34. data(BostonHousing)
  35. # fit model
  36. fit <- ksvm(medv~., BostonHousing, kernel="rbfdot")
  37. # summarize the fit
  38. print(fit)
  39. # make predictions
  40. predictions <- predict(fit, BostonHousing)
  41. # summarize accuracy
  42. mse <- mean((BostonHousing$medv - predictions)^2)
  43. print(mse)
  44. # caret
  45. # load libraries
  46. library(caret)
  47. library(mlbench)
  48. # Load the dataset
  49. data(BostonHousing)
  50. # train
  51. set.seed(7)
  52. control <- trainControl(method="cv", number=5)
  53. fit.svmRadial <- train(medv~., data=BostonHousing, method="svmRadial", metric="RMSE", trControl=control)
  54. # summarize fit
  55. print(fit.svmRadial)

分类和回归树

rpart包中的rpart()函数可用于拟合CART分类树和回归树模型。

  1. 分类模型:
  2. # load the libraries
  3. library(rpart)
  4. library(mlbench)
  5. # Load the dataset
  6. data(PimaIndiansDiabetes)
  7. # fit model
  8. fit <- rpart(diabetes~., data=PimaIndiansDiabetes)
  9. # summarize the fit
  10. print(fit)
  11. # make predictions
  12. predictions <- predict(fit, PimaIndiansDiabetes[,1:8], type="class")
  13. # summarize accuracy
  14. table(predictions, PimaIndiansDiabetes$diabetes)
  15. # caret
  16. # load libraries
  17. library(caret)
  18. library(mlbench)
  19. # Load the dataset
  20. data(PimaIndiansDiabetes)
  21. # train
  22. set.seed(7)
  23. control <- trainControl(method="cv", number=5)
  24. fit.rpart <- train(diabetes~., data=PimaIndiansDiabetes, method="rpart", metric="Accuracy", trControl=control)
  25. # summarize fit
  26. print(fit.rpart)
  27. 回归模型:
  28. # load the libraries
  29. library(rpart)
  30. library(mlbench)
  31. # load data
  32. data(BostonHousing)
  33. # fit model
  34. fit <- rpart(medv~., data=BostonHousing, control=rpart.control(minsplit=5))
  35. # summarize the fit
  36. print(fit)
  37. # make predictions
  38. predictions <- predict(fit, BostonHousing[,1:13])
  39. # summarize accuracy
  40. mse <- mean((BostonHousing$medv - predictions)^2)
  41. print(mse)
  42. # caret
  43. # load libraries
  44. library(caret)
  45. library(mlbench)
  46. # Load the dataset
  47. data(BostonHousing)
  48. # train
  49. set.seed(7)
  50. control <- trainControl(method="cv", number=2)
  51. fit.rpart <- train(medv~., data=BostonHousing, method="rpart", metric="RMSE", trControl=control)
  52. # summarize fit
  53. print(fit.rpart)

其他算法

R 语言中还提供了许多caret可以使用的机器学习算法。我建议你去探索更多的算法,并将其运用到你的下个机器学习项目中。

Caret Model List这个网页上提供了caret中机器学习算法的函数和其相应软件包的映射关系。你可以通过它了解如何利用caret构建机器学习模型。

总结

本文中介绍了八个常用的机器学习算法:

线性回归模型

罗吉斯回归模型

线性判别分析

正则化回归

k近邻

朴素贝叶斯

支持向量机

分类和回归树

从上文的介绍中,你可以学到如何利用 R 语言中的包和函数实现这些算法。同时你还可以学会如何利用caret包实现上文提到的所有机器学习算法。最后,你还可以将这些算法运用到你的机器学习项目中。

R语言 常见模型的更多相关文章

  1. R语言︱机器学习模型评估方案(以随机森林算法为例)

    笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...

  2. R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错

    笔者寄语:机器学习中交叉验证的方式是主要的模型评价方法,交叉验证中用到了哪些指标呢? 交叉验证将数据分为训练数据集.测试数据集,然后通过训练数据集进行训练,通过测试数据集进行测试,验证集进行验证. 模 ...

  3. R语言-简单模型画图

    1.回归拟合 > plot(mtcars$mpg~mtcars$disp) > lmfit<-lm(mtcars$mpg~mtcars$disp) #线性回归模型 > abli ...

  4. R语言︱情感分析—基于监督算法R语言实现(二)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:本文大多内容来自未出版的<数据 ...

  5. R语言︱ROC曲线——分类器的性能表现评价

    笔者寄语:分类器算法最后都会有一个预测精度,而预测精度都会写一个混淆矩阵,所有的训练数据都会落入这个矩阵中,而对角线上的数字代表了预测正确的数目,即True Positive+True Nagetiv ...

  6. 从零开始学习R语言(一)——数据结构之“向量”(Vector)

    本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/59688569 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/125370 ...

  7. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  8. R语言实现SOM(自组织映射)模型(三个函数包+代码)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SOM自组织映射神经网络模型 的R语言实现 笔 ...

  9. 【机器学习与R语言】12- 如何评估模型的性能?

    目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...

随机推荐

  1. Andirod——网络连接(HttpURLConnection)

    Android中使用HTTP协议访问网络的方法主要分为两种: 使用HttpURLConnection 使用HttpClient 本文主要内容是HttpURLConnection的使用. HttpURL ...

  2. C#点击按钮关闭当前窗体 打开另一个窗体。

    网上有很多是隐藏当前窗体,但是这样占用资源,效果不好,因此改进方法如下: private void button1_Click(object sender,EventArgs e) { this.hi ...

  3. soapUI测试webservice(参数为xml格式的处理方式)

    如果传递的是xml,要用<![CDATA[   ]]>将xml注释为字符串 示例 <?xml version="1.0" encoding="UTF-8 ...

  4. HDU 1535 Invitation Cards(最短路 spfa)

    题目链接: 传送门 Invitation Cards Time Limit: 5000MS     Memory Limit: 32768 K Description In the age of te ...

  5. Java Servlet完全教程

    Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servle ...

  6. 利用php制作简单的文本式留言板

    del.php 代码如下: <html><head ><meta charset="utf-8"><title>我的留言板</ ...

  7. C#网络编程基础知识

    C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...

  8. Chrome控制台 JS调试的一些小技巧

    $ $_命令返回最近一次表达式执行的结果,功能跟按向上的方向键再回车是一样的,但它可以做为一个变量使用在你接下来的表达式中. $0~$4则代表了最近5个你选择过的DOM节点.在页面右击选择审查元素,然 ...

  9. css3新增属性API

    写在前面:由于CSS5标准还未完全订下来,所以各种内核的浏览器都有自己的标准,为了不使属性混淆,所以各家在各自标准前加了一个前缀. -moz-  主要是firefox火狐 -webikt-主要是chr ...

  10. JavaWeb学习总结-06 Listener 学习和使用

    一 Listener 当Web应用在Web容器中运行时,Web应用内部会不断地发生各种事件:如Web应用被启动.Web应用被停止.用户session开始.用户session结束.用户请求到达等,可以用 ...