Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在分层抽样中,即使数据更新,如何保持(几乎)相同的数据分割?_Python_Python 3.x_Scikit Learn_Training Data_Resampling - Fatal编程技术网

Python 在分层抽样中,即使数据更新,如何保持(几乎)相同的数据分割?

Python 在分层抽样中,即使数据更新,如何保持(几乎)相同的数据分割?,python,python-3.x,scikit-learn,training-data,resampling,Python,Python 3.x,Scikit Learn,Training Data,Resampling,通常,建议对数据集进行采样,以便在多次运行代码时测试集和训练集保持不变,以便进行比较,但也可以隐藏整个数据集的算法。由于数据集会发生变化,人们可能会从数据库中重新提取更新的数据集,因此一个稳定的过程是对id或唯一标识符使用哈希。例如,假设要将数据集划分为测试和训练,比率分别为0.2和0.8。在计算id的散列后,由于散列应导致均匀分布,因此可以获取最后一个字节,如果它小于0.2*256,则分配给数据集,否则分配给列车集 以下代码是此过程的一个示例: import hashlib def test

通常,建议对数据集进行采样,以便在多次运行代码时测试集和训练集保持不变,以便进行比较,但也可以隐藏整个数据集的算法。由于数据集会发生变化,人们可能会从数据库中重新提取更新的数据集,因此一个稳定的过程是对id或唯一标识符使用哈希。例如,假设要将数据集划分为测试和训练,比率分别为0.2和0.8。在计算id的散列后,由于散列应导致均匀分布,因此可以获取最后一个字节,如果它小于
0.2*256
,则分配给数据集,否则分配给列车集

以下代码是此过程的一个示例:

import hashlib

def test_set_check(identifier, test_ratio, hash):
    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]
如果我运行多次,由于固定的随机状态,它会生成相同的序列和测试集。然而,当数据库被更新或更改时,情况可能并非如此,我的训练集和测试集可能看起来非常不同


是否有一种方法将分层抽样与保持(几乎)相同的序列和测试集(即使数据更新)相结合以保持比率

在将新数据分别添加到训练数据集和测试数据集中之前,是否可以对新数据执行
StratifiedShuffleSplit()
?另一方面,我建议(尽管可能已经是您的情况)同时使用验证数据集和测试数据集(在您的情况下,在实际测试您的模型之前,测试数据集永远不会更改)。“重要的分类值”-请注意,sklearn只确保目标变量/类的原始比率,非分类特征(如果我没有弄错的话…“《混血王子》”你能更好地解释吗?@ShihabShahriarKhan我想你错了,我问题中分层抽样的确切代码取自一本书:它不太可能是错的。我的意思是:你首先使用分层创建一列火车和测试数据集,并将它们保留下来;然后,每当你有新数据时,你都要等到有足够的新数据(例如,如果你只对性别进行分层,那么大约有30/50个新的观察值)才能将
StratifiedShuffleSplit()
应用到由这些新观察值组成的新数据集,然后将第一个序列和测试数据集分别与刚刚创建的新序列和新测试数据集连接起来。这样,除了添加的数据外,您不会更改原始列车和测试。在将新数据分别添加到列车和测试数据集中之前,是否可以对新数据执行
StratifiedShuffleSplit()
?另一方面,我建议(尽管可能已经是您的情况)同时使用验证数据集和测试数据集(在您的情况下,在实际测试您的模型之前,测试数据集永远不会更改)。“重要的分类值”-请注意,sklearn只确保目标变量/类的原始比率,非分类特征(如果我没有弄错的话…“《混血王子》”你能更好地解释吗?@ShihabShahriarKhan我想你错了,我问题中分层抽样的确切代码取自一本书:它不太可能是错的。我的意思是:你首先使用分层创建一列火车和测试数据集,并将它们保留下来;然后,每当你有新数据时,你都要等到有足够的新数据(例如,如果你只对性别进行分层,那么大约有30/50个新的观察值)才能将
StratifiedShuffleSplit()
应用到由这些新观察值组成的新数据集,然后将第一个序列和测试数据集分别与刚刚创建的新序列和新测试数据集连接起来。这样,除了添加的数据外,您不会更改原始列车和测试。
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
#this loop is executed just once because n_splits=1?
for train_index, test_index in split.split(dataFrame, dataFrame["important_categorical_variable"]):
    train_set = dataFrame.loc[train_index]
    test_set  = dataFrame.loc[test_index]