使用MinMaxScaler训练模型后,如何预测真实房价?
问题:房价预测模型缩放后预测结果不符合实际范围
我正在House Pricing数据集上建模,目标是获取MSE结果并基于输入变量预测房价。使用MinMaxScaler()对数据做缩放处理,搭配LinearRegression()训练模型,已经得到MSE、MAE、RMSE等评估指标,但预测真实房价时,结果是缩放后的值,输入真实特征值得到的预测结果也不符合实际房价范围(实际应为208500、181500这类数万美金级别)。以下是我的代码及运行结果:
import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder, MinMaxScaler from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, mean_absolute_error from sklearn.model_selection import train_test_split # 原代码遗漏该导入 train = pd.read_csv('train.csv') column = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt'] train = train[column] # Convert Feature/Column with Scaler scaler = MinMaxScaler() train[column] = scaler.fit_transform(train[column]) X = train.drop('SalePrice', axis=1) y = train['SalePrice'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=15) # Calling LinearRegression model = LinearRegression() # Fit linearregression into training data model = model.fit(X_train, y_train) y_pred = model.predict(X_test) # Calculate MSE (Lower better) mse = mean_squared_error(y_test, y_pred) print("MSE of testing set:", mse) # Calculate MAE mae = mean_absolute_error(y_test, y_pred) print("MAE of testing set:", mae) # Calculate RMSE (Lower better) rmse = np.sqrt(mse) print("RMSE of testing set:", rmse) # Predict the Price House by input: overal_qual = 6 grlivarea = 1217 garage_cars = 1 totalbsmtsf = 626 fullbath = 1 year_built = 1980 predicted_price = model.predict([[overal_qual, grlivarea, garage_cars, totalbsmtsf, fullbath, year_built]]) print("Predicted price:", predicted_price)
运行结果:
MSE of testing set: 0.0022340806066149734 MAE of testing set: 0.0334447655149599 RMSE of testing set: 0.04726606189027147 Predicted price: [811.51843959]
解决方法
你遗漏了两个核心步骤:
输入特征未匹配训练时的缩放规则
模型训练用的是缩放后的特征数据,但预测时直接输入了原始范围的特征值,导致模型输出异常。必须用训练时拟合好的scaler对输入特征做**仅转换(transform)**处理,不能重新fit(否则会覆盖训练时的缩放分布)。预测结果未逆缩放还原为真实房价
模型输出的是经过缩放的房价值,需要用scaler.inverse_transform()将结果还原到原始房价的数值范围。
优化后的关键代码片段
第一步:规范拆分特征与标签的缩放逻辑(避免混淆)
建议分别对特征和标签使用独立的缩放器,后续逆变换更清晰:
# 拆分特征与标签 X = train.drop('SalePrice', axis=1) y = train['SalePrice'].values.reshape(-1, 1) # 初始化特征和标签的缩放器 scaler_X = MinMaxScaler() scaler_y = MinMaxScaler() # 拟合并转换特征与标签 X_scaled = scaler_X.fit_transform(X) y_scaled = scaler_y.fit_transform(y) # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=15)
第二步:预测时的特征缩放与结果逆缩放
# 准备输入特征,转为二维数组(符合scaler输入要求) input_features = np.array([[overal_qual, grlivarea, garage_cars, totalbsmtsf, fullbath, year_built]]) # 对输入特征应用训练时的缩放规则 input_scaled = scaler_X.transform(input_features) # 预测缩放后的房价 pred_scaled = model.predict(input_scaled) # 逆缩放还原为真实房价 predicted_price = scaler_y.inverse_transform(pred_scaled) print("Predicted price:", predicted_price[0][0])
额外修正
原代码遗漏train_test_split的导入,需要添加:
from sklearn.model_selection import train_test_split
内容的提问来源于stack exchange,提问作者MADFROST
相关产品推荐
相关产品推荐

