R语言keras实现MLP二分类(风控金融诈骗识别)

背景:

用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)

基于keras构建神经网络,并进行训练



# 创建模型
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)

由于数据集比较简单loss早早开始收敛
在这里插入图片描述

#测试集预测
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)

在这里插入图片描述

结论

神经网络的强大在于你几乎不用了解变量的实际意义就可以取得不错的训练成果,但在模型的部署上有很高的代价。
深度学习在互联网公司的反欺诈中有很重要的地位。
但大部分金融机构,尤其在申请,催收等场景中,更追求模型的稳定性,所以对变量的解释性与监控也是必不可少的。关于风控模型的稳定性及监控日后另开一章总结。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是基于Keras实现ResNet实现图像二分类的代码: ```python import tensorflow as tf from tensorflow import keras def resnet_block(inputs, num_filters=16, kernel_size=3, strides=1, activation='relu', batch_normalization=True, conv_first=True): conv = keras.layers.Conv2D(num_filters, kernel_size=kernel_size, strides=strides, padding='same', kernel_initializer='he_normal', kernel_regularizer=keras.regularizers.l2(1e-4)) x = inputs if conv_first: x = conv(x) if batch_normalization: x = keras.layers.BatchNormalization()(x) if activation is not None: x = keras.layers.Activation(activation)(x) else: if batch_normalization: x = keras.layers.BatchNormalization()(x) if activation is not None: x = keras.layers.Activation(activation)(x) x = conv(x) return x def resnet_v1(input_shape, depth, num_classes=2): if (depth - 2) % 6 != 0: raise ValueError('Depth must be 6n + 2 (e.g. 20, 32, 44).') num_filters = 16 num_res_blocks = int((depth - 2) / 6) inputs = keras.Input(shape=input_shape) x = resnet_block(inputs=inputs) for stack in range(3): for res_block in range(num_res_blocks): strides = 1 if stack > 0 and res_block == 0: strides = 2 y = resnet_block(inputs=x, num_filters=num_filters, strides=strides) y = resnet_block(inputs=y, num_filters=num_filters, activation=None) if stack > 0 and res_block == 0: x = resnet_block(inputs=x, num_filters=num_filters, kernel_size=1, strides=strides, activation=None, batch_normalization=False) x = keras.layers.add([x, y]) x = keras.layers.Activation('relu')(x) num_filters *= 2 x = keras.layers.AveragePooling2D(pool_size=8)(x) y = keras.layers.Flatten()(x) outputs = keras.layers.Dense(num_classes, activation='softmax', kernel_initializer='he_normal')(y) model = keras.Model(inputs=inputs, outputs=outputs) return model input_shape = (32, 32, 3) depth = 20 model = resnet_v1(input_shape=input_shape, depth=depth, num_classes=2) model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(), metrics=['accuracy']) ``` 这里采用了ResNet20的结构,输入图片大小为32x32,输出为二分类。你可以根据自己的需求进行修改。同时,需要注意数据集的准备和预处理,以及模型的训练和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值