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?

sonnig
quelle

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.

Yul
quelle
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.

user24981
quelle
11

Gesehen auf dem Udacity Deep Learning-Grundkurs:

df = pd.read_csv('my.csv')
...
regr = LinearRegression()
regr.fit(df[['column x']], df[['column y']])
xilef
quelle
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)
Anish
quelle
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)))

Josh Grinberg
quelle
2
expects X(feature matrix)

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

features = ['TV', 'Radio', 'Zeitung']
X = Daten [Merkmale]
Yuanxu Xu
quelle
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.

Shivam Agrawal
quelle
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]
Richard
quelle
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

Andy J.
quelle
-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)
Naveen
quelle