2016-01-26 6 views
6

Mit sklearns StratifiedKFold-Funktion kann mir jemand helfen, den Fehler zu verstehen?StratifiedKFold: IndexError: zu viele Indizes für Array

Meine Vermutung ist, dass es etwas mit meiner Eingabe-Array von Etiketten zu tun hat, merke ich, wenn ich sie (die ersten 16 in diesem Beispiel) die Indexierung von 0 bis 15, aber eine extra 0 darüber gedruckt wird Ich habe nicht erwartet. Vielleicht bin ich nur ein Python Noob, aber das sieht komisch aus.

Wer sieht das Chaos hier?

Dokumentation: http://scikit-learn.org...StratifiedKFold.html

Code:

import nltk 
import sklearn 

print('The nltk version is {}.'.format(nltk.__version__)) 
print('The scikit-learn version is {}.'.format(sklearn.__version__)) 

print type(skew_gendata_targets.values), skew_gendata_targets.values.shape 
print skew_gendata_targets.head(16) 

skew_sfold10 = cross_validation.StratifiedKFold(skew_gendata_targets.values, n_folds=10, shuffle=True, random_state=20160121) 

Ergebnis

The nltk version is 3.1. 
The scikit-learn version is 0.17. 
<type 'numpy.ndarray'> (500L, 1L) 
    0 
0 0 
1 0 
2 0 
3 0 
4 0 
5 0 
6 0 
7 0 
8 0 
9 0 
10 0 
11 0 
12 0 
13 0 
14 1 
15 0 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-373-653b6010b806> in <module>() 
     8 print skew_gendata_targets.head(16) 
     9 
---> 10 skew_sfold10 = cross_validation.StratifiedKFold(skew_gendata_targets.values, n_folds=10, shuffle=True, random_state=20160121) 
    11 
    12 #print '\nSkewed Generated Dataset (', len(skew_gendata_data), ')' 

d:\Program Files\Anaconda2\lib\site-packages\sklearn\cross_validation.pyc in __init__(self, y, n_folds, shuffle, random_state) 
    531   for test_fold_idx, per_label_splits in enumerate(zip(*per_label_cvs)): 
    532    for label, (_, test_split) in zip(unique_labels, per_label_splits): 
--> 533     label_test_folds = test_folds[y == label] 
    534     # the test split can be too big because we used 
    535     # KFold(max(c, self.n_folds), self.n_folds) instead of 

IndexError: too many indices for array 

Antwort

11

Überprüfen Sie die Form von skew_gendata_targets.values. Sie werden feststellen, dass es sich nicht um ein 1d-Array (shape (500,)) handelt, wie StratifiedKFold erwartet, sondern eher um ein (500,1) -Array. SKlearn behandelt diese separat, anstatt sie zu zwingen, gleich zu sein. Lassen Sie mich wissen, wenn das hilft

+0

Der Ausdruck ist dort in der Ausgabe in der Frage: Drucktyp (skew_gendata_targets.values), skew_gendata_targets.values.shape, es ist ein (500,1) numpy Array. Ich bin ein Matlab-Junkie, der in eine Grube Pythons geworfen wird und den Unterschied zwischen einer 500x1- und einer 500xnada-Matrix/Array/Dings nicht kennt. Zumindest in einer Matlab-Welt gibt es keinen Unterschied. –

+2

Ja - es ist unglücklich und etwas verwirrend. Der Unterschied ist wichtig, wenn Operationen wie '*' ausgeführt werden. In einem Fall wird Pandas/numpy eine elementweise Multiplikation durchführen, während es auf der anderen Seite eine Matrixmultiplikation durchführt. Hoffe, dass die Operation "StratifiedKFold" funktioniert, nachdem sie auf ein Array (500,) gezwungen wurde. – Brian

+1

Ich sehe, Matrizen umformen ist etwas, was ein Matlaber verstehen kann, das scheint es zu beheben: np.reshape (skew_gendata_targets.values, [500,]), danke !! –

Verwandte Themen