python - 神经网络不收敛于明确的线性可分问题
问题描述
我正在 Keras 开发一个神经网络,我想测试以确保它有效。特征集显然是线性可分的(下图中的“A”和“N”),但由于某种原因,当我使用心率变异性(图中的 HRV)作为唯一特征运行我的神经网络时,它不认为正训练示例(“A”训练示例)是独一无二的:
我的神经网络架构很简单:
model = Sequential()
model.add(Dense(10, input_shape=(None, X_train.shape[1]),
activation='sigmoid'))
model.add(Dense(10, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
opt = tf.keras.optimizers.Adam(lr=learning_rate, decay=decay_rate)
model.compile(loss=loss_fn, optimizer=opt, metrics=['acc'])
model.fit(X_train, y_train, epochs=n_epochs, validation_data=(X_test, y_test))
当我使用混淆矩阵测试准确性时,NN 会过度拟合负训练示例:
precision recall f1-score support
0.0 0.72 1.00 0.84 20774
1.0 0.00 0.00 0.00 8126
accuracy 0.72 28900
macro avg 0.36 0.50 0.42 28900
weighted avg 0.52 0.72 0.60 28900
有什么建议么?
编辑:附加超参数
Training vector shape:(67432, 1, 1)
Example of first element:[[72.710655]
loss_fn = 'binary_crossentropy'
learning_rate = 1e-2
decay_rate = 1e-8
n_epochs = 10 (have varied this but still converges to negative training example)
编辑:附加信息
我想包括我如何格式化我的数组,以防出现问题:
X_train = np.asarray(X_train).reshape(
X_train.shape[0], 1, X_train.shape[1])
X_test = np.asarray(X_test).reshape(
X_test.shape[0], 1, X_test.shape[1])
解决方案
由于您的数据不平衡,您可能希望在 model.fit 中使用 class_weight
model.fit(X_train, y_train, epochs=n_epochs, validation_data=(X_test, y_test), class_weight=class_weight)
这class_weight
是一本字典。您可以尝试的一个选项是将类权重设置为与类大小成反比,即每个类的数据点数。
推荐阅读
- python - BigQueryOperator 在 write_disposition='WRITE_TRUNCATE' 时更改表架构和列模式
- django - Django 模型 - 兄弟姐妹之间的关系通过一个孩子
- ios - 启动应用程序时出错 - Flutter - iOS
- python - 无法导入我刚刚在 VS 代码中安装的模块(我使用的是 Ubuntu)
- azure - 如何在 Azure 中动态创建 Ziparchive
- kubernetes - K8S api cloud.google.com 在 GKE v1.16.13-gke.401 中不可用
- python - 用于存储 N 非常大的 N 个列表的高效数据结构
- c - 使用回调函数的结构在 c 中出现警告
- c++ - 是否存在具有当前 Oracle ODBC 驱动程序的 Visual Studio C++ 2008 应用程序的迁移路径,具体取决于 Visual Studio 2017 Redistributables?
- swift - 在 SQLite 上插入新行时返回 Nil