题目:
- 从Kaggle的“House Prices - Advanced Regression Techniques”数据集
- 使用Pandas读取数据,并查看数据的基本信息。
- 选择一些你认为对房屋价格有重要影响的特征,并进行数据预处理(如缺失值处理、异常值处理等)。
- 使用matplotlib绘制特征与目标变量(房屋价格)之间的散点图或箱线图,观察它们之间的关系。
- 将数据分为训练集和测试集。
- 使用numpy或scikit-learn搭建一个线性回归模型,并在训练集上进行训练。
- 在测试集上评估模型的性能,并计算均方误差(MSE)或均方根误差(RMSE)。
- 尝试使用不同的特征组合或进行特征选择,观察模型性能的变化。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
# 设置中文显示
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
def load_data(file_path):
"""加载数据并查看基本信息"""
df = pd.read_csv(file_path, encoding="utf-8")
print("数据基本信息:",df.columns)
return df
def preprocess_data(df, features, target):
"""数据预处理:去除重复特征、处理缺失值和异常值"""
features = list(set(features)) # 去除重复特征
X = df[features]
Y = df[target]
# 合并特征和目标变量
combined = pd.concat([X, Y], axis=1)
# 删除包含缺失值的行
combined = combined.dropna()
# 异常值处理(使用 IQR 方法)
def remove_outliers(df):
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
df = df[~((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).any(axis=1)]
return df
combined = remove_outliers(combined)
# 重新分离特征和目标变量
X = combined[features]
Y = combined[target]
return X, Y
def plot_features(X, Y):
"""绘制特征与目标变量的散点图"""
for feature in X.columns:
plt.scatter(X[feature], Y)
plt.title(f"{feature}-房价")
plt.xlabel(feature)
plt.ylabel("房价")
plt.show()
def train_model(X, Y):
"""划分训练集和测试集,训练模型并评估性能"""
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=22)
# 数据标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 训练模型
estimator = Ridge(alpha=1)
estimator.fit(x_train, y_train)
# 预测
y_predict = estimator.predict(x_test)
# 评估模型
ret = estimator.score(x_test, y_test)
mse = mean_squared_error(y_test, y_predict)
rmse = np.sqrt(mse)
print("预测值:", y_predict)
print("准确率:", ret)
print("均方误差(MSE):", mse)
print("均方根误差(RMSE):", rmse)
return estimator
if __name__ == "__main__":
file_path = "./data/train.csv"
df = load_data(file_path)
x = ['GrLivArea', 'OverallQual', 'TotalBsmtSF', 'GarageCars']
y = ['SalePrice']
X, Y = preprocess_data(df, x, y)
plot_features(X, Y)
model = train_model(X, Y)
结果展示:
准确率: 0.8232886900015453
均方误差(MSE): 591601359.6413734
均方根误差(RMSE): 24322.856732739543