在本教程中,学习如何在R中执行深度学习任务
介绍
谁没有被技术进步所吸引,特别是人工智能方面的,从 Alexa 到特斯拉自驾车和无数其他创新?我每隔一天就对这些进步感到惊叹,但更有趣的是,当你知道这些创新的基础时。欢迎来到人工智能和深度学习的无尽可能性。如果你一直在想它是什么,那么你来对了。
在本教程中,我将解构术语并带你完成 R 中的深度学习任务。请注意,本文将假定您具有一些基本的机器学习概念,例如回归、分类和聚类。
让我们从一些围绕深度学习概念的术语的定义开始:
深度学习是机器学习的一个分支,它教授计算机模仿人脑的认知功能。这是通过使用人工神经网络来实现的,这些网络有助于解开数据集中的复杂模式。利用深度学习,计算机可以对声音、图像甚至文本进行分类。
在我们深入了解深度学习的具体内容之前,了解机器学习和人工智能是什么以及这三个概念之间的关系将是很好的事情。
人工智能:这是计算机科学的一个分支,涉及开发其功能模仿人脑的机器。
机器学习:这是人工智能的一个子集,使计算机能够从数据中学习。
通过以上定义,我们现在了解了深度学习如何与人工智能和机器学习相关。
下面的图表将有助于展示这种关系。
关于深度学习的两个关键点是:
- 需要大量的数据
- 需要高性能计算能力
神经网络
这些是深度学习模型的构建块。顾名思义,神经的单词来自于神经元,就像人脑的神经元一样。实际上,深度神经网络的架构从人脑的结构中得到启发。
神经网络具有输入层、一个隐藏层和一个输出层。这个网络被称为浅层神经网络。当我们有多个隐藏层时,它变成了深度神经网络,其中的层数可以多达 100 多层。
下面的图像显示了神经网络的样子。
这就带我们来到如何在 R 中构建深度学习模型的问题?这就是 keras!
Keras 是一个开源的深度学习库,可以使神经网络在机器学习中易于使用。该库是使用 TensorFlow 作为后端引擎的包装器。但是,还有其他后端选项,如 Theano 或 CNTK。
现在让我们安装 TensorFlow 和 Keras。
首先使用 reticulate 创建虚拟环境
library(reticulate)
virtualenv_create("virtualenv", python = "/path/to/your/python3")
install.packages(“tensorflow”) #This is only done once!
library(tensorflow)
install_tensorflow(envname = "/path/to/your/virtualenv", version = "cpu")
install.packages(“keras”) #do this once!
library(keras)
install_keras(envname = "/path/to/your/virtualenv")
# confirm the installation was successful
tf$constant("Hello TensorFlow!")
现在,我们的配置已经设置好了,我们可以开始了解如何使用深度学习来解决分类问题。
数据简介
我将在本教程中使用的数据来自 https://www.askamanager.org 的正在进行的薪资调查。
表单中主要的问题是你赚多少钱,再加上一些更多的细节,例如行业、年龄、经验年限等。细节被收集到一个 Google 表格中,我从中获取了数据。
我们想用数据解决的问题是能够提供一个深度学习模型,预测一个人在年龄、性别、工作年限和最高教育水平等信息的基础上可能赚多少钱。
加载我们所需的库。
library(dplyr)
library(keras)
library(caTools)
导入数据
url <- “https://raw.githubusercontent.com/oyogo/salary_dashboard/master/data/salary_data_cleaned.csv”
salary_data <- read.csv(url)
选择我们需要的列
salary_data <- salary_data %>% select(age,professional_experience_years,gender,highest_edu_level,annual_salary)
数据清洗
还记得计算机科学中的GIGO概念吗?(垃圾进垃圾出)。好吧,这个概念在这里和其他领域一样适用。我们的训练结果在很大程度上取决于我们使用的数据质量。这就带来了数据清洗和转换,这是任何数据科学项目的关键步骤。
数据清洗旨在解决的一些关键问题包括:一致性、缺失值、拼写问题、异常值和数据类型。我不会详细介绍如何解决这些问题,这是为了不想偏离本文的主题。因此,我将使用数据的清理版本,但如果您有兴趣了解如何处理清理部分,请查看此文章。
数据转换
人工神经网络只接受数字变量,因此,我们需要将某些分类变量编码为数字。这就是数据预处理步骤的一部分,它是必要的,因为往往情况下,您不会得到准备好进行建模的数据。
# 创建编码器函数
encode_ordinal <- function(x, order = unique(x)) {
x <- as.numeric(factor(x, levels = order, exclude = NULL))
}
salary_data <- salary_data %>% mutate(
highest_edu_level = encode_ordinal(highest_edu_level, order = c("高中","学士学位","硕士学位","职业学位(MD、JD等)","博士学位")),
professional_experience_years = encode_ordinal(professional_experience_years,
order = c("1年或更少", "2-4年","5-7年", "8-10年", "11-20年", "21-30年", "31-40年", "41年或更多")),
age = encode_ordinal(age, order = c( "18岁以下", "18-24岁","25-34岁", "35-44岁", "45-54岁", "55-64岁","65岁或以上")),
gender = case_when(gender== "女" ~ 0,
gender == "男" ~ 1))
由于我们想解决分类问题,因此需要将年薪分为两个类别,以便将其作为响应变量。
salary_data <- salary_data %>%
mutate(categories = case_when(
annual_salary <= 100000 ~ 0,
annual_salary > 100000 ~ 1))
salary_data <- salary_data %>% select(-annual_salary)
拆分数据
与基本的机器学习方法——回归、分类和聚类一样,我们需要将数据拆分为训练集和测试集。我们使用80-20规则进行拆分,即80%的数据集用于训练,20%的数据集用于测试。这并不是铁板一块,您可以根据需要使用任何拆分比例,但请记住,训练集的比例应占大部分。
set.seed(123)
sample_split <- sample.split(Y = salary_data$categories, SplitRatio = 0.7)
train_set <- subset(x=salary_data, sample_split == TRUE)
test_set <- subset(x = salary_data, sample_split == FALSE)
y_train <- train_set$categories
y_test <- test_set$categories
x_train <- train_set %>% select(-categories)
x_test <- test_set %>% select(-categories)
Keras以矩阵或数组的形式输入。我们使用as.matrix函数进行转换。此外,我们需要对预测变量进行缩放,然后将响应变量转换为分类数据类型。
x <- as.matrix(apply(x_train, 2, function(x) (x-min(x))/(max(x) - min(x))))
y <- to_categorical(y_train, num_classes = 2)
实例化模型
使用管道运算符创建顺序模型并向其中添加层。
model = keras_model_sequential()
配置层
input_shape指定输入数据的形状。在我们的情况下,我们使用ncol
函数获得了它。 activation: 这里我们指定激活函数;一种在将输出传递到下一层之前将其转换为所需非线性格式的数学函数。
units:神经网络每层中的神经元数。
model %>%
layer_dense(input_shape = ncol(x), units = 10, activation = "relu") %>%
layer_dense(units = 10, activation = "relu") %>%
layer_dense(units = 2, activation = "sigmoid")
配置模型学习过程
我们使用compile方法来完成此操作。该函数需要三个参数;
optimizer:该对象指定训练过程。 loss:优化期间要最小化的函数。可用选项为mse(均方误差),binary_crossentropy和categorical_crossentropy。
metrics:我们用来监视训练的内容。分类问题的准确性。
model %>%
compile(
loss = "binary_crossentropy",
optimizer = "adagrad",
metrics = "accuracy"
)
模型拟合
现在,我们可以使用Keras的fit方法来拟合模型。fit方法接受的一些参数是:
epochs:对训练数据集进行迭代的次数。
batch_size:模型将将传递给它的矩阵/数组分成较小的批次,然后在训练期间迭代每个批次。
validation_split:Keras需要切分训练数据的一部分以获得用于评估每个时期的模型性能的验证集。
shuffle:这里你可以指示是否在每个时期之前对训练数据进行洗牌。
fit = model %>%
fit(
x = x,
y = y,
shuffle = T,
validation_split = 0.2,
epochs = 100,
batch_size = 5
)
评估模型
要获取模型的准确性值,请使用以下evaluate函数。
y_test <- to_categorical(y_test, num_classes = 2)
model %>% evaluate(as.matrix(x_test),y_test)
预测
要在新数据上进行预测,请使用keras库中的predict_classes函数,如下所示。
model %>% predict(as.matrix(x_test))
结论
本文已经带您了解了使用Keras在R中进行深度学习的基础知识。欢迎深入了解,尝试调整参数,亲手进行数据准备,并利用云计算的强大性能来扩展计算。 Clinton Oyogo是Saturn Cloud的作家,他认为分析数据以获得可操作的见解是他日常工作的重要组成部分。凭借他在数据可视化,数据整理和机器学习方面的技能,他以数据科学家的身份为自己的工作感到自豪。
原文,已获得许可。