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