使用R的caret对银行定期存款订阅进行分类
R是一种统计计算、可视化和通用计算的免费开源编程语言和软件环境。R有着活跃的社区和数据科学生态系统,R是数据工作者常使用的工具和语言。数据人网R语言栏目提供了许多R与数据科学的优质内容。
在实际工作中,我使用R语言做过数据可视化,信用评分卡,数据分析和机器学习等事情,深感R语言功能的强大,便捷和有效。玩好数据和洞见数据,以利用数据中的模式,知识和规则,R是一个得力的帮手。
本文源自一篇英文文章,我将其翻译,一是,因为它是一个端到端的机器学习项目,介绍了利用R解决机器学习问题的一种典型解决方案;二是,它所解决的实际问题与我当前的工作紧密相关,我当前是在金融科技行业从事数据和模型的工作,以解决风控和营销等相关问题集。
作者: Derrick Mwiti
原文链接:
https://www.kdnuggets.com/2019/02/caret-r-classify-term-deposit-subscriptions-bank.html

在本文中,我们将使用来自葡萄牙银行机构的直接营销活动数据来预测客户是否会订阅定期存款。我们将与R的caret包起工作来实现这一点。
虽然不建议将此示例应用于实际的业务场景,但它可以作为解决此类问题的指南。将其应用于实际场景将需要在营销和银行部门进行一些调整和领域专业知识。
在深入讨论之前,让我们先看看官方文档是如何描述caret包。
caret包(_C_lassification _A_nd _RE_gression _T_raining的缩写)是一组函数,它们试图简化创建预测模型的过程。这个包包含以下工具:
数据分割
预处理
特征选择
使用重采样进行模型调优
变量重要性估计
以及其他函数。
r中有许多不同的建模函数,有些函数有不同的模型训练和/或预测语法。这个包一开始是作为一种方法提供函数本身的统一接口,以及一种标准化常见任务(例如参数调优和变量重要性)的方法。
当前的版本可以在CRAN上找到,项目托管在GitHub上。
这个包类似于用Python实现机器学习函数的Scikit-learn包。在R和Python中不使用这些包也可以工作。然而,Caret和Scikit-learn简化了应用机器学习算法的过程。
装载数据
我们将使用Tidyverse中的read_table实用函数加载数据集。我们指定头和分号作为分隔符。
library(tidyverse)
df <- read_table("bank-full.csv", sep=";", header=T)
列的完整描述可以在这里找到。我们可以快速检查数据集的头部。需要注意的重要事情是我们要预测的y列,这列指示客户是否订阅定期存款。

R有一个名为DataExplorer的包,它使我们能够快速探索数据集。如果您没有本文中提到的任何包,只需使用install.packages(“package name”)
命令安装它们。
使用introduction
函数,我们可以看到列、行和缺失值的数量:
library(DataExplorer)
introduce(df)

在深入研究机器学习之前,我们有时需要绘制一些图表,以便对数据集有一个大致的了解。DataExplorer
提供了一个函数来绘制所有这些图。
plot_bar(df)
快速浏览一下图表,我们就会发现大部分的顾客都是蓝领工人,而且已婚。

one-hot编码
我们之前注意到我们的一些列是类别的。为了在机器学习模型中使用它们,我们必须将它们转换为虚拟变量。这将涉及到将它们转换为0和1。
为了避免虚拟变量陷阱,我们还必须去掉第一个虚拟变量。
所以我们通常保留N-1个虚拟变量。例如,我们不需要一列同时包含男性和女性,我们想要一列,即1表示男性,0表示女性,反之亦然。
R有几个包,可以用来将列转换为虚拟变量。在这种情况下,我们将使用fastDummies
包。我们使用dummy_cols
进行转换,并将remove_first_dummy
指定为TRUE,以避免虚拟变量陷阱。
library(fastDummies)
dummy_data <- fastDummies::dummy_cols(df,remove_first_dummy = TRUE)
接下来,我们选择将在机器学习模型中使用的列。我们通过指定要保存在变量中的列来实现这一点,然后使用这些列进行选择。
keep <- c("age","day","balance","campaign","pdays","job_entrepreneur","job_blue-collar","job_unknown","job_retired","job_admin.","job_services", "job_self_employed","job_unemployed","job_housemaid","job_student","marital_single","marital_divorced","education_secondary","education_primary","default_yes","housing_no","loan_yes","contact_cellular","contact_telephone","month_jun","month_jul", "month_aug","month_oct","month_nov","month_dec","month_jan","month_feb","month_mar","month_apr","month_sep","poutcome_failure","poutcome_other","poutcome_success","y_yes")
final <- dummy_data[keep]
如果我们检查数据集的头部,我们会注意到每一列现在都是数值的。现在,我们准备进入下一步,使用caret来构建机器学习模型。
使用caret构建模型
我们首先导入caret包,以便访问它的函数。正如我们在开始时看到的,caret是R中的包,它封装了大多数机器学习函数,因此更容易应用它们。
library(caret)
现在我们需要将数据集拆分为一个训练和测试集。caret使我们能够使用createDataPartition
函数来实现这一点。这个函数创建一系列的训练和测试分区。我们首先创建一个索引,该索引将基于标签拆分数据集。我们指定70%的训练集和30%的测试集。list指定结果应该是列表还是矩阵。
index <- createDataPartition(final$y_yes, p=0.7, list=FALSE)
下一步是使用该索引对数据进行子集,以获得训练和测试集。
final.training <- final[index,]
final.test <- final[-index,]
X_train <- final.training[, 1:38]
y_train <- as.factor(final.training[, 39])
X_test <- final.test[, 1:38]
y_test <- as.factor(final.test[, 39])
就像Python中的Scikit-lear
n包一样,R中的caret
库使数据适合机器学习模型变得非常容易。你所要做的就是调用train
函数并指定机器学习方法。要查看所有可用的方法,可以运行以下命令names(getModelInfo())
names(getModelInfo())

现在让我们进入训练部分。由于这是一个分类问题,我们必须使用一个分类算法。在这种情况下,我们使用的是强化逻辑回归。然而,我们可以通过简单地改变方法来试验其他算法。在尝试了一些算法之后,我们可以选择精度最高的算法。我们通过使用preprocess
属性对数据进行缩放和中心化来对其进行预处理。
model_classy <- train(X_train, y_train, method='LogitBoost',preProcess=c("center", "scale"))
如果我们能够看到模型中最重要的特性,那就太好了。caret提供了一个varImp
函数,该函数的输出用于绘制特征重要性图,从而简化了这一过程。
feature_importance <- varImp(model_classy, scale=FALSE)
plot(feature_importance)

现在让我们继续使用上面定义的模型进行预测。预测是通过从插入符号调用predict
函数来完成的简单任务。一旦预测就绪,我们就可以使用confusionMatrix
函数来计算混淆矩阵。这也将向我们展示模型的准确性。
predictions<-predict(object=model_classy,X_test)
table(predictions)
confusionMatrix(predictions,y_test)

显然,在R中应用机器学习就像使用Python的Scikit-learn一样简单。你可以从它的文档中了解caret,在这里可以找到:
caret包官方文档
caret包|R文档
你热爱生命吗?那么别浪费时间,因为时间是组成生命的材料。——富兰克林
内容推荐
我是数据人王路情,专注于从数据中学习。
我们创建数据人网http://shujuren.org,它是数据人的家园,一个数据人学习,交流和分享的场所。欢迎您,大家一起来创造和分享数据知识,共建和共享数据智库,为智能化社会助力。
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!