3 回答

TA贡献1804条经验 获得超7个赞
您可以直接使用 StratifiedKFold() 或 StratifiedShuffleSplit() 来根据某些分类列使用分层采样来分割数据集。
虚拟数据:
import pandas as pd
import numpy as np
np.random.seed(43)
df = pd.DataFrame({'ID': (1,1,2,2,3,3),
'Object': ('bus', 'car', 'bus', 'bus', 'bus', 'car'),
'X' : np.random.randint(0, 10, 6),
'Y' : np.random.randn(6)
})
df
使用 StratifiedKFold()
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=2)
for train_index, test_index in skf.split(df, df["Object"]):
strat_train_set_1 = df.loc[test_index]
strat_test_set_1 = df.loc[test_index]
print('train_set :', strat_train_set_1, '\n' , 'test_set :', strat_test_set_1)
同样,如果您选择使用 StratifiedShuffleSplit(),您可以
from sklearn.model_selection import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
# n_splits = Number of re-shuffling & splitting iterations.
for train_index, test_index in sss.split(df, df["Object"]):
# split(X, y[, groups]) Generates indices to split data into training and test set.
strat_train_set = df.loc[train_index]
strat_test_set = df.loc[test_index]
print('train_set :', strat_train_set, '\n' , 'test_set :', strat_test_set)

TA贡献1818条经验 获得超8个赞
我会简单地使用KFoldpython 的 scikit-learn 方法来做到这一点
from numpy import array
from sklearn.model_selection import KFold
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
kfold = KFold(3, True, 1)
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train], data[test]))

TA贡献1797条经验 获得超4个赞
创建交叉验证拆分时,我们关心创建的折叠,这些折叠对数据中遇到的各种“案例”具有良好的分布。
就您而言,您决定根据汽车数量和边界框数量进行折叠,这是一个不错但有限的选择。因此,如果您可以使用数据/元数据识别特定情况,您可以尝试使用它创建更智能的折叠。
最明显的选择是平衡折叠中的对象类型(类),但您可以走得更远。
这是主要思想,假设您有主要在法国遇到的汽车的图像,以及主要在美国遇到的其他汽车的图像,它可以用于创建良好的折叠,每个折叠中法国和美国汽车的数量保持平衡。天气条件等也可以这样做。因此,每次折叠都将包含可供学习的代表性数据,以便您的网络不会对您的任务产生偏见。因此,您的模型对于现实生活中数据的潜在变化将更加稳健。
那么,您可以在交叉验证策略中添加一些元数据来创建更好的简历吗?如果不是这种情况,您能否使用数据集的 x、y、w、h 列获取有关潜在极端情况的信息?
然后,您应该尝试在样本方面进行平衡折叠,以便在相同的样本大小上评估您的分数,这将减少方差并最终提供更好的评估。
添加回答
举报