如果我们的数据集包含以下元数据:Age
,Gender
,PersonId
。
是否存在一个Python库,可以根据上述所有三个元数据属性以及标签c
将数据集划分为训练,开发和测试分区?
答案 0 :(得分:1)
您不应基于 独立 变量(也称为功能)对数据集进行分区...为什么?
简单来说,因为最终您将获得几乎保证的 不平衡 分布。
换句话说,假设数据集中的属性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]