2015-04-29 1 views
6

Sto cercando di utilizzare questo codice dal scikit imparare sito:dimensione dei dati di query scitkit-imparare deve corrispondere la dimensione dei dati formazione

http://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html

sto usando i miei dati. Il mio problema è che ho molte più di due funzioni. Se voglio "espandere" le caratteristiche 2-3 o 4 ....

sto ottenendo:

"dimensione dei dati di query deve corrispondere la dimensione dei dati di formazione"

def machine(): 
with open("test.txt",'r') as csvr: 

    reader= csv.reader(csvr,delimiter='\t') 

    for i,row in enumerate(reader): 

     if i==0: 
      pass 
     elif '' in row[2:]: 
      pass 
     else: 
      liste.append(map(float,row[2:])) 

a = np.array(liste) 
h = .02 
names = ["Nearest Neighbors", "Linear SVM", "RBF SVM", "Decision Tree", 
     "Random Forest", "AdaBoost", "Naive Bayes", "LDA", "QDA"] 
classifiers = [ 
    KNeighborsClassifier(1), 
    SVC(kernel="linear", C=0.025), 
    SVC(gamma=2, C=1), 
    DecisionTreeClassifier(max_depth=5), 
    RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1), 
    AdaBoostClassifier(), 
    GaussianNB(), 
    LDA(), 
    QDA()] 



X = a[:,:3] 
y = np.ravel(a[:,13]) 

linearly_separable = (X, y) 
datasets =[linearly_separable] 
figure = plt.figure(figsize=(27, 9)) 
i = 1 

for ds in datasets: 
    X, y = ds 

    X = StandardScaler().fit_transform(X) 
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4) 

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5 
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5 
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), 
         np.arange(y_min, y_max, h)) 

    cm = plt.cm.RdBu 
    cm_bright = ListedColormap(['#FF0000', '#0000FF']) 
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i) 

    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) 

    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6) 
    ax.set_xlim(xx.min(), xx.max()) 
    ax.set_ylim(yy.min(), yy.max()) 
    ax.set_xticks(()) 
    ax.set_yticks(()) 
    i += 1 

    for name, clf in zip(names, classifiers): 
     ax = plt.subplot(len(datasets), len(classifiers) + 1, i) 
     print clf.fit(X_train, y_train) 
     score = clf.score(X_test, y_test) 
     print y.shape, X.shape 
     if hasattr(clf, "decision_function"): 
      Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) 
      print Z 
     else: 
      Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1] 


     Z = Z.reshape(xx.shape) 

     ax.contourf(xx, yy, Z, cmap=cm, alpha=.8) 
     ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) 

     ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, 
        alpha=0.6) 

     ax.set_xlim(xx.min(), xx.max()) 
     ax.set_ylim(yy.min(), yy.max()) 
     ax.set_xticks(()) 
     ax.set_yticks(()) 
     ax.set_title(name) 
     ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'), 
       size=15, horizontalalignment='right') 
     i += 1 

figure.subplots_adjust(left=.02, right=.98) 
plt.show() 

In In questo caso, utilizzo tre funzioni. Cosa sto facendo male nel codice, è qualcosa con i dati X_train e X_test? Con solo due funzioni, tutto è ok.

mio valore X:

(array([[ 1., 1., 0.], 
    [ 1., 0., 0.], 
    [ 1., 0., 0.], 
    [ 1., 0., 0.], 
    [ 1., 1., 0.], 
    [ 1., 0., 0.], 
    [ 1., 0., 0.], 
    [ 3., 3., 0.], 
    [ 1., 1., 0.], 
    [ 1., 1., 0.], 
    [ 0., 0., 0.], 
    [ 0., 0., 0.], 
    [ 0., 0., 0.], 
    [ 0., 0., 0.], 
    [ 0., 0., 0.], 
    [ 0., 0., 0.], 
    [ 4., 4., 2.], 
    [ 0., 0., 0.], 
    [ 6., 3., 0.], 
    [ 5., 3., 2.], 
    [ 2., 2., 0.], 
    [ 4., 4., 2.], 
    [ 2., 1., 0.], 
    [ 2., 2., 0.]]), array([ 1., 1., 1., 1., 0., 1., 1., 0., 1., 1., 0., 1., 1., 
    1., 1., 1., 0., 1., 1., 0., 1., 0., 1., 1.])) 

