讲师中心 微信公众号
AI工具推荐 视频效率加速

Keras二分类模型预测单一类别:深度诊断与解决方案

冬墨同学_1404

冬墨同学_1404

发布时间:2025-11-23 14:13:26

|

716人浏览过

|

来源于php中文网

原创

Keras二分类模型预测单一类别:深度诊断与解决方案

本文针对keras二分类模型始终预测同一类别的问题进行深入探讨。即便数据集平衡且模型结构合理,此类问题仍可能源于特征与目标变量间缺乏可学习的相关性。教程将通过分析数据预处理、模型构建代码,并提出以探索性数据分析(eda)为基础,结合简单模型验证特征有效性,以及精细化特征工程等策略,指导读者诊断并解决此类模型失效问题,强调理解数据本质先于复杂模型应用的重要性。

1. 问题描述与初步分析

在构建Keras二分类神经网络时,有时会遇到模型始终预测同一类别(通常是训练集中实例较多的类别)的困境,即使数据集的类别分布相对平衡。这种现象表明模型未能从数据中学习到有效的判别模式,其预测结果缺乏实际意义。

例如,在一次销售额预测任务中,目标是将销售额二值化为“高销售”(True)和“低销售”(False)。尽管训练数据中两类别的比例接近50/50,但训练后的模型在测试集上却表现出以下混淆矩阵:

预测为正类 预测为负类
真实为正类 0 (TP) 21719 (FN)
真实为负类 0 (FP) 22620 (TN)

从混淆矩阵中可以看出,模型将所有样本都预测为负类。这意味着模型完全没有学习到如何识别正类样本,或者说它认为所有样本都更倾向于负类。这并非简单的过拟合或欠拟合,而是更深层次的“无信号”问题。

2. 核心代码回顾

为了更深入地理解问题,我们首先回顾模型构建的关键步骤,包括数据准备、数据集划分和神经网络结构。

2.1 数据准备

数据预处理阶段旨在将原始数据转换为模型可接受的数值格式,并对目标变量进行二值化。

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, Normalizer
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.initializers import he_normal

# 假设 purchase_data 已加载,并进行复制
data = purchase_data.copy()

# 将销售额二值化:高于 target_sum 为 True,否则为 False
target_sum = 120
data.loc[data['sales'] <= target_sum, 'sales'] = False
data.loc[data['sales'] > target_sum, 'sales'] = True

# 对类别型特征和布尔型特征进行 Label Encoding
labelencoder = LabelEncoder()
for col in data.columns.values.tolist():
    if data[col].dtype == "object" or data[col].dtype == "bool":
        data[col] = labelencoder.fit_transform(data[col])
    # else: 数值型特征无需额外处理,但可能需要归一化

# 将日期时间特征转换为浮点数(时间戳)
data['accessed_date'] = data['accessed_date'].apply(lambda x: x.timestamp())

# 分离特征 X 和目标变量 Y
array = data.values
class_column = 'sales' # 目标列
X = np.delete(array, data.columns.get_loc(class_column), axis=1) # 移除目标列
Y = array[:,data.columns.get_loc(class_column)] # 选取目标列
Y = Y[:, np.newaxis] # 调整 Y 的形状以适应 Keras 输入

# 对输入特征 X 进行归一化处理
scaler = Normalizer().fit(X)
X = scaler.transform(X)

说明:

Web Accessibility (WCAG 2 AA))
Web Accessibility (WCAG 2 AA))

将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。

下载
  • 目标变量二值化: sales 列根据 target_sum 被转换为布尔值,然后通过 LabelEncoder 进一步编码为0和1。
  • 类别特征编码: 使用 LabelEncoder 将所有 object 和 bool 类型的列转换为数值。
  • 时间戳转换: accessed_date 被转换为 Unix 时间戳,使其成为数值特征。
  • 特征归一化: 使用 Normalizer 对特征 X 进行归一化,这有助于神经网络训练的稳定性和收敛速度。

2.2 数据集划分

数据集被划分为训练集和测试集,并使用了分层抽样以确保类别分布在训练集和测试集中保持一致。

seed = 1
X_train, X_test, Y_train, Y_test  = train_test_split(X, Y, test_size=0.33, random_state=seed, shuffle = True, stratify=(Y))

说明:

  • test_size=0.33: 33% 的数据用于测试。
  • random_state=seed: 保证每次运行结果的可复现性。
  • stratify=(Y): 关键一步,确保训练集和测试集中目标变量 Y 的类别比例与原始数据集相同,避免因抽样偏差导致的问题。

2.3 Keras 神经网络构建

模型采用多层感知机(MLP)结构,包含隐藏层和 Dropout 层用于正则化。

tf.random.set_seed(seed)

