如何在Python中基于多个元数据属性对数据集进行分区

时间:2018-10-15 15:12:04

标签: python dataframe machine-learning data-science

如果我们的数据集包含以下元数据:AgeGenderPersonId

是否存在一个Python库,可以根据上述所有三个元数据属性以及标签c将数据集划分为训练,开发和测试分区?

1 个答案:

答案 0 :(得分:1)

您不应基于 独立 变量(也称为功能)对数据集进行分区...为什么?

简单来说,因为最终您将获得几乎保证的 不平衡 分布。

换句话说,假设数据集中的属性age介于20到60之间,现在,如果根据age进行划分,您可能最终会在培训集中出现年轻人,以及测试集中的旧版本,反之亦然。等等。

在这种情况下,您的模型将无法正确训练,最终会导致模型过度拟合/欠拟合!


拆分它们的正确方法应该基于 因果 变量(也就是响应,类或y变量)。

现在假设您的数据集仅包含两个类别:SurvivedUnsurvived,现在我们应该确保每个折叠(即训练,开发和测试集)都代表该数据的所有层次。数据。那是为了确保在每个测试折叠中(近似)相等地表示每个上述类别。...为什么?

为了让您的模型获得最好的培训,因为您没有比另一门课程更讲授一个模型(例如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]