打破传统授信模型:基于深度神经网络 DNN模型的精确额度计算方法
深度神经网络(Deep Neural Network, DNN),该模型通过 Keras 和 TensorFlow 构建,包含多个全连接层(Dense Layer)和 Dropout 层,以此来减少过拟合。具体的网络结构如下:
模型结构概览
输入层:接收输入特征的数据。输入层的节点数与特征数量一致,这里是 4 个特征(income、debt、credit_history、age)。
隐藏层:
第 1 层:128 个神经元,激活函数为 ReLU(Rectified Linear Unit)。
第 2 层:64 个神经元,激活函数为 ReLU。
第 3 层:32 个神经元,激活函数为 ReLU。
每层后面都有一个 Dropout 层,用于减少过拟合,设置的 dropout 比例为 20%(即保留 80% 的神经元,丢弃 20%)。
输出层:最终的输出是单个数值,代表预测的贷款额度,因此只有一个神经元,且没有激活函数(直接输出回归值)。
我们将使用 Keras 和 TensorFlow 来构建和训练模型,涉及的数据处理步骤包括:
数据预处理
特征工程
深度神经网络模型的构建
模型训练和调参
模型评估
最终的额度计算
深度学习模型实现代码
1. 导入必要的库
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping
import seaborn as sns
2. 加载数据
假设我们的数据集包含一些基本的客户信息,包括收入、负债、信用历史等。
python
# 模拟加载数据(在实际使用中,数据通常来自CSV、数据库等)
data = pd.read_csv('customer_data.csv')
# 查看数据概况
print(data.head())
假设数据集包含以下字段:
income: 年收入(万元)
debt: 当前负债(万元)
credit_history: 信用历史(0表示无不良记录,1表示有不良记录)
age: 年龄
loan_amount: 贷款额度(目标变量)
3. 数据预处理
进行缺失值处理、异常值处理和数据标准化。
python
# 检查缺失值
print(data.isnull().sum())
# 填充缺失值
data.fillna(data.mean(), inplace=True)
# 异常值处理(使用Z-score剔除异常值)
from scipy import stats
z_scores = np.abs(stats.zscore(data.select_dtypes(include=[np.number])))
data_no_outliers = data[(z_scores < 3).all(axis=1)]
# 查看处理后的数据
print(data_no_outliers.describe())
# 标准化特征
features = ['income', 'debt', 'credit_history', 'age']
X = data_no_outliers[features]
y = data_no_outliers['loan_amount']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
4. 构建深度神经网络模型
使用 Keras 构建一个深度神经网络。该网络将包含多个全连接层、激活函数以及 dropout 层来防止过拟合。
python
# 构建深度神经网络模型
model = Sequential()
# 输入层和第一层隐藏层
model.add(Dense(128, input_dim=X_scaled.shape[1], activation='relu'))
model.add(Dropout(0.2))
# 第二层隐藏层
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
# 第三层隐藏层
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
# 输出层
model.add(Dense(1))
# 编译模型
model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error')
5. 模型训练与调参
在这里,我们设置一个 EarlyStopping 回调,防止训练过程中发生过拟合。
python
# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# 训练模型
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=200, batch_size=32, validation_split=0.2, callbacks=[early_stopping], verbose=1)
6. 模型评估
使用测试集来评估模型的性能。这里我们使用均方误差 (MSE) 和均方根误差 (RMSE)。
python
# 模型评估
y_pred = model.predict(X_test)
# 计算评估指标
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f'Mean Squared Error: {mse:.4f}')
print(f'Root Mean Squared Error: {rmse:.4f}')
# 可视化真实值与预测值的对比
plt.scatter(y_test, y_pred)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title('True vs Predicted Loan Amounts')
plt.show()
7. 可视化训练过程
通过绘制训练过程中的损失曲线,来分析模型的训练表现。
python
# 绘制训练过程中的损失曲线
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Model Loss During Training')
plt.legend()
plt.show()
- 额度计算
根据模型预测的贷款额度,可以计算每个客户的授信额度。
python
# 基于模型预测结果计算授信额度
loan_predictions = model.predict(X_test)
# 显示前10个客户的授信额度预测
for i in range(10):
print(f"Customer {i+1}: Predicted Credit Limit: {loan_predictions[i][0]:.2f}元")
9. 完整代码
将前述步骤结合在一起,以下是整个银行授信额度模型的完整代码。
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping
import seaborn as sns
from scipy import stats
# 加载数据
data = pd.read_csv('customer_data.csv')
print(data.head())
# 数据预处理
data.fillna(data.mean(), inplace=True)
z_scores = np.abs(stats.zscore(data.select_dtypes(include=[np.number])))
data_no_outliers = data[(z_scores < 3).all(axis=1)]
print(data_no_outliers.describe())
# 标准化特征
features = ['income', 'debt', 'credit_history', 'age']
X = data_no_outliers[features]
y = data_no_outliers['loan_amount']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 构建深度神经网络模型
model = Sequential()
model.add(Dense(128, input_dim=X_scaled.shape[1], activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))
model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error')
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# 训练模型
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=200, batch_size=32, validation_split=0.2, callbacks=[early_stopping], verbose=1)
# 评估模型
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f'Mean Squared Error: {mse:.4f}')
print(f'Root Mean Squared Error: {rmse:.4f}')
# 可视化训练过程
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Model Loss During Training')
plt.legend()
plt.show()
# 显示预测结果
for i in range(10):
print(f"Customer {i+1}: Predicted Credit Limit: {y_pred[i][0]:.2f}元")
这个深度神经网络模型通过多个隐藏层(128、64、32 个神经元),每层使用 ReLU 激活函数,并且使用 Dropout 防止过拟合。通过 Adam 优化器和 均方误差 损失函数进行训练,最终用于预测银行授信额度。这个模型能够处理复杂的非线性关系,并且适应大规模数据集。在实际银行信用评估中,深度神经网络可以通过学习更复杂的客户特征之间的关系来提供更精确的额度预测。
标签:plt,python,模型,DNN,test,import,model,data From: https://blog.csdn.net/viviwiky/article/details/143753847