sklearn: Beim Aufrufen von LinearRegression.fit () wurden Arrays mit inkonsistenter Anzahl von Samples gefunden.


102

Ich versuche nur, eine einfache lineare Regression durchzuführen, aber ich bin verblüfft über diesen Fehler für:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].values, df2.iloc[1:1000, 2].values)

welches produziert:

ValueError: Found arrays with inconsistent numbers of samples: [  1 999]

Diese Auswahlen müssen die gleichen Abmessungen haben und sollten numpy Arrays sein. Was fehlt mir also?

Antworten:


116

Es sieht so aus, als ob sklearn die Datenform (Zeilennummer, Spaltennummer) benötigt. Wenn Ihre Datenform (Zeilennummer) ist (999, ), funktioniert sie nicht. Mit using numpy.reshape()sollten Sie die Form des Arrays ändern (999, 1), z. B. mit

data=data.reshape((999,1))

In meinem Fall hat es damit funktioniert.


6
Meine Datenform ist (10L,). Wie konvertiere ich sie in (10L, 1)? Wenn ich data = data.reshape (len (data), 1) verwende, ist die resultierende Form (10L, 1L) nicht (10L, 1)
user3841581

@ user3841581 Bitte beziehen Sie sich auf diesen Beitrag .
George Liu

1
@Boern Danke für den Kommentar. Ich habe auch festgestellt, dass X_train die Größe (N, 1) haben sollte, aber y_train die Größe (N,) haben sollte, nicht (N, 1), sonst funktioniert es nicht, zumindest nicht für mich.
CrossEntropy

data.reshape (...) zeigt möglicherweise eine Deprication-Warnung an, wenn es sich bei den Daten um Serienobjekte handelt. Verwenden Sie data.values.reshape (...)
NightFurry

data = data.reshape (-1,1)
Itachi

24

Sieht so aus, als würden Sie einen Pandas-Datenrahmen verwenden (ab dem Namen df2).

Sie können auch Folgendes tun:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].to_frame(), df2.iloc[1:1000, 2].to_frame())

HINWEIS: Ich habe "Werte" entfernt, da dadurch die Pandas-Serie in numpy.ndarray konvertiert wird und numpy.ndarray kein Attribut to_frame () hat.


11

Gesehen auf dem Udacity Deep Learning-Grundkurs:

df = pd.read_csv('my.csv')
...
regr = LinearRegression()
regr.fit(df[['column x']], df[['column y']])

2
Vielen Dank! Das ist wirklich am einfachsten und am einfachsten zu verstehen!
Juan A. Navarro

Tatsächlich wird der Y-Parameter als (Länge,) Form erwartet. Vielen Dank!
Michael_Zhang

5

Ich denke, das "X" -Argument von Regr.fit muss eine Matrix sein, daher sollte das Folgende funktionieren.

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, [5]].values, df2.iloc[1:1000, 2].values)

4

Ich bin auf diesen Fehler gestoßen, weil ich meine Daten in eine konvertiert habe np.array. Ich habe das Problem behoben, indem ich meine Daten in eine konvertiert np.matrixund stattdessen die Transponierung vorgenommen habe.

ValueError: regr.fit(np.array(x_list), np.array(y_list))

Richtig: regr.fit(np.transpose(np.matrix(x_list)), np.transpose(np.matrix(y_list)))


2
expects X(feature matrix)

Versuchen Sie, Ihre Funktionen in einem Tupel wie folgt zu platzieren:

features = ['TV', 'Radio', 'Zeitung']
X = Daten [Merkmale]

1

Ich hatte ein ähnliches Problem. Das Problem in meinem Fall war, dass die Anzahl der Zeilen in X nicht gleich der Anzahl der Zeilen in y war.

Das heißt, die Anzahl der Einträge in Feature-Spalten war nicht gleich der Anzahl der Einträge in der Zielvariablen, da ich einige Zeilen aus Feature-Spalten entfernt hatte.


0

Um zwei Arrays (Array1 und Array2) zu analysieren, müssen sie die folgenden zwei Anforderungen erfüllen:

1) Sie müssen numpy.ndarray sein

Überprüfen Sie mit

type(array1)
# and
type(array2)

Ist dies nicht der Fall, führen Sie mindestens einen von ihnen durch

array1 = numpy.ndarray(array1)
# or
array2 = numpy.ndarray(array2)

2) Die Abmessungen müssen wie folgt sein:

array1.shape #shall give (N, 1)
array2.shape #shall give (N,)

N ist die Anzahl der Elemente im Array. Um Array1 mit der richtigen Anzahl von Achsen zu versehen, führen Sie folgende Schritte aus:

array1 = array1[:, numpy.newaxis]

0

Wie oben erwähnt, muss das X-Argument eine Matrix oder ein Numpy-Array mit bekannten Dimensionen sein. Sie könnten also wahrscheinlich Folgendes verwenden:

df2.iloc[1:1000, 5:some_last_index].values

Ihr Datenrahmen wird also in ein Array mit bekannten Abmessungen konvertiert, und Sie müssen ihn nicht neu formen


-1

Während der Aufteilung des Zugtests haben Sie möglicherweise einen Fehler gemacht

x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)

Der obige Code ist korrekt

Sie haben vielleicht wie folgt vorgegangen, was falsch ist

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.