2015-04-29 10 views
6

Próbuję użyć tego kodu z scikit nauczyć witrynie:scitkit nauczenia zapytania wymiar wymiar dane muszą być zgodne z danymi dotyczącymi treningu

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

używam moje własne dane. Mój problem polega na tym, że mam więcej niż dwie funkcje. Jeśli chcę „rozwinąć” cechy od 2 do 3 lub 4 ....

Dostaję:

„wymiar dane zapytanie musi dopasować szkolenia wymiaru danych”

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

W w tym przypadku używam trzech funkcji. Co robię źle w kodzie, czy jest to coś z danymi X_train i X_test? Tylko z dwoma funkcjami wszystko jest w porządku.

my wartość 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.])) 

Pierwsza matryca jest matryca X i drugi układ jest r (docelowy) matryca.

Przepraszam za złą formacie = Błąd:

 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 

i to jest tablica X bez wprowadzania go do „DS” zestawu danych.

[[ 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

Twój przykład X wygląda na to, że jest to krotka zawierająca zarówno twoje wzorce, jak i cele, ale nie jest to tym, czego oczekuje kod. Czy możesz podać przykład "a"? Stamtąd znacznie łatwiej będzie przetestować twój kod. – ohruunuruus

+0

Czy możesz podać więcej informacji o błędzie? Gdzie pojawia się błąd? Nawet podanie całego śledzenia błędów byłoby pomocne – ohruunuruus

+0

Przykro mi, to jest X i Y, pierwsza tablica to X, a druga to y (cel). – auronsen

Odpowiedz

3

Tak się dzieje ponieważ wymaga clf.predict_proba() tablicę z których każdy ma taką samą liczbę elementów jako wiersze danych szkoleniowych - innymi słowy wejście w kształcie (num_rows, 3).

Kiedy pracowaliśmy z egzemplarzy dwuwymiarowych to działa, gdyż wynikiem np.c_[xx.ravel(), yy.ravel()] jest tablicą z dwuelementowych wierszy:

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

te egzemplarze mają dwa elementy, ponieważ są one tworzone przez np.meshgrid który w przykładowy kod służy do stworzenia zestawu danych wejściowych, aby objąć dwuwymiarową przestrzeń, która ładnie spisze. Spróbuj przekazać tablicę z rzędami trzech elementów do clf.predict_proba i wszystko powinno działać poprawnie.

Jeśli chcesz odtworzyć ten fragment kodu próbki, musisz utworzyć siatkę siatki 3D, zgodnie z opisem w pytaniu SO na stronie this. Będziesz także wyświetlał wyniki w 3D, gdzie mplot3d będzie dobrym punktem wyjścia, chociaż na podstawie (wprawdzie krótkiego) wyglądu, jaki nadałem wykreślaniu w przykładowym kodzie, podejrzewam, że może to być więcej kłopotu niż jest warta . Nie jestem do końca pewien, jak wygląda analog 3D tych fabuł.

+1

Myślę, że bez krojenia nie da się zrobić trójwymiarowej fabuły.Może granice, ale będzie wyglądać chaotycznie. W każdym razie nie będzie generalizować powyżej 3 wymiarów ... –

+0

@AndreasMueller Myślę, że masz rację. Chciałem tylko podać kierunek, jeśli OP zdecyduje się kontynuować pracę z tym przykładem. – ohruunuruus

Powiązane problemy