R语言 用Caret实现机器学习

R语言 用Caret实现机器学习

在当今社会,人类问题的技术答案正在敲开几乎所有知识领域的大门。这个宇宙的日常运作的每一个方面都会产生数据,而技术解决方案则以这些数据驱动的直觉为基础进行决策。为了创造一个能从获得的数据中学习并能解决上述人类问题的机器,机器学习的算法和方法在这种状态下出现了。 那么,究竟什么是机器学习?

使用数学和统计模型从数据中学习做某项任务而不被给予指示的计算机系统,被称为机器学习。

在这篇文章中,我们将研究基本的机器学习思想、方法,以及利用R编程语言的Caret库来逐步开发机器学习模型的过程。

据此,我们可以将机器学习算法分为两类。

  • 监督学习 :它处理标记的数据或预测的目的。
  • 无监督学习 :它处理的是未标记的数据或描述性的原因。

根据目标和可用数据,人们可以选择这两种算法中的一种。

使用R的机器学习的步骤

为了获得预期的结果,数据科学中的问题必须被分解成可管理的任务。在这一部分中,我们将使用免费开源的Caret包,走过在R中实现机器学习的每一步。在任何机器学习项目中,需要遵循的一般步骤是 。

  • 数据收集和导入
  • 探索性数据分析(EDA)
  • 数据预处理
  • 模型训练和评估

让我们开始编写代码。

数据收集和导入

为了建模,应该收集机器学习数据并将其导入R环境中。这些数据集可能是以电子方式记录在文本或电子表格、SQL数据库或两者兼而有之。为了开始工作,你必须将数据集导入R环境中。然而,为了开始我们本教程的任务,我们将从R数据集包中导入数据。首先安装并导入我们的项目所需的所有先决库。

这些库包括:

  • ggplot2 : 它用于交互式图形和可视化。
  • ggpubr : 它用于使我们的绘图与ggplot2的绘图一样漂亮。
  • reshape : 它用于融化我们的数据集。
  • caret:它用于为我们提供机器学习算法。
# To install packages 
install.packages("ggplot2")
install.packages("ggpubr")
install.packages("reshape")
install.packages("caret")
R

安装完毕后,让我们加载必要的软件包。

# To load all necessary packages
library(ggplot2)
library(ggpubr) 
library(reshape)
library(caret)
R

接下来,我们将把我们的数据导入到R环境中。

# Dataset
data("iris")
  
# To display the first five 
# rows of our data
head(iris)
R

输出:

在R中用Caret实现机器学习

我们可以使用tail(iris)来查看最下面的5行。 如果你想查看超过5行,只需在括号内输入一个数字,例如head(iris, 10)或tail(iris, 10)。

# To see the last five rows 
# of our data
tail(iris)
R

输出

在R中用Caret实现机器学习

探索性数据分析(EDA)

了解和评估你的项目所拥有的数据是建模准备过程中的重要步骤之一。这是通过使用数据探索、可视化,以及用中心趋势的衡量标准进行统计数据总结来完成的。在这个阶段,你将获得对你的数据的理解,你将对其进行广泛的观察,为建模步骤做好准备。

# Summary statistics of data
summary(iris)
R

输出

在R中用Caret实现机器学习

# Visualizing the outliers by using boxplot
# As we use ggplot2 we will take numerical 
# variables by subsetting the entire of it
df <- subset(iris, select = c(Sepal.Length, 
                              Sepal.Width, 
                              Petal.Length, 
                              Petal.Width))
R

通过使用reshape软件包,我们将数据融化并绘制出来,以检查是否存在任何异常值。因此,当我们执行以下代码时。

# plot and see the box plot of each variable
ggplot(data = melt(df), 
       aes(x=variable, y=value)) + 
        geom_boxplot(aes(fill=variable))
R

输出

在R中用Caret实现机器学习

我们可以看到,在数据集的第二列有一个异常值。

# To plot the barplot for our 
# categorical variable
ggplot(data = iris, 
       aes(x = Species, fill = Species)) +
    geom_bar()
R

输出

在R中用Caret实现机器学习

现在让我们用直方图来显示我们数据的连续变量的分布。

# In this we visualize the histogram of all 
# numerical variables of the dataset
a <- ggplot(data = iris, aes(x = Petal.Length)) +
    geom_histogram( color = "red", 
                   fill = "blue", 
                   alpha = 0.01) + geom_density()
  
b <- ggplot(data = iris, aes(x = Petal.Width)) +
    geom_histogram( color = "red", 
                   fill = "blue", 
                   alpha = 0.1) + geom_density()
