预测房价学习

news/2024/10/28 22:46:45/

1. 实现函数来方便下载数据

import hashlib
import os
import tarfile
import zipfile
import requestsDATA_HUB = dict()
DATA_URL = 'http://d2l-data.s3-accelerate.amazonaws.com/'def download(name, cache_dir=os.path.join('..', 'data')):"""下载一个DATA_HUB中的文件,返回本地文件名"""assert name in DATA_HUB, f"{name} 不存在于 {DATA_HUB}"url, sha1_hash = DATA_HUB[name]os.makedirs(cache_dir, exist_ok=True)fname = os.path.join(cache_dir, url.split('/')[-1])if os.path.exists(fname):sha1 = hashlib.sha1()with open(fname, 'rb') as f:while True:data = f.read(1048576)if not data:breaksha1.update(data)if sha1.hexdigest() == sha1_hash:return fname  # 命中缓存print(f'正在从{url}下载{fname}...')r = requests.get(url, stream=True, verify=True)with open(fname, 'wb') as f:f.write(r.content)
return fname

2.使用pandas读入并处理数据

%matplotlib inline
import numpy as np
import pandas as pd
import torch
from torch import nn
from d2l import torch as d2lDATA_HUB['kaggle_house_train'] = (DATA_URL + 'kaggle_house_pred_train.csv','585e9cc93e70b39160e7921475f9bcd7d31219ce')DATA_HUB['kaggle_house_test'] = (DATA_URL + 'kaggle_house_pred_test.csv','fa19780a7b011d9b009e8bff8e99922a8ee2eb90')train_data = pd.read_csv(download('kaggle_house_train'))
test_data = pd.read_csv(download('kaggle_house_test'))print(train_data.shape)
print(test_data.shape)

3.查看前四个和最后两个特征以及相应标签(房价)

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

4. 在每个样本中,第一个特征是ID,有助于模型识别每个训练样本。 虽然这很方便,但它不携带任何用于预测的信息。因此,在将数据提供给模型之前,将其从数据集中删除。

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

5.将所有缺失的值替换为相应特征的平均值,通过将特征重新缩放到零均值和单位方差来标准化数据

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()))
all_features[numeric_features] = all_features[numeric_features].fillna(0)

6.处理离散值,诸如“MSZoning”之类特征,用独热编码替换

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

7.用价格预测的对数来衡量差异

def log_rmse(net, features, labels):# 为了在取对数时进一步稳定该值,将小于1的值设置为1clipped_preds = torch.clamp(net(features), 1, float('inf'))rmse = torch.sqrt(loss(torch.log(clipped_preds),torch.log(labels)))return rmse.item()

8.训练函数借助Adam优化器(对初始学习率不那么敏感)

def train(net, train_features, train_labels, test_features, test_labels,num_epochs, learning_rate, weight_decay, batch_size):train_ls, test_ls = [], []train_iter = d2l.load_array((train_features, train_labels), batch_size)# 这里使用的是Adam优化算法optimizer = torch.optim.Adam(net.parameters(),lr = learning_rate,weight_decay = weight_decay)for epoch in range(num_epochs):for X, y in train_iter:optimizer.zero_grad()l = loss(net(X), y)l.backward()optimizer.step()train_ls.append(log_rmse(net, train_features, train_labels))if test_labels is not None:test_ls.append(log_rmse(net, test_features, test_labels))return train_ls, test_ls

9.K折交叉验证

def get_k_fold_data(k, i, X, y):assert k > 1fold_size = X.shape[0] // kX_train, y_train = None, Nonefor j in range(k):idx = slice(j * fold_size, (j + 1) * fold_size)X_part, y_part = X[idx, :], y[idx]if j == i:X_valid, y_valid = X_part, y_partelif X_train is None:X_train, y_train = X_part, y_partelse:X_train = torch.cat([X_train, X_part], 0)y_train = torch.cat([y_train, y_part], 0)return X_train, y_train, X_valid, y_valid

10. 在K折交叉验证中训练K次后,返回训练和验证误差的平均值

def k_fold(k, X_train, y_train, num_epochs, learning_rate, weight_decay,batch_size):train_l_sum, valid_l_sum = 0, 0for i in range(k):data = get_k_fold_data(k, i, X_train, y_train)net = get_net()train_ls, valid_ls = train(net, *data, num_epochs, learning_rate,weight_decay, batch_size)train_l_sum += train_ls[-1]valid_l_sum += valid_ls[-1]if i == 0:d2l.plot(list(range(1, num_epochs + 1)), [train_ls, valid_ls],xlabel='epoch', ylabel='rmse', xlim=[1, num_epochs],legend=['train', 'valid'], yscale='log')print(f'折{i + 1},训练log rmse{float(train_ls[-1]):f}, 'f'验证log rmse{float(valid_ls[-1]):f}')return train_l_sum / k, valid_l_sum / k


http://www.ppmy.cn/news/1542703.html

相关文章

医疗保健知识中台:引领医疗行业智能化转型的新篇章

前言 随着科技的迅猛进步,医疗保健领域正迎来一场深刻的智能化变革。在这场变革中,知识中台作为医疗行业智能化升级的重要基石,正逐步成为提升医疗服务质量和效率的关键驱动力。本文将深入剖析医疗保健知识中台的内容构成、应用场景以及更新…

增长黑客方法论

增长黑客(Growth Hacking)的核心方法论 主要包括以下几个方面: 数据驱动:增长黑客依赖数据来做决策,通过数据分析来发现增长机会和问题。数据不仅包括用户行为数据,还包括市场数据、竞争对手数据等。 快…

Redis 基础 问题

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 基础 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 基础 & 总结》(学习总结/最新最准/持续更新)《Redis & 基础…

想作弊❓用这个发起考试,根本没法作弊

🎉 推荐一款超实用的在线考试神器 —— 土著刷题✨ 如果你正在寻找一个既方便又高效的在线考试平台,那么“土著刷题”小🍊序绝对值得一试!它不仅完全免费,而且操作简单,非常适合用来组织线上测试。 &#x…

MySQL练习题-求连续、累计、环比和同比问题

目录 准备数据 1)求不同产品每个月截止当月最近3个月的平均销售额 2)求不同产品截止当月的累计销售额 3)求环比增长率和同比增长率 准备数据 -- product 表示产品名称,ym 表示年月,amount 表示销售金额&#xff…

大数据导论第一章作业

第一章 作业 2、请阐述把数据变得可用需要经过哪几个步骤? 答:①数据清洗。使用数据的第一步就是要将数据变成一种可用的状态。这个过程通常需要运用借助工具去实现数据转换。 ②数据管理。关系数据库以规范化的行和列的形式保存数据,并可进…

当两个文件互相包含并各自掉用了对方的函数将出现什么情况

今天遇到一个很特殊的问题。 报函数不存在: [2024-10-28T17:50:51.082] [DEBUG] app - err: TypeError: ApiMinePropertyListingManagerService.collectPropertyListing is not a functionat Function.call (/www/project/app/event_center/erp/property_listing/erp_listing_…

CentOS系统Nginx的安装部署

CentOS系统Nginx的安装部署 安装包准备 在服务器上准备好nginx的安装包 nginx安装包下载地址为:https://nginx.org/en/download.html 解压 tar -zxvf nginx-1.26.1.tar.gz执行命令安装 # 第一步 cd nginx-1.26.1# 第二步 ./configure# 第三步 make# 第四步 mak…