首页 > 解决方案 > 在第二个 Epoch Keras 分类器之后,ANN 训练和测试集的准确度变为 1.0

问题描述

我建立了以下分类模型

def build_classifier(input_size):
    
    hl_1_dim = int(input_size / 2)
    hl_2_dim = int(hl_1_dim / 2)
    
    classifier = Sequential()
    classifier.add(Dense(units = hl_1_dim, kernel_initializer = 'normal', activation='relu', input_dim = input_size))
    classifier.add(Dense(units = hl_2_dim, kernel_initializer = 'normal', activation='relu'))
    classifier.add(Dense(units = 1, kernel_initializer = 'normal', activation='sigmoid') )
    classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics=['accuracy'])

    return classifier

我提供了一个包含 20983 行和 209 列的训练集。数据集中的所有值都归一化为 [0,1] 范围。

要拆分数据集,我使用如下train_test_split函数:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3, shuffle = True)

我使用这些超参数训练模型:

classifier = build_classifier(len(X_train[0]))
classifier.fit(X_train, Y_train, batch_size = 10, epochs = 50)

无论我尝试过任何超参数调整,每当我将问题形成为分类问题时,我在 50 次中的第二个时期的测试集和训练集上都获得 1.0 的准确度。binary_crossentropy在 1.2403e-09 附近,损失总是非常小的数字. 但是,如果我将模型更改为线性回归,我会使用 MSE 以及交叉验证结果或多或少地获得足够的损失:

def build_regressor(input_size):
    
    hl_1_dim = int(input_size / 2)
    hl_2_dim = int(hl_1_dim / 2)
    
    regressor = Sequential()
    regressor.add(Dense(units = hl_1_dim, kernel_initializer = 'normal', activation='relu', input_dim = input_size))
    regressor.add(Dense(units = hl_2_dim, kernel_initializer = 'normal', activation='relu'))
    regressor.add(Dense(units = 1, kernel_initializer = 'normal') )
    #optimizer = keras.optimizers.RMSprop()
    regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
    return regressor

我的数据集中的每一行对应于来自新闻网站的一篇文章,各种文章参数作为列,如doc2vec文章文本和标题的矢量表示、文章中的图像/视频/iframe 的数量、文章的作者等以及文章意见。这个想法是根据文章获得的浏览量来预测文章是否会“流行”。

为了将此问题形成为一个分类问题,我计算所有文章视图的数学平均值(平均值),如果一篇文章的视图高于平均值,那么我为我的数据集中的“流行”列添加值 1。如果一篇文章的查看次数低于平均值,我将其赋值为 0。因此,我的数据集的“X”矩阵包含所有上面提到的值,不包括查看次数列(显然,因为 ANN 会找到观看次数和受欢迎程度之间的相关性)。“Y”数组包含“流行”列的值(1 或 0)。我sigmoid对分类器模型和binary_crossentropy损失函数使用激活函数。

对于回归问题,我消除了“流行”列,并直接将视图计数用于 Y 数组中的值。我mean_squared_error用于损失函数。

对于回归模型和分类模型,优化器都设置为“adam”。

对于回归,我得到大约 2087 作为与使用的X_test矩阵相对应的预测 Y 值的损失。这或多或少是我所期望的。但是对于分类器,训练集的准确度为 1.0,损失极低,测试集的准确度为 1.0。mean_absolute_error()sklearn.metrics

我对训练集中的所有列进行了三次检查,以确保没有列包含可能直接回答文章是否“受欢迎”的值。这里可能是什么问题?

标签: pythontensorflowmachine-learningkeras

解决方案


推荐阅读