如何在拟合sklearn后获得有序的标签列表

时间:2016-04-02 03:23:02

标签: python pandas machine-learning scikit-learn

train_index, test_index = next(iter(ShuffleSplit(821, train_size=0.2, test_size=0.80, random_state=42)))
print train_index, len(train_index)
print test_index, len(test_index)

features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(features, labels, train_size=0.33, random_state=42)

clf = DecisionTreeClassifier()
clf.fit(features_train, labels_train)
pred = clf.predict(features_test, labels_test)
print pred, len(pred)

此代码中的一些问题:

  1. 为什么我需要cross_validation.train_test_split线以适应和预测我的分类器? (我没有对我的数据进行任何预处理,除了我已经完成的禁用词删除)
  2. 测试和训练指标是否与分类和训练对应?预测标签?我的目标是在完成和预测之后,以原始顺序获得所有我的标签。我用于训练和测试的功能和标签来自大熊猫数据框(两列),我按顺序需要预测标签,以便我可以将它们反馈到pandas数据框中。
  3. 有没有办法预测整个集合的标签,而不仅仅是测试集?

2 个答案:

答案 0 :(得分:2)

TL;博士

  1. 因为您的决策树分类器必须先进行训练才能预测任何内容。这不是一个神奇的算法。必须先展示在做出其他事情之前应该做些什么的例子。

    cross_validation.test_train_split()通过将您的数据分成测试和训练数据集来促进这一点,以便您可以分析以后执行的效果。如果没有这个,您就无法评估决策树分类器的实际执行情况。

    您可以在不test_train_split()的情况下创建自己的测试和培训数据(我怀疑这是您尝试使用ShuffleSplit()进行的操作),但 需要至少一些训练数据。

  2. test_indextrain_index与您的数据无关。完全停止。它们来自随机生成的过程,与test_train_split()完全无关。

    ShuffleSplit()的目的是为您提供指数,以便将您的数据划分为培训并自行测试。 test_train_split()将根据这些索引选择自己的索引和分区。您应该使用其中一个明智地

  3. 是。你总是可以打电话

    pred = clf.predict(features)pred = clf.predict(features_test + features_train)

  4. 全文

    • 如果您想要这样做,则需要cross_validation。交叉验证的整个目的是为了避免过度拟合。

      基本上,如果你在训练和测试数据上运行你的模型,那么你的模型将在训练集上表现得非常好(因为,那就是你训练它的那个)并且这会使你的模型对实际数据的执​​行情况的总体指标。

      这就像要求学生参加考试然后在现实生活中表现一样:如果你想知道你的学生是否从准备考试的过程中学到了什么,你就不会再给他一次考试了。他展示了他在现实世界中处理未知和复杂数据的技能。

      如果您想知道您的模型是否有用,那么您需要交叉验证。 Wikipedia说得最好:

        

      在预测问题中,通常会给模型一个已知的数据集   运行训练的数据(训练数据集)和数据集   测试模型的未知数据(或第一次看到的数据)   (测试数据集)。

           

      交叉验证的目标是定义一个   数据集在训练阶段“测试”模型(即,   验证数据集),为了限制过度拟合等问题,给出   深入了解模型将如何推广到独立数据集   (即,未知数据集,例如来自真实问题)等。

      cross_validation.train_test_split不执行任何操作,除非将数据集拆分为训练和测试数据。

    • 但也许你不关心指标,这没关系。那么问题就变成了:可能运行没有训练数据集的决策树分类器?

      答案是。决策树分类器是supervised algorithms:在将数据推广到新结果之前,需要对数据进行训练。如果您未向他们提供任何数据进行培训,则无法对您在predict中提供的任何数据执行任何操作。

    • 最后,虽然完全可以获得整套的标签(参见tl; dr),但如果你真的关心你是否真的很糟糕 '得到明智的结果。

      已经拥有测试和培训数据的标签。您不需要需要包含测试数据预测的另一列,因为它们要么相同,要么足够接近相同。

      我无法想到一个有意义的理由来获取训练数据的预测结果,而不是试图优化训练数据的表现。如果这是你想要做的,那么然后做那个。你现在正在做的事情绝对不是那样,我鼓励你强烈思考你的理由是什么,盲目地在你的桌子上插入数字而没有正当理由相信它们实际意味着什么。

      有一些方法可以改善这种情况:例如,取回精确度指标,或尝试对模型准确性进行 k - 交叉验证,或者查看log-loss or AUC or any one of number of metrics来衡量您的模型是否表现良好。

答案 1 :(得分:1)

同时使用ShuffleSplit和train_test_split是多余的。您甚至似乎没有使用ShuffleSplit返回的索引。

以下是ShuffleSplit如何使用索引返回的示例。 X和y是np.array。 X是按功能数量的实例数。 y包含每行的标签。

pred = clf.predict(features_train)

您不应该测试您的训练数据!但如果你想看看会发生什么呢

score = metrics.accuracy_score(y_test, pred)

此外,您无需传递标签进行预测。你应该使用

{{1}}