作者:gl君 | 来源:互联网 | 2023-09-04 17:59
一、下载数据
下载并解压数据:housing.tgz
数据地址:https://github.com/ageron/handson-ml/tree/master/datasets/housing
二、读取数据
import pandas as pd
housing=pa.read_csv('./housing.csv')
三、观察数据
head()输出前5个数据和表头
info()输出每个特征的元素总个数,因此可以查看特征是否存在缺失值。还可以查看类型及内存占用情况。
value_counts()统计特征中每个元素的总个数
describe()可以查看实数特征的统计信息(最大值、最小值、平均值、方差、总个数、25%、50%、75%小值)
hist()输出实数域直方图
四、分开训练集和测试集
为了最终验证模型是否具有推广泛化能力,需要分开训练集于测试集,假设将数据集分为80%训练,20%测
试。下面为一种普遍的分开数据集的代码:
import numpy as np
def split_train_test(data,test_ratio):
shuffled_indices=np.random.permutation(len(data))
test_set_size=int(len(data)*test_ratio)
test_indics=shuffled_indices[:test_set_size]
train_indices=shuffled_indices[test_set_size:]
return data.iloc[train_indices],data.iloc[test_indics]
train_set,test_set=split_train_test(housing,0.2)
这虽然能正确的分开训练、测试集,但是如果重新运行程序,训练和测试集会不一样。假设在原来模型的基础
上继续训练,则不能保证测试集没有被模型训练过,因此不能验证模型效果。下面有两种方案:
方案一:使用在shuffle之前(即permutation),调用np.random.seed(42),则每次运行shuffle的结果一样(即
训练、测试集一样)。但是如果新增加了一些数据集,则这个方案将不可用。
方案二:为了解决方案一的问题,采用每个样本的识别码(可以是ID,可以是行号)来决定是否放入测试集,
例如计算识别码的hash值,取hash值得最后一个字节(0~255),如果该值小于一个数(20% * 256)则放入
测试集。这样,这20%的数据不会包含训练过的样本。具体代码如下:
import numpy as np
from hashlib import md5
def test_set_check(identifier,test_ratio,hash):
return hash(np.int64(identifier)).digest()[-1]<256*test_ratio
def split_train_test_by_id(data,test_ratio,id_column,hash=md5):
ids=data[id_column]
in_test_set=ids.apply(lambda id_:test_set_check(id_,test_ratio,hash))
return data.loc[~in_test_set],data.loc[in_test_set]
housing_with_id=housing.reset_index()
train_set,test_set=split_train_test_by_id(housing_with_id,0.2,'index')
实际上,scikit-Learn也提供了相关的分开训练集和测试集的函数
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=0)