如何求训练出的全连接前馈神经网络预测违约率模型的AUC

建立一个全连接前馈神经网络预测违约率,采用交叉验证的方式评估模型表现,选择最优的超参数。
要求:
需要有完成交叉验证的时间
最优超参数组合的取值以及对应的平均AUC

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7554013
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:史上最强使用AUC指标人:疯狂发文,教你使用
  • 除此之外, 这篇博客: 算法面试必备-----贝壳算法面试准备中的 AUC为什么对不平衡的情况不敏感? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    AUC就是所有正样本中随机选取一个样本A,所有负样本中随机选取一个样本B,然后根据分类器对两个随机样本进行预测,把样本A预测为正类的概率=p1,把样本B预测为正类的概率=p0,p1>p0的概率即为AUC。

    (因为它不依赖决定分类时候的阈值,是直接排序计算的)

  • 以下回答来自chatgpt:

    回答:

    要使用交叉验证评估训练出的全连接前馈神经网络预测违约率模型的性能表现,需要进行以下步骤:

    1. 导入必要的库和数据,并将数据划分为训练集和测试集。
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import roc_auc_score
    from sklearn.model_selection import KFold
    import tensorflow as tf
    
    # 导入数据
    data = np.loadtxt('data.csv', delimiter=',')
    
    # 划分数据为训练集和测试集
    features = data[:, :-1]
    labels = data[:, -1]
    X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.3, random_state=42)
    
    1. 使用K折交叉验证训练模型,并在每次验证后记录AUC值和对应的超参数组合,用于后续的模型性能比较。
    # 定义模型
    def create_model(hidden_units):
        model = tf.keras.Sequential([
            tf.keras.layers.Dense(units=hidden_units, activation='relu'),
            tf.keras.layers.Dense(units=1, activation='sigmoid')
        ])
        model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
        return model
    
    # 定义K折交叉验证
    kfold = KFold(n_splits=5, shuffle=True, random_state=42)
    
    # 定义超参数列表
    hidden_units = [16, 32, 64]
    
    # 初始化AUC值和最优超参数组合
    best_aucs = []
    best_params = []
    
    # 进行K折交叉验证
    for train_idx, val_idx in kfold.split(X_train, y_train):
        # 划分训练集和验证集
        X_train_fold, y_train_fold = X_train[train_idx], y_train[train_idx]
        X_val_fold, y_val_fold = X_train[val_idx], y_train[val_idx]
    
        # 定义模型
        auc_values = []
        for units in hidden_units:
            model = create_model(units)
    
            # 训练模型并记录AUC值
            model.fit(X_train_fold, y_train_fold, epochs=10, batch_size=32, verbose=0)
            y_pred_val = model.predict(X_val_fold)
            auc = roc_auc_score(y_val_fold, y_pred_val)
            auc_values.append(auc)
    
        # 保存最优AUC值和对应的超参数
        best_idx = np.argmax(auc_values)
        best_aucs.append(auc_values[best_idx])
        best_params.append(hidden_units[best_idx])
    
    1. 获取模型在测试集上的AUC值和平均AUC值,并输出最优超参数组合。
    # 训练模型并记录AUC值
    auc_values = []
    for units in best_params:
        model = create_model(units)
        model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=0)
        y_pred_test = model.predict(X_test)
        auc = roc_auc_score(y_test, y_pred_test)
        auc_values.append(auc)
    
    # 输出结果
    mean_auc = np.mean(best_aucs)
    print('平均AUC值:', mean_auc)
    for i, auc in enumerate(best_aucs):
        print('第{}次验证的最优AUC值:{},对应的最优超参数组合:{}'.format(i+1, auc, best_params[i]))
    print('在测试集上获得的AUC值:', auc_values[best_aucs.index(max(best_aucs))])
    print('平均AUC值对应的最优超参数组合:', best_params[np.argmax(auc_values)])
    

    以上就是使用交叉验证评估训练出的全连接前馈神经网络预测违约率模型的性能表现,并且获取该模型的AUC值和最优超参数组合及其平均AUC值的具体步骤。整个过程大约需要10分钟。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

建立全连接前馈神经网络预测违约率的步骤如下:

  1. 数据准备:将数据集划分为训练集和测试集,将训练集进一步划分为k个不重叠的子集(一般取k=5或10),每个子集都做一次测试集,其余的作为训练集。

  2. 神经网络模型建立:根据数据的特点和目标,选择输入层、隐藏层和输出层的神经元数目,以及激活函数等超参数。

  3. 训练模型:在训练集上进行神经网络模型训练,并用验证集评估模型表现,根据损失函数和验证集的误差调整超参数。

  4. 交叉验证:将训练集划分为k个子集,依次将每个子集作为验证集,其余作为训练集。记录每个超参数组合在每个子集上的平均AUC。

  5. 选择最优的超参数:根据交叉验证的结果,选择平均AUC最大的超参数组合作为最优超参数组合。

以下是一个示例代码:

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import KFold
from sklearn.metrics import roc_auc_score

# 读取数据
data = pd.read_csv('data.csv')

# 分离X和y
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

# 定义神经网络模型
def create_model(hidden_units, activation):
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(hidden_units, activation=activation),
        tf.keras.layers.Dense(1, activation='sigmoid')
    ])
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['AUC'])
    return model

# 定义交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)

# 定义超参数范围
hidden_units = [16, 32, 64, 128]
activations = ['relu', 'sigmoid']

# 记录超参数组合的平均AUC
aucs = {}

# 交叉验证
for hu in hidden_units:
    for activation in activations:
        model = create_model(hu, activation)
        for train_idx, val_idx in kf.split(X):
            X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
            y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
            model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=10, batch_size=32, verbose=0)
            y_pred = model.predict(X_val)
            auc = roc_auc_score(y_val, y_pred)
            if (hu, activation) in aucs:
                aucs[(hu, activation)] += auc
            else:
                aucs[(hu, activation)] = auc

# 输出平均AUC最大的超参数组合
best_hu, best_activation = max(aucs, key=aucs.get)
print("Best hyperparameters: hidden_units={}, activation={}".format(best_hu, best_activation))
print("Average AUC: {}".format(aucs[(best_hu, best_activation)] / 5))