项目4 房屋价格预测

本文介绍了如何从Kaggle的HousePrices数据集中预处理数据,包括标签列的对数变换使其正态分布,以及使用岭回归模型进行回归分析,优化α参数选择,最终实现数据归一化并计算MAE。
摘要由CSDN通过智能技术生成

数据集来自Kaggle:House Prices - Advanced Regression Techniques | Kaggle

首先对数据集进行处理:

        将去掉标签的数据集和测试集合并一起处理,在处理完成后再划分回各自集合。

        标签列在处理前整体呈大概泊松分布,需要进行处理。

 

        其中np.log1p是对标签列进行对数变化,使整体数据呈正态分布。

train_data=pd.read_csv('train.csv')
test_data=pd.read_csv('test.csv')

#dataset=dataset.drop('SalePrice',axis='columns')
#查看标签数据整体分布情况
'''
sns.displot(dataset['SalePrice'])
plt.show()
'''
#pop之后原数据已经去除了标签列,并对标签列进行了对数转换
y_train = np.log1p(train_data.pop("SalePrice"))
#print(y_train)
#将测试集与数据集的其他数据进行合并同步处理
dataset=pd.concat((train_data, test_data), axis=0)
dataset=dataset.drop('Id',axis='columns')
#print(dataset)

dataset["MSSubClass"] = dataset["MSSubClass"].astype(str)
#对缺失值进行平均值填补
all_dummy_data = pd.get_dummies(dataset)
mean_cols = all_dummy_data.mean()
all_dummy_data = all_dummy_data.fillna(mean_cols)
#print(all_dummy_data.isnull().sum().sum())

#提取数值类型的列
numeric_cols = dataset.columns[dataset.dtypes != "object"]
numeric_col_means = all_dummy_data.loc[:, numeric_cols].mean()
numeric_col_std = all_dummy_data.loc[:, numeric_cols].std()
all_dummy_data.loc[:, numeric_cols] = (all_dummy_data.loc[:, numeric_cols] - numeric_col_means)/numeric_col_std

X_train = all_dummy_data.iloc[0:1460].values
X_test=all_dummy_data.iloc[1460:2919].values

数据转换效果查看:

        可以使用以下代码查看对数转换后数据效果,并与标准正态分布进行对比。

#设置符号显示
plt.rcParams['axes.unicode_minus']=False
#绘制转换后的直方图, fit=norm可以绘制正态分布曲线作为对比
sns.distplot(dataset['SalePrice'], fit=norm)
#拟合SalePrice的正态分布参数
(mu, sigma) = norm.fit(dataset['SalePrice'])
#查看正态分布参数
print('\n mu={:.2f} and sigma={:.2f} \n'.format(mu, sigma))

plt.legend(['Normal dist.($\mu=$ {:.2f} and $\sigma=$ {:.2f})'.format(mu, sigma)], loc='best')
plt.ylabel('Frequency')
plt.title('Distribution')

#创建新图像,不然两个图会画到一起
fig = plt.figure()
#绘制Q-Q图,只要Q-Q图呈一条直线表示数据呈正态分布
stats.probplot(dataset['SalePrice'], plot=plt)
plt.show()

 

 经过对数处理后可以看出整体数据呈正态分布,Q-Q图结果也表明数据呈正态分布。

 回归分析模型使用sklearn中的岭回归模型,首先进行模型中α参数的选取:

alphas = np.logspace(-3, 2, 50)
test_scores = []
for alpha in alphas:
    clf = Ridge(alpha)
    test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10,scoring="neg_mean_squared_error"))
    test_scores.append(np.mean(test_score))

plt.plot(alphas, test_scores)
plt.xlabel("alphas")
plt.ylabel("test scores")
plt.show()

 可以看出在α约为15的时候效果最好。

对训练集数据进行拟合并保存结果,查看拟合数据MAE。

ridge = Ridge(alpha=15)
ridge.fit(X_train, y_train)
y_ridge = np.expm1(ridge.predict(X_train))
submission_data = pd.DataFrame(data={"Id": test_data.index, "SalePrice": y_ridge})
submission_data.to_csv("submission_0.csv", index=False)
print(mean_absolute_error(np.expm1(y_train),y_ridge))

MAE结果为:13649.486520362263

对数据进行归一化处理可以使得训练效果更好。

参考网址:

https://zhuanlan.zhihu.com/p/130364126
机器学习实战:kaggle房价回归预测实战 | 记忆碎片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值