2015-05-04 219 views
19

我试图使用Scikit-learn的分层随机拆分拆分示例数据集。我也跟着上所示的例子Scikit学习文档heresklearn.cross_validation.StratifiedShuffleSplit - 错误:“索引超出范围”

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 

可能有人请指出我在做什么错在这里?谢谢!

+2

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

回答

39

您正在运行Pandas DataFrame索引与NumPy ndarray索引的不同约定。阵列train_index和是行索引的集合。但是data是Pandas DataFrame对象,并且当您使用单个索引导入该对象时,如在data[train_index]中,Pandas期望train_index包含列标签而非行索引。您可以将数据帧转换为NumPy的阵列,使用.values

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] 

或使用熊猫.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] 

我倾向于第二种方法,因为它提供了xtrainxtest键入DataFrame而不是ndarray,并保留列标签。

+0

谢谢Mark,'.iloc'访问者完美地工作。 – Jason

+0

随着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')' '网格。配合(xtrain,ytrain)'。 –

+0

@WR:这对我来说看起来是一个不同的问题;你可能想发布一个新的问题。 –