【问题标题】:sklearn.cross_validation.StratifiedShuffleSplit - error: "indices are out-of-bounds"sklearn.cross_validation.StratifiedShuffleSplit - 错误:“索引超出范围”
【发布时间】:2015-07-13 11:20:36
【问题描述】:

我试图使用 Scikit-learn 的 Stratified Shuffle Split 拆分样本数据集。我按照 Scikit-learn 文档 here 中显示的示例进行操作

import pandas as pd
import numpy as np
# UCI's wine dataset
wine = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")

# separate target variable from dataset
target = wine['quality']
data = wine.drop('quality',axis = 1)

# Stratified Split of train and test data
from sklearn.cross_validation import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(target, n_iter=3, test_size=0.2)

for train_index, test_index in sss:
    xtrain, xtest = data[train_index], data[test_index]
    ytrain, ytest = target[train_index], target[test_index]

# Check target series for distribution of classes
ytrain.value_counts()
ytest.value_counts()

但是,在运行此脚本时,我收到以下错误:

IndexError: indices are out-of-bounds

有人可以指出我在这里做错了什么吗?谢谢!

【问题讨论】:

  • 看起来您的索引错误应该发生在这里:xtrain, xtest = data[train_index], data[test_index]。如果是这样,您可以编辑您的问题以帮助其他人找到问题。

标签: python pandas scikit-learn


【解决方案1】:

您遇到了 Pandas DataFrame 索引与 NumPy ndarray 索引的不同约定。数组train_indextest_index 是行索引的集合。但是data 是 Pandas DataFrame 对象,当您在该对象中使用单个索引时,如在 data[train_index] 中,Pandas 期望 train_index 包含 标签而不是行索引.您可以使用 .values 将数据帧转换为 NumPy 数组:

data_array = data.values
for train_index, test_index in sss:
    xtrain, xtest = data_array[train_index], data_array[test_index]
    ytrain, ytest = target[train_index], target[test_index]

或使用 Pandas .iloc 访问器:

for train_index, test_index in sss:
    xtrain, xtest = data.iloc[train_index], data.iloc[test_index]
    ytrain, ytest = target[train_index], target[test_index]

我倾向于第二种方法,因为它给出了 DataFrame 类型的 xtrainxtest 而不是 ndarray,因此保留了列标签。

【讨论】:

  • 谢谢马克,.iloc 访问器工作得很好。
  • 对于 Pandas 0.17.1 和 Scikit Learn 0.17.0,这不起作用。以下给出了与发布的 OP 相同的错误:grid = GridSearchCV(decision_tree, param_grid={'max_depth':np.arange(1,3)}, cv=sss, scoring='roc_auc')grid.fit(xtrain,ytrain)
  • @WR:这对我来说似乎是一个不同的问题;您可能想发布一个新问题。
  • 是的,我同意。完毕。它应该有一个专门的问题。
  • 这也适用于timeseriessplit
猜你喜欢
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2016-04-17
  • 2015-02-13
相关资源
最近更新 更多