线性回归模型评估异常:高误差指标与低R²值的问题排查
汽车价格预测模型问题分析与解答
数据集与任务背景
- 数据集规模:10000行5列,初始列名包括id、mileage_per_year、model_year、price、sold
- 数据异常:price列存在两个负值记录(id4200为-270.77,id4796为-840.36),尚未处理
- 价格统计:最大值118929.72,均值64842
- 核心任务:完成探索性分析、英制单位转公制、列名/标签英文转葡萄牙语,最终预测2005款总里程172095.3km的汽车价格
已完成的数据处理操作
已完成列重命名、单位转换、标签翻译、新增总里程列,代码如下:
df['KM total'] = 1 novo = ['Indice', 'KM por ano', 'Ano do modelo', 'Preço', 'Vendido'] df = df.rename(columns={list(df.columns.values)[i] : novo[i] for i in range(len(novo))}) for i in range(len(df)): df['KM por ano'][i] = int(float(df["KM por ano"][i] * 1.60934)) if df['Vendido'][i] == 'yes': df['Vendido'][i] = 'Sim' else: df['Vendido'][i] = 'Nao' df['KM total'][i] = int(df['KM por ano'][i] * (2023 - df['Ano do modelo'][i]))
多线性回归模型构建
后续构建模型并执行预测,代码如下:
X = df[['KM por ano','KM total','Ano do modelo']] y = df[['Preço']] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2) lr = LinearRegression() lr.fit(X_train, y_train) km_ano = 172095.3 / (2023-2005) preds = lr.predict([[km_ano, 172095.3, 2005]])
模型结果与疑问
- 预测价格:66347美元
- 评估指标异常:MAE=20849.715,MSE(squared=False)=24571.520,RMSE(squared=False)=156.753,R²=0.04946931214392558
- 疑问:
- 操作是否存在错误?
- 多线性回归是否适用于该场景?
- 仅靠R²能否信任模型?
问题解答
1. 操作层面的潜在错误
- 数据处理效率与正确性问题:用
for循环遍历修改DataFrame的方式效率极低,还可能触发SettingWithCopyWarning,建议用向量化操作替代:# 英制转公制 df['KM por ano'] = (df['KM por ano'] * 1.60934).astype(int) # 标签翻译 df['Vendido'] = df['Vendido'].map({'yes': 'Sim', 'no': 'Nao'}) # 计算总里程 df['KM total'] = (df['KM por ano'] * (2023 - df['Ano do modelo'])).astype(int) - 特征冗余问题:
KM por ano和KM total存在强线性关联(KM total = KM por ano × 使用年限),这种多重共线性会严重干扰线性回归的系数估计,导致模型不稳定,也是R²极低的核心原因之一。 - 异常值未处理:price列的两个负值属于明显异常值,会拉低整体均值,干扰模型对正常价格区间的学习,必须处理(删除对应行、用均值/中位数填充或标记为异常)。
- 预测输入格式问题:
lr.predict([[km_ano, 172095.3, 2005]])在新版scikit-learn中可能报错,建议用pd.DataFrame构造输入,确保特征顺序与训练集一致:input_df = pd.DataFrame({'KM por ano': [km_ano], 'KM total': [172095.3], 'Ano do modelo': [2005]}) preds = lr.predict(input_df)
2. 多线性回归的适用性判断
线性回归的适用前提是特征与目标变量存在线性关系,且满足无多重共线性、残差正态分布等假设。当前模型R²仅0.05,说明特征仅能解释5%的价格变异,线性关系极弱,原因可能包括:
- 遗漏关键特征:汽车品牌、车型、车况、配置等才是影响价格的核心因素,仅靠里程和年份不足以构建有效模型;
- 非线性关系:汽车价格随使用年限、里程的变化通常是非线性的(比如前几年贬值快,后期放缓),线性模型无法捕捉这种趋势。
因此,当前场景下多线性回归不是合适选择,建议尝试:
- 补充更多核心特征;
- 尝试非线性模型(如决策树、随机森林、梯度提升树),这类模型能自动捕捉非线性关系,对特征冗余的容忍度更高;
- 对现有特征做非线性变换(如对里程、年份取对数,或添加交互项)。
3. 能否仅靠R²信任模型
绝对不能。R²仅衡量特征对目标变异的解释程度,存在诸多局限性:
- 添加无关特征时,R²不会下降甚至可能轻微上升;
- 样本量极大时,即使R²很小,模型也可能通过统计显著性检验,但实际预测能力极差;
- 无法反映预测的误差大小(比如你的MAE高达2万多,远超价格均值的30%,说明预测误差极大)。
评估模型必须结合多个指标:
- 误差指标:MAE(反映平均偏差大小)、RMSE(对大误差更敏感),直观体现预测精准度;
- R²:辅助判断特征的解释力;
- 残差分析:查看残差是否随机分布,验证模型假设是否成立。
内容的提问来源于stack exchange,提问作者Filipe Santos
相关产品推荐
相关产品推荐

