我对使用 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行,所以我希望数据集能以如下大小分割。
y_test
应该有80行
X_train
应有20行
X_test
应有80行
y_train
应有20行
但我的数据集的大小分别是:20、20、80、20。
为什么会这样呢?
所以在这种情况下,你应该使用的正确的变量赋值顺序是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)