机器学习_拆分测试集与训练集(基础)

本文详细介绍了四种数据集抽取方法:自定义函数、ID的哈希值抽取、sklearn函数随机抽取与分层抽取,以及sklearn函数分层抽取的原理与应用。通过对比分析,展示了分层抽取在保持数据分布上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、自编函数简单随机抽取

#!/usr/bin/python
# 加载包
import numpy as np 
import pandas as pd

def split_train_test(data, test_ratio,seed = 1234):
    np.random.seed(seed)  # 使得生成的测试训练集具有可重复性
    index = np.random.permutation(len(data))  # 乱序
    t_size = int(len(data) * test_ratio)
    test_index = index[: t_size]
    train_index = index[t_size :]
    return data.iloc[train_index], data.iloc[test_index] # interge 

该方法可以保证每次生成的数据集相同
但当数据刷新时,该方法又失效。
使用唯一ID 对数据进行分组才是保证更新数据后也照样和之前分的相同,仅加入了新增的数据

2、ID的哈希值抽取

#!/usr/bin/python
import hashlib 

def test_set_check(identifier, test_ratio, hash = hashlib.md5):
    """
    对哈希值加密后用二进制表示,提取最后一个字节
    对最后一个字节按照 256(一个字节大小) * test_ratio 划分成两类
    :param identifier: 需要处理成hashlib.md5 的ID编码
    :param test_ratio: 提取测试集的占比
    :return: 布尔值
    """
    return hash(np.int64(identifier)).digest()[-1] < 256 * test_ratio  # 加密后的结果用二进制表示

def split_train_test_by_id(data, test_ratio, id_column, hash=hashlib.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]

3、sklearn函数随机抽取

# 从model_selection中载入分测试集训练集函数
from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(data, test_size = 0.2, random_state = 42)

4、sklearn函数分层抽取

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(data, data['income_cat']):
    strat_train_set = data.loc[train_index]
    strat_test_set = data.loc[test_index]

分层采样的比例几乎和原数据集一样 优于 随机抽样

两者数据抽样比例比较如下:

# 原数据
a = data['income_cat'].value_counts()/len(data)

# 分层抽样
ftr = strat_train_set['income_cat'].value_counts()/len(strat_train_set)
fte = strat_test_set['income_cat'].value_counts()/len(strat_test_set)

# 随机抽样
train_set, test_set = train_test_split(data, test_size = 0.2, random_state = 42)
sjtr = train_set['income_cat'].value_counts()/len(train_set)
sjte = test_set['income_cat'].value_counts()/len(test_set)

# 查看标准差
np.std(ftr - a), np.std(fte - a), np.std(sjtr - a), np.std(sjtr - a)

某一数据比较结果如下:

(2.1667325363377233e-05, 8.666930145347169e-05, 0.001571964081795336, 0.001571964081795336)

###显然分层抽样效果更佳

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Scc_hy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值