我正在学习 Aurelien Geron 的动手机器学习书中的练习。
假设data
是一个数据帧:
income_cat index
0 5.0 0
1 5.0 1
2 5.0 2
3 5.0 3
4 5.0 4
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
选项A(来自图书):
for test_indices, train_indices in split.split(data, data.income_cat):
print(test_indices, train_indices)
选项B:
test_indices, train_indices = split.split(data, data.income_cat)
print(test_indices, train_indices)
选项B为什么不起作用?这是一个python问题,而不是sklearn问题。
一个元组应该同时循环或不循环,我会丢失什么? 选项A和B之间的唯一区别是for循环。
选项A的输出:
[4 2 1 0] [3]
选项B的输出:
ValueError: not enough values to unpack (expected 2, got 1)
答案 0 :(得分:2)
StratifiedShuffleSplit.split返回generator而不是列表。在引擎盖下的for
循环中,生成器上称为__next__
方法,它返回序列的下一个元素(生成器最终生成)。返回的元素解包为两个变量:test_indices, train_indices
。
您可以通过使用辅助函数__next__
显式调用next()
来达到相同的结果:
test_indices, train_indices = next(split.split(data, data.income_cat))