kaggle房价预测

该博客基于kaggle的住宅数据预测房屋销售价格,是回归问题。介绍了获取和读取数据集、预处理数据、训练模型、K折交叉验证、模型选择和预测等步骤。还测试了不同loss函数、学习率、优化算法等,分析结果表明数据预处理能提高模型效果,并给出遇到问题的解决方法。

1项目介绍

基于kaggle网站所提供的爱荷华州埃姆斯的住宅数据信息,预测每间房屋的销售价格,数据的标签SalePrice是连续性数据,因此可以判定这是一个回归问题。

最终目标:预测每一个房屋的销售价格。对于测试集中的每个ID,预测SalePrice变量的值

 

判定标准:根据预测值的对数与观察到的销售价格的对数之间的均方根误差(RMSE)评估提交的内容(采取对数意味着预测昂贵房屋和廉价房屋的错误将同等影响结果).

数据描述:数据来源于kaggle网站。数据分为训练数据集和测试数据集。两个数据集都包括每栋房⼦的特征,如街道类型、建造年份、房顶类型、地下室状况等特征值。这些特征值有连续的数字、离散的标签甚⾄是缺失值“na”。只有训练数据集包括了每栋房⼦的价格,也就是标签。训练数据和测试数据分别各有1460条,数据的特征列有79个,期中35个是数值类型的,44个类别类型

2模型代码分布及作用介绍

2.1获取和读取数据集

2.1.1加载依赖库(torch):

import torch
import torch.nn as nn
import numpy as np
import pandas as pd
import sys
sys.path.append("..")
import d2l as d2l
print(torch.__version__)
torch.set_default_tensor_type(torch.FloatTensor)

2.1.2加载数据:

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

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

2.1.3查看一下训练集,测试集的特征(维度):

print(train_data.shape)

print(test_data.shape)

print(train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]])

结果:

(1460, 81)

(1459, 80)

   Id  MSSubClass MSZoning  LotFrontage SaleType SaleCondition  SalePrice

0   1          60       RL         65.0       WD        Normal     208500

1   2          20       RL         80.0       WD        Normal     181500

2   3          60       RL         68.0       WD        Normal     223500

3   4          70       RL         60.0       WD       Abnorml     140000

2.1.4去除特征id,提高训练模型的准确度(第⼀个特征是Id,它能帮助模型记住每个训练样本,但难以推⼴到测试样本):

all_features= pd.concat((train_data.iloc[:, 1:-1],test_data.iloc[:, 1:]))

2.2预处理数据

2.2.1对连续数值的特征做标准化

numeric_features = all_features.dtypes[all_features.dtypes !='object'].index

all_features[numeric_features] =all_features[numeric_features].apply(lambda x: (x - x.mean()) / (x.std()))

# 标准化后,每个特征的均值变为0,所以可以直接⽤0来替换缺失值

all_features = all_features.fillna(0)

2.2.2将离散数值转成指示特征

# dummy_na=True将缺失值也当作合法的特征值并为其创建指示特征

all_features = pd.get_dummies(all_features, dummy_na=True)

all_features.shape # (2919, 354)

2.2.3通过 values 属性得到NumPy格式的数据,并转成 ndarray ⽅便后⾯的训练

n_train = train_data.shape[0]

train_features = torch.tensor(all_features[:n_train].values.astype(np.float32))

test_features = torch.tensor(all_features[n_train:].values.astype(np.float32))

train_labels = torch.tensor(train_data.SalePrice.values.astype(np.float32)).view(-1, 1)

2.3训练模型

2.3.1使⽤⼀个基本的线性回归模型和平⽅损失函数来训练模型

loss = torch.nn.MSELoss()

def get_net(feature_num):

    net = nn.Linear(feature_num, 1)

    for param in net.parameters():

        nn.init.normal_(param, mean=0, std=0.01)

    return net

2.3.2使用对数均⽅根误差评价模型

def log_rmse(net, features, labels):

 with torch.no_grad():

 # 将⼩于1的值设成1,使得取对数时数值更稳定

 clipped_preds = torch.max(net(features), torch.t

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恶心猫charming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值