分配Sklearn train_test_split()返回的变量。

问题描述 投票:-2回答:1

我对使用 train_test_split() 在sklearn中。这是我试过的一个代码片段。

X = example_df.drop('features', axis=1)
y = example_df['price']

y_test, X_train, X_test, y_train= train_test_split(X, y, test_size=0.2)

它是如何分割行的 example_df? example_df 有100行,所以我希望数据集能以如下大小分割。

  1. y_test 应该有80行

  2. X_train 应有20行

  3. X_test 应有80行

  4. y_train 应有20行

但我的数据集的大小分别是:20、20、80、20。

为什么会这样呢?

python machine-learning scikit-learn syntax
1个回答
1
投票

所以在这种情况下,你应该使用的正确的变量赋值顺序是X_train, X_test, y_train, y_test...也就是说,你需要重写你的代码,使之成为

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

多重任务拆包

此外,我猜想你的困惑可能还来自于对python中多重赋值解包的工作方式以及对 train_test_split(...).

让我们考虑给 train_test_split(...) 单个数组进行拆分,例如。y = [0, 1, 2, 3, 4]. train_test_split(y) 给我们一个类似于 [[0, 1, 2], [3, 4]] (加上或减去一些洗牌)。我们看到,它将我们的原始列表并返回一个 2份名单.

我们可以通过 train_test_split(...) 任意数量的列表来分割。所以让我们看看如果我们给了 train_test_split(...) 2份名单(list_1, list_2)作为输入。它将返回一个 4份名单. 前两个内部列表将是训练集的。list_1 其次是测试集的 list_1的训练集,而最后两个内部列表将是训练集的 list_2 其次是测试集的 list_2. 然而,返回的列表并不对应任何关键字,如 "X_train "或 "x_test",它们只是老式的常规列表。

处理输出的一种方法是这样的

datasets = train_test_split(list_1, list_2)
list_1_train = datasets[0]
list_1_test = datasets[1]
list_2_train = datasets[2]
list_2_test = datasets[3]

然而这样做冗长、重复,而且容易出现bug。值得庆幸的是,python为我们提供了解包多个变量并在一条语句中赋值的语法。相当于上面代码片断中所示的四个列表的赋值是这样做的。

[list_1_train, list_1_test, list_2_train, list_2_test] = train_test_split(list_1, list_2)

或者用更多的 糖分:

list_1_train, list_1_test, list_2_train, list_2_test = train_test_split(list_1, list_2)
© www.soinside.com 2019 - 2024. All rights reserved.