恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

手机价格预测:用Keras前馈神经网络搞定表格分类实战

  • 首页
  • 资讯中心
  • /
  • 手机价格预测:用Keras前馈神经网络搞定表格分类实战

相关资讯

如何正确校验IPv4地址:从字符串拆分到正则与标准库的完整实践 2026/10/3 3:06:34
AI辅助论文写作如何去除机器味?一套基于大模型原理的优化工作流 2026/10/3 3:06:34
AI辅助生成科研任务书:从空白文档到高质量初稿的实战指南 2026/10/3 3:06:34

最新资讯

类型安全容器设计:告别Map<String,Object>与ClassCastException
AI时代设计师如何避免成为算力耗材?从模型原理到工作流重构
MATLAB仿真PID参数整定:从建模到指标优化,告别手动调试
Hermes Agent工业级落地:Windows多Agent协同工程实践
Flutter跨平台鸿蒙开发实战:手账便签收藏应用的技术取舍
函数组合:Haskell高阶编程范式与软件架构的核心

今日推荐

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成
编译原理实验:递归下降分析器消除左递归与避坑指南
Python协议级爬取Shopee商品数据实战

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

手机价格预测:用Keras前馈神经网络搞定表格分类实战

发布时间:2026/10/3 3:06:34
手机价格预测:用Keras前馈神经网络搞定表格分类实战 最近我朋友问我说想找个教材案例练神经网络又不希望一上来就跟MNIST那张28×28的小图片死磕。我第一反应就是Kaggle非常经典的那个Tableau练习数据集手机价格预测Mobile Price Classification。它给出一堆手机硬件参数需要你用一个模型把手机价格区间猜出来是标准的表格型分类问题。我用一个下午时间用Keras把前馈神经网络跑通了测试集准确率做到了97%左右。这个案例我后来带过好几次新人每次都说它是“最小成本理解神经网络落地全过程”的范本。今天就把当时的思路、完整代码、还有踩过的坑原原本本拆开讲。这篇文章适合谁你如果刚学完神经网络基础理论想找代码练手又不想陷入图像大坑或者你已经在做传统机器学习但一直没搞明白怎么迁移到神经网络里都很适合照着过一遍。我会说清楚每一层结构为什么这么设计每个预处理步骤为什么不能省以及跑完模型之后怎么看结果。1. 手机价格分类一个数据集背后的入门逻辑1.1 我们到底在预测什么这个数据集来自Kaggle公开的移动价格分类训练集一共2000条样本每条记录是一部手机的20个硬件特征。没有任何品牌、型号、外观这些主观因素全部是可量化的参数电池容量、蓝牙、CPU主频、内存、屏幕高度宽度、重量、核心数、RAM、通话时长、是否支持3G/4G/WiFi等等。标签叫作price_range一共四档0、1、2、3分别对应低端、中端、高端、旗舰四个价格区间。很多人刚拿到会觉得这跟“多少钱”有什么关系但实际做项目就是这样很多时候你没法直接拿到价格只能拿到配置表然后用历史数据反推一套映射关系。这也是我推荐它的主要原因目标清晰特征明确是一个再标准不过的有监督分类任务。样本量2000行看似很少对深度学习来说确实不大但它反而逼你去关注模型会不会过拟合、数据预处理好不好的问题。平时工作里你遇到的表格数据绝大多数也就在几千到几万行这个规模拿小样本把基本功练好比直接上一个重型模型更有用。1.2 神经网络在这类问题里的位置说句实话这个数据集用传统机器学习方法也能做甚至效果不错。但我不建议直接跳去调参因为神经网络的价值在于你亲手搭一个网络能非常直观地看到特征缩放、激活函数、损失函数、过拟合这些概念如何具体影响结果。有热门词说“神经网络”就联想到CNN、LSTM其实那是另一个场景。CNN擅长图像LSTM适合序列手机价格预测是典型的表格数据适合的是前馈神经网络Feedforward Neural Network也就是大家常说的BP网络核心结构。文件里有一列一列的特征输入层把它们吃进来经过全连接层逐层加工最后由输出层给出四个价格档位的概率分布。这个案例教会人的第一课就是神经网络不等于花里胡哨的网络结构最基础的全连接层在结构化数据上依然是可靠方案。2. 数据体检20个特征和标签之间的真实关系2.1 特征速览与业务含义动手写代码之前最好先把CSV打开看一眼。特征大致分三类连续型数值battery_power毫安时、clock_speedGHz、int_memoryGB、mobile_wt重量、px_height、px_width像素、ram内存、sc_h、sc_w屏幕尺寸、talk_time通话时长、fc和pc摄像头像素。二值开关blue蓝牙、dual_sim、four_g、three_g、touch_screen、wifi这些本来就是0和1不用再做编码。数量型但偏离散n_coresCPU核心数、m_dep厚度。起步时我建议直接先把这些列当成普通数值特征丢给模型没必要一上来做特征组合或PCA神经网络本身的表达能力足够帮你找到有用的非线性关系。重点检查的是有没有空值、有没有重复行、有没有量纲差异巨大的列。import pandas as pd df pd.read_csv(train.csv) print(df.shape) print(df.isnull().sum().sum()) print(df[price_range].value_counts()) X df.drop(price_range, axis1) y df[price_range]四个档位各500条非常均衡。这省了很多麻烦如果类别严重不平衡后面还得思考是否要用class_weight或采样策略。这个数据集不用管这些拿过来就能用。2.2 训练集划分的正确姿势接下来划分训练集和测试集。这里有个容易被忽略的原则先划分再做标准化。很多人习惯先把所有特征标准化再划分测试集这种做法会造成数据泄漏。测试集的信息在训练阶段就被“偷看”了评估结果会虚高部署后达不到这个效果。正确做法from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy )我习惯设置stratifyy让训练集和测试集里四个价格区间的比例一致。虽然数据集本身均衡但这个好习惯对多数分类问题都适用。random_state42固定下来方便复现也方便两个人对照实验时聊同一个结果。3. 模型结构推演为什么两层隐藏层就够用3.1 从逻辑回归到神经网络的直觉如果只有线性回归我们大概会这样做把20个特征各乘一个权重求和再套一个sigmoid。但价格档位和特征之间显然不是纯线性的比如RAM超过某个阈值之后价格档位明显跃迁屏幕分辨率高到一定程度带来的边际效用也在变。神经网络解决非线性的方式很朴素隐藏层里加上激活函数把上一层的线性组合再做一次非线性变身。第一版我推荐的结构是双隐藏层输入层20个特征所以input_dim20第一个隐藏层64个神经元ReLU激活Dropout层0.3的概率随机丢弃后面会解释为什么第二个隐藏层32个神经元ReLU激活输出层4个神经元Softmax激活。为什么是64、32而不是1024、512因为这个数据集只有1600条训练数据神经元太多非常容易快速过拟合。你的模型越“胖”需要的数据就越多。64和32这个规模在这个样本量下已经能表达足够复杂的映射关系再往上加收益非常小过拟合风险却放大很多。这正好也是给新手纠正一个习惯模型性能不是靠暴力堆参数堆出来的是靠匹配数据规模堆出来的。3.2 激活函数和损失函数的选择理由隐藏层用ReLU基本是共识。ReLU能缓解梯度消失计算也快。比较经典的替代方案是tanh但实测上ReLU搭配Adam优化器在浅层网络里更稳。输出层用Softmax因为这是四分类问题它能把网络输出变成一个概率分布四个数相加等于1最大概率对应的档位就是预测结果。损失函数用分类交叉熵categorical_crossentropy。交叉熵特别适合衡量两个概率分布之间的距离配合Softmax几乎是多分类的固定搭配。优化器我用Adam它自带自适应学习率对新手最友好你不太需要去调学习率就能得到一个不错的结果。等后续想进阶了再换SGD配合学习率衰减去追求极致。from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras import utils y_train_cat utils.to_categorical(y_train, num_classes4) y_test_cat utils.to_categorical(y_test, num_classes4) model Sequential([ Dense(64, activationrelu, input_shape(X_train.shape[1],)), Dropout(0.3), Dense(32, activationrelu), Dense(4, activationsoftmax) ]) model.compile( optimizeradam, losscategorical_crossentropy, metrics[accuracy] ) model.summary()注意to_categorical这步。原始标签是0、1、2、3这样的整数如果直接拿给Softmax用模型会把它当成有序连续值容易误导学习。转成one-hot编码后每个样本变成[0,1,0,0]这样的四维向量和Softmax输出完全对齐。这个细节新手经常漏漏了之后通常会出现loss居高不下的情况。3.3 为什么不用更深的网络或其他结构有人会问为什么不用卷积神经网络或者LSTM这需要看着数据回答CNN设计初衷是提取图像的空间局部特征表格数据里哪有什么空间局部性强行把20个特征排成二维矩阵送给卷积层反而破坏了特征之间的自然关系。LSTM更不用说了它是为时间序列设计的手机特征不是按时间顺序排列的硬套上去纯属给自己找麻烦。对表格学习任务前馈神经网络或者梯度提升树是更合适的主力。这一点要在头脑里清楚选网络结构不是追新而是根据数据形态和任务类型来定。4. 代码落地从训练到评估的核心流程4.1 标准化这步不能省数据里有ram这种动辄几千毫安的数值也有blue这种只有0和1的开关直接喂给神经网络会出问题。神经网络对输入尺度很敏感激活函数在绝对值很大的输入上容易进入饱和区梯度变得非常小训练半天loss不动。所以必须先做标准化。我用的是StandardScaler把每个特征变成均值0、标准差1的正态分布形式。前面强调过fit只能用在训练集上测试集用同一个scaler直接transform。from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)这一步做完再去看模型的表现才会有意义。4.2 训练过程的观察策略训练时我在原始训练集里再切出20%作为验证集用来观察模型在训练过程中有没有过拟合。epochs50给够轮数配合早停机制让它自己判断什么时候该停。from tensorflow.keras.callbacks import EarlyStopping early_stop EarlyStopping( monitorval_loss, patience10, restore_best_weightsTrue ) history model.fit( X_train_scaled, y_train_cat, validation_split0.2, epochs50, batch_size32, callbacks[early_stop], verbose1 )patience10的意思是验证集损失连续10个epoch没有改善就停下来同时restore_best_weightsTrue会把模型权重恢复到验证集最优的那个时刻。在我实操里这个网络一般在二十多个epoch左右验证准确率就开始收敛之后如果继续硬跑训练集loss还在降验证集loss反而开始回升那就是过拟合前兆了。4.3 评估指标别只看accuracy训练完后测试集准确率能做到97%上下这个数看着很诱人但还是建议多看一眼混淆矩阵。因为测试集每类500条样本99%的准确率背后可能仍有不少出错点混淆矩阵能帮你看清哪些档位容易被混淆比如1档和2档之间是否常常分不清。import numpy as np from sklearn.metrics import confusion_matrix y_pred np.argmax(model.predict(X_test_scaled), axis1) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))经验里最容易混淆的通常是相邻档位比如真实价格是2档模型预测成1档或3档。这种情况说明特征在相邻档次之间的边界信息确实不够强不是模型坏了而是数据本身就有模糊地带。5. 训练中的坑标准化、过拟合与数据泄漏5.1 坑一忘记标准化或者标准化位置不对我有一个朋友第一次跑这个案例直接把原始数据丢进模型训练损失稳定在1.2左右怎么调参数都不降。检查半天发现他图省事把规范化放在train_test_split之前了更离谱的是用的是MinMaxScaler把全部2000条样本的极大极小值都先计算了一遍。这样玩的结果是测试集的信息在训练阶段就被看了一遍最后自欺欺人得到一个虚高分数。如果先划分再标准化问题立刻消解。每次换数据、换验证切分的时候都要检查一下你的scaler是不是只用了训练集的数据来拟合。5.2 坑二Dropout的放置位置Dropout层放在隐藏层之后作用是每次训练时随机让一部分神经元失活强迫网络不要过分依赖某一个神经元。它本质上是给模型加噪声做正则化。有人问为什么不在输出层后面加Dropout没有意义那是输出结果不是内部特征。另外Dropout率不是一个越大越好的数字。0.5在部分场景里很常用我在这个数据上用0.3表现更好。原因是0.5丢弃一半信息对本来就只有1600条训练数据的小网络来说太狠反而让模型学不动。5.3 坑三标签漏了one-hot或者用错metrics如果你发现训练时的accuracy始终正常但loss降不下来先看标签是不是没有one-hot。没有转成one-hotcategorical_crossentropy会直接报错或者算出无效值这点TensorFlow会有比较明确的提示。还有一个容易察觉的坑是metrics里写了accuracy但在模型只有单输出、标签是整数编码时这个accuracy会被当成二分类指标计算含义完全错位。检查方式很简单确认你的标签维度然后确认输出层神经元数和损失函数能不能对得上。5.4 一个小技巧观察每轮loss的收敛节奏训练时不要只看最终准确率。我会把每轮loss记下来大致判断模型是否健康前两三轮loss如果没明显下降先检查学习率和数据标准化如果到二十轮还在持续缓慢下降可以适当延长epoch如果验证集loss已经回头往上走就是典型的过拟合增加Dropout或者减少隐藏层神经元比继续多跑几轮更有效。6. 除了神经网络为什么我还会拿XGBoost做对照6.1 对照组实验比我预期更有价值我每次做这个案例都会顺手再跑一个XGBoost因为它对表格数据同样非常强。这不是为了证明谁更厉害而是让你对模型差异有真实体感。import xgboost as xgb model_xgb xgb.XGBClassifier( n_estimators300, max_depth5, learning_rate0.1, subsample0.8, colsample_bytree0.8, random_state42 ) model_xgb.fit(X_train, y_train) print(model_xgb.score(X_test, y_test))在标准化之前的原始特征上XGBoost可以直接跑这是树模型和神经网络的显著差异树模型对特征尺度不敏感神经网络对尺度敏感。XGBoost在这个数据集上也能做到95%甚至96%以上再加上它训练速度很快所以很多真实业务里梯度提升树就是表格数据的默认选项之一。但这不代表神经网络没有意义。等你开始做特征交叉比较多、数据量也够大的时候神经网络的优势会更明显。而且这个案例的模型结构可以迁移到用户画像、风险评估、营销响应这类真实表格任务里结构不需要多大改动改的是特征工程和目标函数。6.2 迁移到业务场景的思考做完手机价格预测这个小型项目后你会发现真正值钱的东西是那套完整流程理解业务特征、正确划分数据、标准化、搭模型、看混淆矩阵、做正则化。换到其他表格数据无非是把price_range换成是否流失、是否购买、风险等级。网络结构基本不用变重点永远是把数据和目标理解清楚。我之前还试过把这个流程搬到电商估价场景用类似的结构预测商品成交价格区间效果也还不错。关键学到了一个道理不要指望模型自己解决不干净的数据你能做的是在喂数据之前把数据边界和特征逻辑都梳理清楚。这个手机价格案例最好的收尾其实就是让你亲手把从数据到模型的链路完整走一遍。虽然它简单但所有复杂模型的地基都在这里。新手也好转方向的老手也好我建议都认真跑一遍并且逼自己解释清楚每一步为什么这么做。能说明白了你就真的入门了。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号