【问题标题】:How to partition a dataset based on multiple metadata attributes in Python如何在 Python 中基于多个元数据属性对数据集进行分区
【发布时间】:2019-03-20 01:29:07
【问题描述】:

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

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

【问题讨论】:

  • 我猜你把事情搞混了。您是想根据年龄、性别和标签 c(未知)对样本进行分类,还是只将样本分为测试和训练数据集?
  • 后者,还有一点是,这种划分不仅仅基于标签。我希望分区在年龄和性别方面也能保持平衡。数据集包含其他属性,因此 etc
  • 你还需要时间来接受答案吗?!

标签: python dataframe machine-learning data-science


【解决方案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]

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2019-08-12
    • 2015-06-04
    • 2015-03-09
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多