用TensorFlow2.x对银行贷款拖欠数据分析

实验一

书上是利用scikit-learn对这个数据进行逻辑回归分析。
它先使用了稳定性选择方法中的随机逻辑回归进行特征筛选,只保留了有效特征为“工龄,地址,负债单,信用卡负债”,然后利用筛选后的特征建立逻辑回归模型。得出的模型平均正确率为81.4%。

部分数据如下:
在这里插入图片描述
前8列是特征,后一列是标签,这是二分类问题。

实验二

但我使用tf2.0中的Keras构造3层全连接神经网络,求解这个2分类问题。
不做特征选择,把所有的8列数据都作为特征处理。这里应该使用k倍交叉验证,但我仅仅把前600个数据作为训练,后面100个数据作为测试。
代码如下:

import pandas as pd
import tensorflow as tf
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, callbacks

data = pd.read_excel('data/bankloan.xls')
x_train = data.iloc[:600, :8].values
y_train = data.iloc[:600, 8].values

x_test = data.iloc[600:, :8].values
y_test = data.iloc[600:, 8].values

model = Sequential([layers.Dense(20, activation='relu', input_shape=(8,)),
                    layers.BatchNormalization(),
                    layers.Dropout(0.2),
                    layers.Dense(10, activation='relu'),
                    layers.BatchNormalization(),
                    layers.Dropout(0.2),
                    layers.Dense(1, activation='sigmoid')])

model.summary()

model.compile(optimizer=optimizers.Adam(lr=0.001),
              loss=tf.losses.binary_crossentropy,
              metrics=['acc'])

model.fit(x_train, y_train, epochs=500, validation_data=[x_test, y_test], validation_freq=1, )

test_scores = model.evaluate(x_test, y_test)
print('test loss:', test_scores[0])
print('test accuracy:', test_scores[1])

结果:

 32/600 [>.............................] - ETA: 0s - loss: 0.3782 - acc: 0.8438
352/600 [================>.............] - ETA: 0s - loss: 0.3360 - acc: 0.8523
600/600 [==============================] - 0s 187us/sample - loss: 0.3779 - acc: 0.8217 - val_loss: 0.4308 - val_acc: 0.8200

100/1 [==========] - 0s 110us/sample - loss: 0.2696 - acc: 0.8200
test loss: 0.43078328013420103
test accuracy: 0.82

实验正确率为82%。比原书处理还好,且没有所谓复杂的特征处理,因为神经网络会对那些不重要的特征设置小的权值,这样这些特征在训练后,对结果的影响就不大了,相当于神经网络训练时就自动进行了特征处理了。

实验三

我也提取了有效特征,“工龄,地址,负债单,信用卡负债”,把这些列作为数据进行训练。
在这里插入图片描述
代码:

import pandas as pd
import tensorflow as tf
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, callbacks

data = pd.read_excel('data/bankloan.xls')
# x_train = data.iloc[:600, :8].values
# y_train = data.iloc[:600, 8].values
#
# x_test = data.iloc[600:, :8].values
# y_test = data.iloc[600:, 8].values
x_train = data.iloc[:600, [2, 3, 5, 6]].values
y_train = data.iloc[:600, 8].values

x_test = data.iloc[600:, [2, 3, 5, 6]].values
y_test = data.iloc[600:, 8].values

model = Sequential([layers.Dense(20, activation='relu', input_shape=(4,)),
                    layers.BatchNormalization(),
                    layers.Dropout(0.2),
                    layers.Dense(10, activation='relu'),
                    layers.BatchNormalization(),
                    layers.Dropout(0.2),
                    layers.Dense(1, activation='sigmoid')])

model.summary()

model.compile(optimizer=optimizers.Adam(lr=0.001),
              loss=tf.losses.binary_crossentropy,
              metrics=['acc'])

model.fit(x_train, y_train, epochs=500, validation_data=[x_test, y_test], validation_freq=1, )

test_scores = model.evaluate(x_test, y_test)
print('test loss:', test_scores[0])
print('test accuracy:', test_scores[1])

结果:

32/600 [>.............................] - ETA: 0s - loss: 0.3388 - acc: 0.8438
320/600 [===============>..............] - ETA: 0s - loss: 0.3685 - acc: 0.8313
600/600 [==============================] - 0s 208us/sample - loss: 0.3974 - acc: 0.8133 - val_loss: 0.4915 - val_acc: 0.8200

100/1 [=============================] - 0s 90us/sample - loss: 0.3084 - acc: 0.8200
test loss: 0.4914902698993683
test accuracy: 0.82

实验三结果和实验二结果没什么区别,这也证明了,在训练时神经网络会自动把那些对结果影响小的特征给小的权重。

所以利用神经网络对数据进行处理,不用进行特征的筛选,只需要在网络模型中利用好正则化和dropout,神经网络会自动处理这些数据,得出的很好的结果。

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/weixin_45092662。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值