2015-05-04 128 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:這對我來說看起來是一個不同的問題;你可能想發佈一個新的問題。 –