Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为什么我应该让循环读取分层的shufflesplit输出?_Python 3.x_Machine Learning_Scikit Learn - Fatal编程技术网

Python 3.x 为什么我应该让循环读取分层的shufflesplit输出?

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

我在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 = 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:我在问题陈述中添加了原始代码。