2015-05-04 28 views
19

Próbowałem podzielić przykładowy zestaw danych przy użyciu podzielonego losowo podziału Shuffle Scikit-learn. Śledziłem przykładzie przedstawionym na scikit-learn dokumentacji heresklearn.cross_validation.StratifiedShuffleSplit - błąd: "indeksy są poza systemem"

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() 

Jednak po uruchomieniu tego skryptu, pojawia się następujący błąd:

IndexError: indices are out-of-bounds 

Może ktoś proszę wskazać co robię źle tutaj ? Dzięki!

+2

Wygląda na to, że w tym miejscu powinien wystąpić błąd indeksu: 'xtrain, xtest = dane [train_index], dane [test_index]'. Jeśli tak, możesz edytować swoje pytanie, aby pomóc innym zlokalizować problem. – Scott

Odpowiedz

39

Stosujesz różne konwencje indeksowania Pandas DataFrame indeksowania w porównaniu z NumPy ndarray. Tablice train_index i test_index są kolekcjami indeksów wierszy. Ale data jest obiektem Pandas DataFrame, a gdy używasz pojedynczego indeksu do tego obiektu, jak w data[train_index], Pandas oczekuje, że będzie zawierał etykiety zamiast indeksów wierszy. Można też konwertować dataframe do tablicy numpy, używając .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] 

lub użyj Pandy .iloc akcesor:

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] 

I faworyzują drugie podejście, ponieważ daje xtrain i xtest od typ DataFrame zamiast ndarray, a więc zachowuje etykiety kolumn.

+0

Dziękuję Mark, akcesor '.iloc' działa doskonale. – Jason

+0

W Pandach 0.17.1 i Scikit Learn 0.17.0, to nie działa. Poniższy przykład podaje ten sam błąd, co PO, który opublikował: 'grid = GridSearchCV (decision_tree, param_grid = {'max_depth': np.arange (1,3)}, cv = sss, scoring = 'roc_auc')' 'siatka. fit (xtrain, ytrain) '. –

+0

@WR: To wygląda na inny problem; możesz opublikować nowe pytanie. –

Powiązane problemy