您不应该根据独立变量(也称为特征)对数据集进行分区...为什么?
很简单,因为您最终会得到一个几乎可以保证的不平衡分布。
换句话说,假设你的数据集中的属性age在20到60之间,现在如果你按照age分割它们,你最终可能会在你的训练集中有年轻人,而老年人在您的测试集中,反之亦然..等等。
在这种情况下,您的模型将无法正确训练,您最终会过度拟合/欠拟合模型!
拆分它们的正确方法应基于依赖变量(也称为响应、类或y 变量)。
现在假设您的数据集仅包含两个类:Survived、Unsurvived,现在我们应该努力确保每个折叠(即训练、开发和测试集)都代表数据的所有层。那是为了确保上述每个类在每个测试折叠中(大约)均等地表示......为什么?
为了让您的模型获得尽可能好的训练,因为您向模型教授一个课程(例如 Survived)比另一个课程更多是没有意义的。我们希望它能够平等地了解所有事物,这就是为什么我们希望 所有集合 尽可能多地来自 所有类。
StratifiedShuffleSplit 与我提到的完全一样(以防你不介意使用Scikit-Learn)。
下面是一个简单的例子:
from sklearn.model_selection import StratifiedShuffleSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 0, 1, 1, 1])
sss = StratifiedShuffleSplit(n_splits=5, test_size=0.5, random_state=0)
for train_index, test_index in sss.split(X, y):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]