Python 3.x 为什么我应该让循环读取分层的shufflesplit输出?
我在python中使用n_splits=1的StratifiedShuffleSplit 我不明白为什么我仍然需要一个for循环来获得输出?为什么下面的代码不起作用Python 3.x 为什么我应该让循环读取分层的shufflesplit输出?,python-3.x,machine-learning,scikit-learn,Python 3.x,Machine Learning,Scikit Learn,我在python中使用n_splits=1的StratifiedShuffleSplit 我不明白为什么我仍然需要一个for循环来获得输出?为什么下面的代码不起作用 split=StratifiedShuffleSplit(n_splits=1,test_size=0.2,random_state=42) train_index, test_index = split.split(housing, housing["income_cat"]) 这是原始代码 split = Stratifie
split=StratifiedShuffleSplit(n_splits=1,test_size=0.2,random_state=42)
train_index, test_index = split.split(housing, housing["income_cat"])
这是原始代码
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in split.split(housing, housing["income_cat"]):
strat_train_set = housing.loc[train_index]
strat_test_set = housing.loc[test_index]
正如@Vivek Kumar所评论的,代码第二行中的
split.split()
调用返回一个iterable(很可能是一个生成器,而不是列表或类似的东西)。您的非工作示例尝试使用返回值,就好像它不是
让我们看看循环使用的数据类型:
for train_index, test_index in ...:
...
for
循环显然需要一个iterable。此外,train\u index,test\u index
将iterable中的每个项“分解”为两个值,因此每个项必须是一个正好包含两个元素的iterable。通常,这种情况下会使用元组
因此,split.split()
的结果可能如下所示:
[
(a1, b1),
(a2, b2),
...
]
据推测,n\u splits=1
意味着只有一对train\u index,test\u index
——至少这是您似乎声称并需要验证的。在这种情况下,结果将是:
[
(a1, b1),
]
所以只有一个项本身就是一个包含两个项的元组。现在,您尝试使用train\u index,test\u index=…
来分解单个项,但失败了:项的数量不匹配。您需要首先提取元组
获取元组有两种基本方法:
pair = split.split(...)[0]
pair, = split.split(...)
train_index, test_index = pair
我强烈建议使用第二种变体,因为当出现多个项目时,它会失败;第一个变体只是默默地丢弃额外的项
然后,可以对元组进行分解:
pair = split.split(...)[0]
pair, = split.split(...)
train_index, test_index = pair
或者,一步到位:
split = StratifiedShuffleSplit(n_splits=1,test_size=0.2,random_state=42)
(train_index, test_index), = split.split(housing, housing["income_cat"])
您是否可以添加
n_splits=2
所需的代码,或n_splits=1
的工作代码?这可能有助于我们找到答案。我的感觉是,结果是一个数组,而解构赋值(split,=…
-注意逗号)将是goBecause的方法,因为split()
是python中使用yield
的生成器对象。因此,即使只有一次拆分,也需要进行迭代。请看@SillyFreak:我在问题陈述中添加了原始代码。