2016-11-16 6 views
1

Ich versuche, die sehr einfaches BeispielPyplot nicht Regression plotten

N = 50 
x = np.random.rand(N) 
y = np.random.rand(N) 
colors = np.random.rand(N) 
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses 

print(type(x),type(y)) 
print('training samples ',len(x),len(y)) 
plt.scatter(x, y, c=colors, alpha=0.5) 
plt.show() 

dies zeigt

<class 'numpy.ndarray'> <class 'numpy.ndarray'> 
training samples 50 50 

zu emulieren wie erwartet, und der Plot zeigt ebenfalls auf. Jetzt versuche ich, die Ergebnisse der GradientBoostingRegressor als

base_regressor = GradientBoostingRegressor() 
base_regressor.fit(X_train, y_train) 
y_pred_base = base_regressor.predict(X_test) 

print(type(X_train),type(y_train)) 
print('training samples ',len(X_train),len(y_train)) 
print(type(X_test),type(y_pred_base)) 
print('base samples ',len(X_test),len(y_pred_base)) 

plt.figure() 

plt.scatter(X_train, y_train, c="k", label="training samples") 
plt.plot(X_test, y_pred_base, c="g", label="n_estimators=1", linewidth=2) 
plt.xlabel("data") 
plt.ylabel("target") 
plt.title("Base Regression") 
plt.legend() 
plt.show() 

Notiz zu zeichnen, dass X_train, y_train und X_test sind alle numpy Arrays. Für den oben stehenden Code bekomme ich

<class 'numpy.ndarray'> <class 'numpy.ndarray'> 
training samples 74067 74067 
<class 'numpy.ndarray'> <class 'numpy.ndarray'> 
base samples 166693 166693 

aber die Handlung wird nicht angezeigt und ich bekomme den Fehler

ValueError: x and y must be the same size 

bei

plt.scatter(X_train, y_train, c="k", label="training samples") 

aber wie in der Ausgabe, x und y gesehen sind von gleicher Größe und Art. Was mache ich falsch?

+5

anstatt Drucken 'len (X_test)' könnten Sie 'X_test.shape' drucken? – MMF

+0

danke für das Vorschlagen, jetzt bekomme ich 'Trainingsbeispiele (74067, 163) (74067,)' und 'Basisproben (166693, 163) (166693,)' – AbtPst

+0

was Sinn macht, denn für meine Trainingsdimension habe ich 163 Spalten – AbtPst

Antwort

3

Ihr X_train-Array ist zweidimensional mit 163 Spalten für jede Probe. Sie können Ihr y_train-Array, das nur 1-dimensional ist, nicht gegen das gesamte X_train-Array plotten. Ähnlich für das y_pred_base-Diagramm gegen X_test.

plt.scatter(X_train[:, 17], y_train, c="k", label="training samples") 
plt.plot(X_test[:, 17], y_pred_base, c="g", label="n_estimators=1", linewidth=2) 

Ihre abhängigen Variablen (X) leben in einem 163-dimensionalen Raum: plotten gegen, die Bearbeitung des Code so etwas wie diese

Sie haben eine der Spalten in dem X-Arrays zu wählen. Jeder y-Wert hängt von dem entsprechenden x-Wert von jeder dieser Dimensionen ab. Ein einfaches 2-dimensionales Streu- oder Liniendiagramm kann nicht alle diese Informationen gleichzeitig anzeigen.

Eine Sache, die Sie tun können, ist herauszufinden, von welchen der x Variablen Ihre y-Werte am meisten abhängen. Sie können darauf mit dem Attribut base_regressor.feature_importances_ zugreifen. Es gibt ein Beispiel in der Dokumentation here. Dann könnten Sie eine Verschwörung gegen die wichtigsten machen. Sie könnten dies in mehreren Dimensionen mit einem 3D-Scatter-Plot oder in noch höheren Dimensionen mit etwas wie corner.py

+0

macht Sinn.Ich verstehe immer noch nicht, wie ich erreichen kann, was ich sehen möchte. im Grunde möchte ich Y gegen x für Trainingsdaten darstellen und dann das mit einem anderen Diagramm von y gegen x für Testdaten vergleichen (nach der Vorhersage). Ist das sinnvoll? Ich möchte nur die Form/Verteilung zu vergleichen – AbtPst

+0

Ich redigierte meine Antwort, um eine Erklärung zu enthalten, da es zu lang war, um in einen Kommentar zu passen. Ich hoffe, das hilft :) – kiliantics

Verwandte Themen