ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【数据处理与分析】 数据集的创建

2021-10-01 17:31:26  阅读:142  来源: 互联网

标签:分析 set ratio 创建 test train split 数据处理 data


创建测试集

随机选择一些实例,通常是数据集的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_indices = shuffled_indices[:test_set_ratio]
    train_indices = shuffled_indices[test_set_ration:]
    return data.iloc[train_indices], data.iloc[test_indices]

上述方法每次运行都会产生不同的数据集,解决方法之一可以在第一次运行程序后保存数据集,随后的运行只是加载。另一种方法在调用np.random.permutation()前设置一个随机数生成器种子,例如np.random.seed(42),从而使它始终生成相同的随机索引。

 

Scikit-Learn提供函数train_test_split(),与前面定义的函数train_test_split()几乎相同。它有random_state参数,用于设置生成随机生成器种子。

from sklearn.model_selection import train_test_split

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

 

上述方法在获取更新的数据时会中断,常见的解决方法是每个实例都使用一个标识符决定是否进入测试集。例如计算每个实例标识符的哈希值,若小于等于最大哈希值的20%, 则将该实例放入测试集。

from zlib import crc32

def test_set_check(identifier, test_ratio):
    return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32

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]

 

有时数据集分为不同类别(如男性52%,女性48%),需要分层抽样,纯随机抽样会导致测试集抽样偏斜。

使用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(data, data["some_feature"]):
    strat_train_set = data.loc[train_index]
    strat_test_set = data.loc[test_index]

 

标签:分析,set,ratio,创建,test,train,split,数据处理,data
来源: https://www.cnblogs.com/kyfishing/p/15359735.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有