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