Keras深度学习:入门、实战与进阶
上QQ阅读APP看书,第一时间看更新

2.4.1 数据预处理

在构建分类模型之前,需要对数据进行预处理。将churn数据集从C50扩展包中加载到R会话内。我们可以删除state、area_code和account_length属性,因为这3个属性对分类特征没有贡献。

> ###  加载churn数据集 ###
> if(!require(C50)) install.packages("C50")
> data(churn)
> ###  数据预处理 ###
> # 删除state、area_code和account_length属性
> churnTrain <- churnTrain[,!colnames(churnTrain) %in% c('state','account_length','area_code')]
> churnTest <- churnTest[,!colnames(churnTest) %in% c('state','account_length','area_code')]

深度学习只能接收数值型矩阵或者数据框,所以我们需要对字符型变量的因子水平进行转换。international_plan、voice_mail_plan、churn属性属于字符型变量,因子水平均为yes、no。我们常用两种方法进行转换:第一种是直接用数字替换各属性中的类别,另一种是采用独热编码的方式生成只含0/1的数值型变量。因为这3个属性均为二分类,我们直接用第一种方式进行转换。

> # 将international_plan、voice_mail_plan、churn属性中的yes转换为1,no转换为0
> cat_var <- c('international_plan','voice_mail_plan', 'churn')
> churnTrain[cat_var] <- apply(churnTrain[cat_var],2,function(x){ifelse(x=='yes',1,0)})
> churnTest[cat_var] <- apply(churnTest[cat_var],2,function(x){ifelse(x=='yes',1,0)})

现在,churnTrain和churnTest数据集的17个属性均为数值型。接下来,我们先将数据集拆分为输入变量x和输出变量y。

> # 划分自变量x和因变量y
> x_train <- as.matrix(churnTrain[,colnames(churnTrain) != 'churn'])
> x_test <- as.matrix(churnTest[,colnames(churnTest) != 'churn'])
> y_train <- churnTrain$churn
> y_test <- churnTest$churn

因为输入变量各属性间数据差异比较大,对深度学习模型效果会造成影响,所以在入模前需要对各属性进行数据标准化处理。需要注意的是,我们需要先对训练集进行标准化处理,再利用训练集中各均值和标准差对测试集进行标准化处理。

> # 对训练集进行标准化
> x_train_scale <- scale(x_train)
> # 利用训练集的均值和标准差对测试集进行标准化
> col_means_train_scale <- attr(x_train_scale,"scaled:center")
> col_std_train_scale <- attr(x_train_scale,"scaled:scale")
> x_test_scale <- scale(x_test,center = col_means_train_scale,
+                       scale = col_std_train_scale)

至此,构建分类模型之前的数据预处理工作均已完成。接下来,我们先构建简单的深度学习模型,对比各种优化器的评估效果。