2016-08-08 88 views
0

Ich versuche Scikit-learn SVM zu verwenden, um vorherzusagen, ob eine Aktie von S & P500 den Index schlägt oder nicht. Ich habe die 'Sample' Datei, aus der ich extrahiere die Features X und die Etiketten (schlägt den Index oder schlägt es nicht) Y.Scikit-lernen SVM: Umformung X führt zu inkompatiblen Formen

Wenn ich es das erste Mal (ohne Umformung X) versuchte, bekam ich die die folgende Abschreibungs Fehler:

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 
and will raise ValueError in 0.19. Reshape your data either using 
X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) 
if it contains a single sample. 

Folglich habe ich versucht, die Umgestaltung von X nach der Empfehlung und auch einige Forum-Beiträge. Jetzt bekomme ich jedoch den folgenden Wert Fehler, dass X und Y nicht die gleiche Form haben.

ValueError: X and y have incompatible shapes. 
X has 4337 samples, but y has 393. 

Unten können Sie die Formen von X und Y sehen vor Umformung:

('Shape of X = ', (493, 9)) 
('Shape of Y = ', (493,)) 

und nach dem Umformen:

('Shape of X = ', (4437, 1)) 
('Shape of Y = ', (493,)) 

ich auch so neu zu gestalten versucht, dass ich die (493 bekommen , 9) Form, aber auch das hat nicht funktioniert, da ich den folgenden Fehler bekommen habe.

ValueError: total size of new array must be unchanged. 

ich unter dem Code geschrieben die Funktionen und Etiketten von der Pandas Datenrahmen und und die SVM-Analyse zu extrahieren:

Eigenschaft & Label-Auswahl:

X = np.array(sample[features].values) 
X = preprocessing.scale(X)  
X = np.array(X)  
X = X.reshape(-1,1)  

Y = sample['status'].values.tolist() 
Y = np.array(Y) 

Z = np.array(sample[['changemktvalue', 'benchmark']]) 

SVM-Tests:

test_size = 50 

invest_amount = 1000 
total_invests = 0 
if_market = 0 
if_strat = 0  



clf = svm.SVC(kernel="linear", C= 1.0) 
clf.fit(X[:-test_size],Y[:-test_size]) 

correct_count = 0 

for x in range(1, test_size+1): 
    if clf.predict(X[-x])[0] == Y[-x]: 
     correct_count += 1 

    if clf.predict(X[-x])[0] == 1: 
     invest_return = invest_amount + (invest_amount * (Z[-x][0]/100)) #zeroth element of z 
     market_return = invest_amount + (invest_amount * (Z[-x][1]/100)) #marketsp500 is at pos 1 

     total_invests += 1 
     if_market += market_return 
     if_strat += invest_return 

print("Accuracy:", (float(correct_count)/test_size) * 100.00) 

Wäre toll, wenn Sie irgendwelche Eingaben haben, wie zu lösen Dies.

+0

denke ich, sollten Sie nur 'umformen ((- 1,1))' auf 'Y' und über Rundfunk Regeln lesen ... – Julien

+0

das ist genau das, das Problem, dass diese Umformung nicht funktionierte, da es zu dem Wertfehler über – DaveL

+0

führte. Sie sollten nicht umformen. Das Umformen ist nur dann möglich, wenn Sie ein einzelnes Merkmal haben, wie aus der Warnung hervorgeht. Aber Sie haben 9 Funktionen in 'X'. Entfernen Sie die Umformung in Ihrem Code und stellen Sie den gesamten Stack-Trace ein. – Priyatham

Antwort

1

Sie sollten nicht umformen X zu (-1, 1). In der Tat ist der Fehler in Ihrem Anruf an die predict Methode.

ändern

clf.predict(X[-x])[0] 

zu

clf.predict(X[-x].reshape((-1, 9)))[0] 
+0

Ich habe versucht, Ihre Vorhersage-Version, aber es gibt mir einen Syntaxfehler: 'SyntaxError: ungültige Syntax' – DaveL

+0

Es sollte jetzt funktionieren. Ich habe eine Klammer vergessen. – Priyatham

+0

mhm es funktioniert immer noch nicht und gibt mir 'ValueError: X.shape [1] = 1 sollte gleich 9 sein, die Anzahl der Funktionen zur Trainingszeit 'auch wenn ich verschiedene Umformung versuche bekomme ich Fehler – DaveL