机器学习实战——创建测试集10/8

本文介绍了在Python中使用numpy和sklearn库进行数据集划分的方法,包括随机抽样和分层抽样,如使用`split_train_test`函数和`StratifiedShuffleSplit`进行训练集和测试集的划分,以及为确保样本一致性引入标识符和收入类别划分策略。
摘要由CSDN通过智能技术生成

1. 创建测试集

1.1 随机抽样

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_indices = shuffled_indices[:test_set_size] # 测试集的索引
	train_indices = shuffled_indices[test_set_size:] # 训练集的索引
	return data.iloc[train_indices], data.iloc[test_indices] #data.iloc:读取行或列

train_set, test_set = split_train_test(housing, 0.2) #生成训练集和测试集

缺点:如果再运行一遍,它又会产生一个不同的数据集,这样下去,将会看到整个完整的数据集。
解决方案:每个实例都使用一个标识符来决定是否进入测试集(假定每个实例都有一个唯一且不变的标识符)

from zlib import crc32
def test_set_check(identifier, test_ratio):
    return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32  # 如果它低于 test_ratio * maximum 截止点,则认为它已被选中
    
def split_train_test_by_id(data, test_ratio, id_column):
    ids = data[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio)) #测试集标识符
    return data.loc[~in_test_set], data.loc[in_test_set]

但是housing数据集没有标识符列,可以尝试使用某个最稳定的特征来创建唯一标识符。例如,可以将一个区域的经纬度组合成如下的ID:

housing_with_id["id"] = housing["longitude"] * 1000 + housing["latitude"]
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "id")

Scikit-Learn提供了一些函数,可以通过多种方式将数据集分成多个子集。最简单的函数是train_test_split():

from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

如果数据集足够庞大(特别是相较于属性的数量而言),纯随机的抽样方法通常不错;如果不是,则有可能会导致明显的抽样偏差。

1.2 分层抽样

用pd.cut()来创建5个收入类别属性的(用1~5来做标签),0~1.5是类别1,1.5~3是类别2,以此类推:

housing["income_cat"] = pd.cut(housing["median_income"],bins=[0., 1.5, 3.0, 4.5, 6., np.inf],labels=[1, 2, 3, 4, 5])

根据收入类别进行分层抽样了。使用Scikit-Learn的StratifiedShuffleSplit类:

from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in split.split(housing, housing["income_cat"]):
    strat_train_set = housing.loc[train_index]
    strat_test_set = housing.loc[test_index]                                       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值