文章目录
房价预测比赛链接:https://www.kaggle.com/c/house-prices-advanced-regression-techniques

1.下载和缓存数据集
我们建立字典DATA_HUB, 它可以将数据集名称的字符串映射到数据集相关的二元组上, 这个二元组包含数据集的url和验证文件完整性的sha-1密钥。 所有类似的数据集都托管在地址为DATA_URL的站点上(这里只托管了小一点的数据集,大的数据集还是需要去官网下载)。
import hashlib # Python的哈希库,用于文件校验(计算SHA1、MD5等哈希值)
import os # 操作系统接口库 用于处理文件路径、目录创建等操作
import tarfile # 导入tar文件处理库 用于解压缩.tar、.tar.gz、.tar.bz2等归档文件
import zipfile # 导入zip文件处理库 用于解压缩.zip格式的压缩文件
import requests # 导入HTTP请求库 提供简洁的API用于网络文件下载
DATA_HUB = dict()
DATA_URL = 'http://d2l-data.s3-accelerate.amazonaws.com/'
一般情况需要自己去Kaggle将数据集下载到本地目录。这里使用一个download函数用来下载数据集, 将数据集缓存在本地目录(默认情况下为../data)中, 并返回下载文件的名称。 如果缓存目录中已经存在此数据集文件,并且其sha-1与存储在DATA_HUB中的相匹配, 我们将使用缓存的文件,以避免重复的下载。
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:
break
sha1.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
竞赛数据分为训练集和测试集。 每条记录都包括房屋的属性和属性值,如街道类型、施工年份、屋顶类型、地下室状况等, 这些特征由各种数据类型组成。 例如,建筑年份由整数表示,屋顶类型由离散类别表示,其他特征由浮点数表示。 这就是现实让事情变得复杂的地方:例如,一些数据完全丢失了,缺失值被简单地标记为“NA”。
每套房子的价格只出现在训练集中,我们将划分训练集以创建验证集,但是在将预测结果上传到Kaggle之后, 我们只能在官方测试集中评估我们的模型。
训练集拆分 训练集+验证集 , 测试集用于评估模型。
方法1:Kaggle 比赛网站中下载数据
加入比赛后,可以在Data下载数据集。

方法2:代码远程下载
使用上面定义的脚本下载并缓存Kaggle房屋数据集。
import numpy as np
import pandas as pd
import torch
from torch import nn
from d2l import torch as d2l
DATA_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'))

2.数据预处理
读取样本
训练数据集包括1460个样本,每个样本80个特征和1个标签, 而测试数据集包含1459个样本,每个样本80个特征。
# 使用pandas分别加载包含训练数据和测试数据的两个CSV文件。
train_data = pd.read_csv(download('kaggle_house_train'))
test_data = pd.read_csv(download('kaggle_house_test'))
print(train_data.shape) #(1460,81)
print(test_data.shape) #(1459,80)
查看一下前4个样本的前四个特征以及最后二个特征以及相应标签(房价)
# train_data 是一个Pandas DataFrame对象 通常包含表格数据(行是样本/记录,列是特征/字段)
# iloc 按位置索引选择数据的属性,第一个参数为行选择器,第二个参数为列选择器
print(train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]])

在每个样本中,第一个特征是ID, 它不携带任何用于预测的信息。 因此,在将数据提供给模型之前,我们将其从数据集中删除。
# train_data.iloc[:, 1:-1] 选择所有行,选取第二列和倒数第二列 排除训练集的第一列(通常是ID)和最后一列(通常是标签/目标变量)
# test_data.iloc[:, 1:] 测试集选取从第2列开始到最后一列的所有列
# 参数2接着参数1,将多个DataFrame连接成一个新的DataFrame
all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:]))
预处理样本
数值型特征处理
- 将数据中所有缺失的值替换为相应特征的平均值。
- 为了将所有特征放在一个共同的尺度上, 我们通过将特征重新缩放到零均值和单位方差来标准化数据 x 标准 = x − μ σ x_{标准}=\frac{x−μ}{σ} x标准=σx−μ。
其中 μ μ μ和 σ σ σ分别表示特征 x x x均值和标准差。 这些特征具有零均值和单位方差,即 E [ x − μ σ ] = μ − μ σ = 0 E[\frac{x−μ}{σ}] = \frac{μ-μ}{σ}=0 E[σx−μ]=σμ−μ=0和 E [ ( x − μ ) 2 ] = ( σ 2 + μ 2 ) − 2 μ 2 + μ 2 = σ 2 E[(x−μ)^2]=(σ^2+μ^2)−2μ^2+μ^2=σ^2 E[(x−μ)2]=(σ2+μ2)−2μ2+μ2=σ2。
all_features.dtypes返回pandas Series对象,包含索引index:列名 值values:对应的数据类型。
all_features.dtypes != 'object'比较的存储在Series中的实际值(values),返回布尔Series

布尔Series机制
在 pandas 中,当您使用一个布尔 Series 来索引另一个 Series 时,pandas 会选择布尔 Series 中值为 True 的所有对应元素。
- 对齐索引:首先 pandas 会根据索引名称对齐两个 Series
- 选择元素:然后只保留布尔 Series 中值为
True的位置对应的元素 - 返回结果:返回一个新的 Series,包含所有被选中的元素
# numeric_features包含所有数值型特征列名的列表
numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index
all_features[numeric_features]是根据列名选择all_features的DataFrame子集。
DataFrame.apply会遍历每一列,每次取一列数据作为Series传入lambda函数进行标准化 x 标准 = x − μ σ x_{标准}=\frac{x−μ}{σ} x标准=

最低0.47元/天 解锁文章

946

被折叠的 条评论
为什么被折叠?



