用kaggle 的 give me some credits数据集做一个MLP分类
一般情况下,风控评分卡是不会用到深度学习的,毕竟xgboost是风控算法的天花板。
本篇目的为方法的探索,与准确率(auc)的对比
#调包
library(keras)
#导入数据集
df <- read.csv("cs-training.csv",header = TRUE)
#去除不必要变量及变量重命名
df <- df[2:12]
colnames(df) <- c("y","x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
#看一下变量情况
summary(df)
#查看缺失
colSums(is.na(df))
#对x5用中位数填充
x5_mean <- mean(df$x5,na.rm =TRUE)
df[which(is.na(df$x5)),"x5"] <- x5_mean
#对x10用0填充
df[which(is.na(df$x10)),"x10"] <- 0
采用盖帽法,用1%处的数据覆盖分布在1%以下的数据,用99%处的数据覆盖分布在99%以上的数据。
这里的1%和99%取值有些片面,实际项目一般需要基于业务理解对其异常值进行处理,部分多分类变量需根据其实际意义进行处理
#定义切片,将上极值设为99%超出部分按照99%值计算,同理设置下极值
block<-function(x,lower=T,upper=T){
if(lower){
q1<-quantile(x,0.01)
x[x<=q1]<-q1
}
if(upper){
q99<-quantile(x,0.99)
x[x>q99]<-q99
}
return(x)
}
#运行盖帽
features <- c("x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
for (i in features){
df[i]=sapply(df[i],block)
}
神经网络对于特征的要求不高,
for (i in features){
df[i]=scale(df[i],center = TRUE, scale = TRUE)
}
##划分训练集与测试集,按照7:3比例
set.seed(1)
sub<-sample(1:nrow(df),round(nrow(df)*0.7))
length(sub)
train<-df[sub,]
test<-df[-sub,]
#将训练集与测试集矩阵化
x_train <- as.matrix(train[features])
y_train <- as.matrix(train$y)
x_test <- as.matrix(test[features])
y_test <- as.matrix(test$y)
# 创建模型
model <- keras_model_sequential()
# 定义连接损失函数、优化器和评估指标
model %>%
layer_dense(units = 64, activation = 'relu', input_shape = c(10)) %>%
layer_dropout(rate = 0.5) %>%
layer_dense(units = 64, activation = 'relu') %>%
layer_dropout(rate = 0.5) %>%
layer_dense(units = 1, activation = 'sigmoid') %>%
compile(
loss = 'binary_crossentropy',
optimizer = 'rmsprop',
metrics = metric_binary_accuracy
)
# 训练
model %>% fit(x_train, y_train, epochs = 20, batch_size = 128)
#测试集预测
score = model %>% evaluate(x_test, y_test, batch_size=128)
y_pred <- model %>% predict(x_test)
#绘制roc计算auc
library(pROC)
roc1 <- roc(y_test,y_pred,plot = TRUE, print.auc=TRUE)
神经网络的强大在于你几乎不用了解变量的实际意义就可以取得不错的训练成果,但在模型的部署上有很高的代价。
深度学习在互联网公司的反欺诈中有很重要的地位。
但大部分金融机构,尤其在申请,催收等场景中,更追求模型的稳定性,所以对变量的解释性与监控也是必不可少的。关于风控模型的稳定性及监控日后另开一章总结。