python - 在第二个 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
我对训练集中的所有列进行了三次检查,以确保没有列包含可能直接回答文章是否“受欢迎”的值。这里可能是什么问题?
解决方案
推荐阅读
- java - retorfit2 如何正确获取此 json?
- spring - 登录/注销是否需要 JWT 身份验证
- javascript - Node.js:如何从请求正文中获取调用 POST 的页面的 URL?
- php - jQuery Ajax Load() 中的错误/错误在单击时刷新屏幕
- c# - 从按钮更新 datagridview 行
- python - 检测开炉和关炉之间的时间差
- android - 如何使用 adb 在工作配置文件中安装和调试应用程序?
- r - 使用分隔符拆分列后如何操作 R 中的新列?
- reactjs - 依赖注入调用导出默认失败
- c++ - 多线程 OpencCV 的 VideoCapture