# 构建神经网络模型
modeldl = Sequential()
modeldl.add(Dense(64, input_dim=X.shape[1], activation='relu', kernel_initializer=he_normal()))
modeldl.add(Dropout(0.2)) # 添加 Dropout 层防止过拟合
modeldl.add(Dense(32, activation='relu', kernel_initializer=he_normal()))
modeldl.add(Dropout(0.2))
modeldl.add(Dense(1, activation='sigmoid', kernel_initializer=he_normal())) # 输出层使用 sigmoid 激活函数进行二分类

# 编译模型
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-04) # 使用 Adam 优化器,并设置学习率
modeldl.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['acc']) # 损失函数为二元交叉熵,评估指标为准确率

# 模型训练(此处省略实际训练代码,仅展示结构)
# results = modeldl.fit(X_train, Y_train, epochs=80, batch_size=1000, verbose=1)

说明:

  • 网络结构: 包含两个 Dense 隐藏层,分别有64和32个神经元,激活函数均为 relu。输出层为1个神经元,激活函数为 sigmoid,用于输出0到1之间的概率值。
  • 权重初始化: 使用 he_normal 初始化器,适用于 relu 激活函数。
  • Dropout: 在隐藏层之间添加 Dropout 层,以随机丢弃神经元,减少模型对特定特征的依赖,从而降低过拟合风险。
  • 优化器: 使用 Adam 优化器,学习率为 1e-04。
  • 损失函数: binary_crossentropy 是二分类任务的标准损失函数。
  • 评估指标: acc (准确率) 用于衡量模型性能。

从代码层面看,数据预处理、数据集划分和神经网络构建都遵循了常见的最佳实践,没有明显的语法或逻辑错误。然而,模型仍然无法学习,这提示我们问题可能不在于代码本身,而在于数据更深层次的特性。

3. 问题根源探究与解决方案

当神经网络模型在代码无误且数据集平衡的情况下,仍旧无法学习并总是预测同一类别时,最根本的原因往往是输入特征与目标变量之间缺乏可学习的强相关性。换句话说,模型无法从现有特征中找到任何有意义的模式来区分不同的类别。

针对这种情况,以下是推荐的诊断与解决策略:

3.1 策略一:深入探索性数据分析 (EDA)

在投入大量精力调整模型超参数之前,首先应该对数据进行彻底的探索性数据分析(EDA)。EDA是理解数据、发现模式、识别异常和评估特征与目标变量之间关系的基础。

  • 目的: 找出哪些特征可能与目标变量(如“销售额是否高于120”)存在潜在的关联。
  • 方法:
    • 可视化分析:
      • 直方图/密度图: 观察各个数值特征的分布,看是否存在偏态或多峰现象。
      • 箱线图/小提琴图: 比较不同类别(高销售/低销售)下数值特征的分布差异。如果某个特征在两类间的分布有明显分离,则该特征可能具有预测能力。
      • 散点图矩阵/Pair Plot: 观察特征之间的两两关系以及特征与目标变量的关系。
      • 相关性矩阵/热力图: 计算所有数值特征(包括编码后的类别特征和目标变量)之间的皮尔逊相关系数,并用热力图可视化。寻找与目标变量相关性较高的特征。
    • 统计分析:
      • 描述性统计: 计算均值、中位数、标准差等,了解数据的基本情况。
      • 假设检验: 对特定特征进行t检验、卡方检验等,量化其与目标变量之间的统计显著性。
  • 案例参考: 针对电商日志数据,可以参考相关EDA报告(例如 Kaggle 上的 Ecommerce Logs EDA),学习如何从原始数据中发现有价值的信息。

如果EDA显示所有特征与目标变量之间几乎没有相关性,那么任何复杂的模型都难以学习。

3.2 策略二:从简单模型入手验证特征有效性

在尝试复杂的神经网络之前,先使用简单、可解释的机器学习模型(如逻辑回归、决策树、支持向量机等)来验证特征的有效性。

  • 目的: 快速判断现有特征是否至少能被线性或简单的非线性模型所利用。
  • 方法:
    • 选择一个或几个在EDA中发现的“有潜力”的特征。
    • 使用逻辑回归等简单模型进行训练和评估。
    • 观察模型的性能。
      • 如果简单模型在这些特征上能够取得远高于随机猜测的性能(例如,准确率显著高于50%,或F1分数表现良好),则说明这些特征确实包含了一些预测信号,可以考虑在此基础上构建更复杂的模型或加入更多特征。
      • 如果简单模型仍然表现不佳,甚至也总是预测同一类别

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
unix和linux的区别
unix和linux的区别

unix和linux的区别包括发展历史、开源性、发行版本、内核、文件系统、应用程序兼容性和用户界面等。本专题为大家提供unix和linux相关的文章、下载、课程内容,供大家免费下载体验。

3153

2023.09.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

40

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

120

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

140

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

120

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

80

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

80

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
LLVM Programmer’s Manual
LLVM Programmer’s Manual

共0课时 | 0人学习

Conan 包创建教程
Conan 包创建教程

共0课时 | 0人学习

Visual Studio 入门指南
Visual Studio 入门指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn