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

创建测试集

随机选择一些实例,通常是数据集的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]

 

上一篇:计算机二级:二进制的字符串转十进制;四种格式化输出方法replace,join,isdigit,isalpha,isalnum,split,splitlines的用法


下一篇:2021-09-30