La prima matrice è la matrice X e la seconda matrice è y (target) array.

Mi dispiace per il formato di cattivo = errore:

 Traceback (most recent call last): 

File "allM.py", line 144, in <module> 
mainplot(namePlot,1,2) 
File "allM.py", line 117, in mainplot 

Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1] 

File "/usr/local/lib/python2.7/dist-packages/sklearn/neighbors/classification.py", line 191, in predict_proba 
neigh_dist, neigh_ind = self.kneighbors(X) 

File "/usr/local/lib/python2.7/dist-packages/sklearn/neighbors/base.py", line 332, in kneighbors 
return_distance=return_distance) 

File "binary_tree.pxi", line 1298, in sklearn.neighbors.kd_tree.BinaryTree.query (sklearn/neighbors/kd_tree.c:10433) 

ValueError: query data dimension must match training data dimension 

e questa è la matrice X senza di lui mettendo in la "DS" set di dati.

[[ 1. 1. 0.][ 1. 0. 0.][ 1. 0. 0.][ 1. 0. 0.][ 1. 1. 0.][ 1. 0. 0.][ 1. 0. 0.][ 3. 3. 0.][ 1. 1. 0.][ 1. 1. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 0. 0. 0.][ 4. 4. 2.][ 0. 0. 0.][ 6. 3. 0.][ 5. 3. 2.][ 2. 2. 0.][ 4. 4. 2.][ 2. 1. 0.][ 2. 2. 0.]] 
+0

L'esempio di X sembra che sia una tupla contenente sia i vostri esemplari che i target, ma questo non è ciò che il codice si aspetta. Puoi dare un esempio di 'a'? Da lì sarà molto più facile testare il tuo codice. – ohruunuruus

+0

Inoltre, puoi fornire ulteriori informazioni sull'errore? Dove si verifica l'errore? Sarebbe utile includere anche l'intero traceback degli errori – ohruunuruus

+0

Mi dispiace, cioè X e y, il primo array è X e il secondo array è y (obiettivo). – auronsen

risposta

3

Questo accade perché clf.predict_proba() richiede un array in cui ogni riga ha lo stesso numero di elementi come le righe nei dati di addestramento - in altre parole un ingresso di forma (num_rows, 3).

quando si stava lavorando con esemplari bidimensionali questo ha funzionato perché il risultato di np.c_[xx.ravel(), yy.ravel()] è un array con le righe di due elementi:

print np.c_[xx.ravel(), yy.ravel()].shape 
(45738, 2) 

Questi esemplari hanno due elementi perché sono creati da np.meshgrid quale il il codice di esempio usa per creare una serie di input per coprire uno spazio bidimensionale che traccerà bene. Prova a passare un array con righe di tre elementi su clf.predict_proba e le cose dovrebbero funzionare correttamente.

Se si desidera riprodurre questo specifico codice di esempio, sarà necessario creare una meshgrid 3D, come descritto nella domanda this su SO. Avrai anche tracciato i risultati in 3D, dove lo mplot3d sarà un buon punto di partenza, anche se sulla base dello sguardo (sommariamente breve) che ho dato al disegno nel codice di esempio, sospetto che questo potrebbe essere più difficile di quanto valga la pena . Non sono davvero sicuro di come un analogico 3D di quei grafici possa sembrare.

+1

Penso che senza affettare non si possa davvero fare una trama 3d.Forse i confini ma sembreranno disordinati. Comunque non generalizza sopra 3 dimensioni ... –

+0

@AndreasMueller Penso che tu abbia ragione. Volevo solo fornire una direzione in cui OP dovrebbe decidere di continuare a lavorare con questo esempio. – ohruunuruus