在这篇文章中,将学习如何构建一个能够准确预测房价的模型。将从数据收集与分析、模型选择和评估等方面进行探讨。通过本指南,将获得必要的技能,以做出明智的决策,并引导客户找到最佳的投资机会。让开始吧!
在本文中,将: 1. 理解构建价格预测模型的过程。 2. 了解构建模型的过程,如数据分析、选择、预测、解释等。 3. 学习如何根据给定的数据集做出明智的决策。
将使用的数据集是Ames Housing Dataset,这是一个包含79个解释变量的数据集,描述了爱荷华州Ames市住宅的几乎所有方面。数据集可在Kaggle上找到并下载。数据集包含1460行和81列;目标变量是SalePrice列。数据集分为两个部分:train.csv和test.csv。train.csv文件包含目标变量,而test.csv文件不包含。test.csv文件用于在未见过的数据上测试模型的性能。
问题陈述是根据房屋的特征预测房屋的销售价格。特征是数据集中的列,目标变量是SalePrice列。由于目标变量是连续的,因此这是一个回归问题。
数据描述可在Kaggle上找到。数据描述包含了数据集中每个列的详细描述。数据描述非常有用,因为它提供了数据集中每个列的详细描述。它还提供了数据集中缺失值的信息。
本节将找出缺失值和异常值以及目标变量与特征之间的关系。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv('train.csv')
# 显示数据集中的所有列
pd.set_option('display.max_columns', None)
print(data.head())
# 制作包含缺失值的列的列表 missing_values = [col for col in data.columns if data[col].isnull().any()] # 打印每个列的缺失值数量和缺失值百分比 for col in missing_values: print(col, round(data[col].isnull().mean(), 3), ‘ % missing values’)
# 删除缺失值超过15%的列 data.drop(['Alley', 'FireplaceQu', 'PoolQC', 'Fence', 'MiscFeature'], axis=1, inplace=True) # 用最频繁的值填充剩余列的缺失值 new_missing_values = [col for col in data.columns if data[col].isnull().any()] for col in new_missing_values: if data[col].dtype == 'O': data[col].fillna(data[col].mode()[0], inplace=True) else: data[col].fillna(data[col].median(), inplace=True)
continuous_features = [col for col in data.columns if data[col].dtype != 'O'] for col in continuous_features: data_copy = data.copy() if 0 in data_copy[col].unique(): pass else: data_copy[col] = np.log(data_copy[col]) data_copy['SalePrice'] = np.log(data_copy['SalePrice']) plt.scatter(data_copy[col], data_copy['SalePrice']) plt.xlabel(col) plt.ylabel('SalePrice')
plt.figure(figsize=(10, 15)) # 绘制与目标变量'SalePrice'相关特征的热图 sns.heatmap(data.corr()[['SalePrice']].sort_values(by='SalePrice', ascending=False), annot=True, cmap='viridis')
现在已经清理并可视化了数据。下一步是构建一个模型来预测房屋的销售价格。可以使用多种不同的预测模型,包括多元线性回归、KNN回归器等。将使用一系列模型和管道,通过评估模型的准确性、精确度和召回率来找到最佳模型。还将使用交叉验证以确保模型泛化良好。
# 对分类变量进行数值编码
from sklearn.preprocessing import LabelEncoder
for col in data.columns:
if data[col].dtype == 'O':
label_encoder = LabelEncoder()
data[col] = label_encoder.fit_transform(data[col])
# 使用Ridge回归构建模型
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_squared_error
# 从特征和目标变量创建X和y变量
X = data[['OverallQual', 'GrLivArea', 'GarageCars', 'GarageArea', 'TotalBsmtSF', '1stFlrSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt', 'YearRemodAdd']]
y = data['SalePrice']
# 执行Ridge回归的函数
def ridge_regression(alpha, data):
ridge = Ridge(alpha=alpha)
ridge.fit(X, y)
scores = cross_val_score(ridge, X, y, scoring='neg_mean_squared_error', cv=5)
rmse = np.sqrt(-scores)
return rmse
# 寻找Ridge的最佳alpha值
alpha = [0.001, 0.01, 0.1, 1, 10, 100, 1000]
for i in alpha:
print('Alpha: ', i)
print('Mean RMSE: ', ridge_regression(i, data).mean())
print('Standard Deviation: ', ridge_regression(i, data).std())
print()