ML模型训练准确率为0且损失值异常问题求助
问题分析与解决方案
嘿,我一眼就揪出了几个导致你模型拉胯的关键问题,咱们一步步来把它们解决掉:
1. 核心错误:用分类指标评估回归任务
你正在做的是房价预测(回归任务),但模型编译时却用了metrics=["accuracy"]——这可是分类任务专属的指标啊!
Accuracy衡量的是预测类别和真实类别完全匹配的比例,但回归任务预测的是连续数值(比如房价),几乎不可能和真实值完全相等,所以准确率永远是0,这个指标对你的任务半毛钱用都没有。回归任务该用回归相关指标,比如mean_absolute_error或者mean_squared_error(其实你的损失函数已经是MSE了)。
2. 学习率高到离谱,模型直接“震荡失控”
你给Adam优化器设置的lr=0.8太夸张了!Adam的默认学习率是0.001,这么大的学习率会让模型参数更新幅度过大,根本没法收敛,直接导致损失值高得吓人。
3. 模型结构太简单,拟合能力严重不足
你的模型只有一个输出神经元,连隐藏层都没有,这种结构根本没法捕捉特征和房价之间的非线性关系,拟合复杂数据的能力弱得一批。
修正后的代码
我把这些问题都修复好了,你直接抄去跑就行:
import pandas as pd from sklearn import preprocessing from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam # 数据加载与预处理 data = pd.read_csv("house.csv") x = data.iloc[:,0:3] y = data["price"] # 归一化处理 sd = preprocessing.scale(x) # 构建有拟合能力的模型 model = Sequential() # 添加隐藏层,用relu激活引入非线性 model.add(Dense(8, input_shape=(3,), activation='relu')) model.add(Dense(4, activation='relu')) # 回归任务输出层不需要激活函数(预测连续值) model.add(Dense(1)) # 修正优化器和评估指标 model.compile(Adam(lr=0.001), loss="mean_squared_error", metrics=["mean_absolute_error"]) # 训练模型 history = model.fit(sd, y, epochs=100, verbose=1) # 预测并保存结果 yp = model.predict(sd) data["pred"] = yp
额外小建议
- 先好好探索你的数据集:看看房价的分布、特征和房价的相关性,有没有异常值需要处理,这会帮你进一步提升模型效果。
- 训练时可以加个验证集,比如
model.fit(sd, y, epochs=100, validation_split=0.2),避免模型过拟合。 - 如果损失还是降不下来,试试调整隐藏层的神经元数量、加个Dropout层,或者先换用随机森林回归这类模型做个基准对比。
内容的提问来源于stack exchange,提问作者Amr Al-Omari
相关产品推荐
相关产品推荐