c <- ggplot(data = iris, aes(x = Sepal.Length)) +
    geom_histogram( color = "red", 
                   fill = "blue", 
                   alpha = 0.1) + geom_density()
  
d <- ggplot(data = iris, aes(x = Sepal.Width)) +
    geom_histogram( color = "red", 
                   fill = "blue", 
                   alpha = 0.1) +geom_density()
  
ggarrange(a, b, c, d + rremove("x.text"), 
          labels = c("a", "b", "c", "d"),
          ncol = 2, nrow = 2)
R

输出:

在R中用Caret实现机器学习

柱状图

接下来,我们将进入机器学习过程的数据准备阶段。 在此之前,让我们把数据集分成训练区、测试区和验证区。

# Create train-test split of the data 
limits <- createDataPartition(iris$Species, 
                              p=0.80, 
                              list=FALSE)
  
# select 20% of the data for validation
testiris <- iris[-limits,]
  
# use the remaining to training 
# and testing the models
trainiris <- iris[limits,]
R

数据预处理

我们从模型中得到的良好预测的质量取决于数据本身的质量,因此数据准备是机器学习中最重要的步骤之一。数据和我们要做的工作完全决定了它所需要的时间、方法以及数据的净化和转化为相关输入之一的过程。在这里,我们将研究如何为我们的建模进行数据准备。

我们可以从箱形图中看到,我们的数据中有离群值,直方图也显示了数据在左右两边的倾斜程度。因此,我们将从我们的数据中消除这些离群值。

Q <- quantile(trainiris$Sepal.Width, 
              probs=c(.25, .75), 
              na.rm = FALSE)
R

在获得四分位值后,我们将额外计算四分位数范围,以确定上界和下界的截止值。

# Code to calculate the IQR, 
# upper and lower bounds
iqr <- IQR(trainiris$Sepal.Width)
up <-  Q[2]+1.5*iqr 
low<- Q[1]-1.5*iqr
R

现在,我们可以通过使用以下代码来消除异常值。

# Elimination of outliers by using of iqr
normal <- subset(trainiris, 
                 trainirisSepal.Width>(Q[1] - 1.5*iqr) 
                 & trainirisSepal.Width < (Q[2]+1.5*iqr))
normal
R

输出:

在R中用Caret实现机器学习

通过使用boxplot,我们可以额外看到从数据中消除的异常值。

# boxplot using cleaned dataset
boxes <- subset(normal, 
                select = c(Sepal.Length, 
                           Sepal.Width, 
                           Petal.Length, 
                           Petal.Width))
ggplot(data = melt(boxes), 
       aes(x=variable, y=value)) + 
        geom_boxplot(aes(fill=variable))
R

输出

在R中用Caret实现机器学习

模型训练和评估

现在是时候使用准备好的数据来创建一个模型了。由于我们心中没有特定的算法,让我们比较两种机器学习方法的实用性,并选择表现最好的一种。

  • 线性判别分析(LDA)
  • 支持向量机(SVM)。

对于所有样本的准确性和预测,我们将采用10倍交叉验证。

# crossvalidation set to 10
crossfold  <- trainControl(method="cv", 
                           number=10, 
                           savePredictions = TRUE)
metric <- "Accuracy"
R

让我们开始用线性判别分析训练模型。

# Set a random seed to 42
set.seed(42) 
fit.lda <- train(Species~., 
                 data=trainiris, 
                 method="lda", 
                 metric=metric,
                 trControl=crossfold)
print(fit.lda)
R

输出:

在R中用Caret实现机器学习

我们也可以使用SVM模型进行训练。为了训练支持向量机,下面给出了代码。

set.seed(42)
fit.svm <- train(Species~., 
                 data=trainiris, 
                 method="svmRadial", 
                 metric=metric,
                 trControl=crossfold)
print(fit.svm)
R

输出

在R中用Caret实现机器学习

结果显示,两种算法的功能都是令人钦佩的,只有微小的变化。虽然可以调整模型以提高其准确度,但为了本课的目的,让我们坚持使用LDA并使用测试数据生成预测。

# prediction on test data
predictions <- predict(fit.lda, testiris)
confusionMatrix(predictions, testiris$Species)
R

输出:

在R中用Caret实现机器学习

根据我们上面的模型总结,我们看到预测性能很差;这可能是因为我们忽略了LDA算法的前提,即预测变量应该具有相同的方差,这是通过缩放这些特征来完成的。我们不会偏离本课的主题,因为我们对利用R中的Caret模块来开发机器学习感兴趣。

结论

总之,这是对R语言中用于机器学习的Caret库最基本和最入门的介绍。从这里开始,你可以利用这个简单的介绍作为起点,开始自己的项目工作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册