如何构建输出布尔结果的机器学习模型?二分类网络相关问题咨询
输出转布尔值&准确率计算
你当前使用的sigmoid输出层是二分类任务的标准设计,神经网络本身不会直接输出布尔值,都是先输出属于正样本的概率(0-1区间),再通过阈值截断得到布尔分类结果。
你训练时看到的accuracy指标是Keras内部默认以0.5为阈值计算的,要自行获取布尔输出和手动计算准确率,可以用如下代码:
import numpy as np # 推理得到概率输出 pred_probs = model.predict(test_images) # 以0.5为阈值转布尔分类结果,可根据业务需求调整阈值 pred_labels = (pred_probs > 0.5).astype(bool) # 手动计算测试集准确率,y_test为测试集真实0/1标签 test_acc = np.mean(pred_labels == y_test) print(f"测试集准确率:{test_acc:.4f}")
如果你的数据集正负样本分布不均,0.5不一定是最优阈值,可以根据你对precision(查准率)、recall(查全率)的需求调整阈值,比如要尽可能少漏检正样本,可以把阈值调低到0.3~0.4区间。
现有模型优化建议
你当前的2D CNN结构可以适配曲线图像分类的需求,但存在参数量过大的问题,在样本量较少的情况下容易过拟合,可做如下调整:
- 降低第一层卷积的核数量:输入尺寸为400800,第一层直接用512个55卷积核会导致参数量爆炸,建议降到64或128,逐层递增核数量,减少过拟合风险。
- 处理样本不平衡:
- 训练时传入类别权重,自动平衡不同样本的损失贡献:
from sklearn.utils.class_weight import compute_class_weight class_weights = compute_class_weight( class_weight='balanced', classes=np.unique(y_train.flatten()), y=y_train.flatten() ) class_weight_dict = {i: class_weights[i] for i in range(len(class_weights))} # 训练时传入参数 model.fit(..., class_weight=class_weight_dict)- 不要只用准确率作为评估指标,补充precision、recall、F1、AUC等指标,避免样本不均导致的准确率虚高:
from sklearn.metrics import classification_report, roc_auc_score print(classification_report(y_test, pred_labels)) print(f"测试集AUC:{roc_auc_score(y_test, pred_probs):.4f}")
更适配的模型选型
如果你的原始数据就是x-y序列格式,不需要转成图像输入,直接用1D CNN处理序列数据效率更高、参数量更小,参考结构如下:
from tensorflow.keras import Sequential from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout model = Sequential() # 输入shape为(序列长度, 2),2对应x、y两个特征 model.add(Conv1D(64, kernel_size=5, activation='relu', padding='same', input_shape=(seq_len, 2))) model.add(Dropout(0.3)) model.add(MaxPooling1D()) model.add(Conv1D(32, kernel_size=5, activation='relu', padding='same')) model.add(MaxPooling1D()) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dropout(0.3)) model.add(Dense(1, activation='sigmoid'))
如果曲线的形态特征非常依赖可视化的全局信息,继续用2D CNN的方案也完全可行,只要优化参数量即可。
内容的提问来源于stack exchange,提问作者pythonlol88
相关产品推荐
相关产品推荐

