sklearn: Znaleziono tablice z niespójnymi liczbami próbek podczas wywoływania LinearRegression.fit ()


102

Próbuję wykonać prostą regresję liniową, ale zdumiewa mnie ten błąd:

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

który produkuje:

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

Te wybory muszą mieć te same wymiary i powinny to być tablice numpy, więc czego mi brakuje?

Odpowiedzi:


116

Wygląda na to, że sklearn wymaga kształtu danych (numer wiersza, numer kolumny). Jeśli kształt danych jest podobny do (numer wiersza) (999, ), to nie działa. Używając numpy.reshape()należy zmienić kształt tablicy na (999, 1)np. Using

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

W moim przypadku to zadziałało.


6
mój kształt danych to (10L,), jak przekonwertować go na (10L, 1). Kiedy używam data = data.reshape (len (data), 1), wynikowy kształt to (10L, 1L) a nie (10L, 1)
user3841581

@ user3841581, zapoznaj się z tym postem .
George Liu

1
@Boern Dzięki za komentarz. Odkryłem również, że X_train powinien mieć rozmiar (N, 1), ale y_train powinien mieć rozmiar (N,) a nie (N, 1), w przeciwnym razie nie działa, przynajmniej nie dla mnie.
CrossEntropy

data.reshape (...) może wyświetlać ostrzeżenie o wycofaniu, jeśli dane są obiektem serii. Użyj data.values.reshape (...)
NightFurry

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

24

Wygląda na to, że używasz pandy dataframe (od nazwy df2).

Możesz też wykonać następujące czynności:

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

UWAGA: Usunąłem „wartości”, ponieważ konwertuje to serię pand na numpy.ndarray, a numpy.ndarray nie ma atrybutu to_frame ().


11

Widziane na kursie dotyczącym głębokiego uczenia się Udacity:

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

2
Dzięki! To naprawdę najprostsze i najłatwiejsze do zrozumienia!
Juan A. Navarro

Właściwie parametr Y jest oczekiwany jako kształt (długość). Dzięki!
Michael_Zhang

5

Myślę, że argument „X” funkcji regr.fit musi być macierzą, więc poniższe powinno działać.

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

4

Napotkałem ten błąd, ponieważ przekonwertowałem moje dane na plik np.array. Rozwiązałem problem, konwertując moje dane na np.matrixformat i wykonując transpozycję.

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

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


2
expects X(feature matrix)

Spróbuj umieścić swoje funkcje w takiej krotce:

features = ['TV', 'Radio', 'Newspaper']
X = dane [funkcje]

1

Miałem podobny problem. Problem w moim przypadku polegał na tym, że liczba wierszy w X nie była równa liczbie wierszy w y.

tj. liczba wpisów w kolumnach cech nie była równa liczbie pozycji w zmiennej docelowej, ponieważ usunąłem niektóre wiersze z kolumn swobodnych.


0

Aby przeanalizować dwie tablice (tablica1 i tablica2), muszą spełnić następujące dwa wymagania:

1) Muszą być numpy.ndarray

Sprawdź z

type(array1)
# and
type(array2)

Jeśli tak nie jest, przynajmniej jeden z nich wystąpi

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

2) Wymiary muszą być następujące:

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

N to liczba elementów w tablicy. Aby zapewnić tablicy1 odpowiednią liczbę osi, wykonaj:

array1 = array1[:, numpy.newaxis]

0

Jak wspomniano powyżej argument X musi być macierzą lub tablicą numpy o znanych wymiarach. Więc prawdopodobnie możesz użyć tego:

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

Więc twoja ramka danych zostanie przekonwertowana na tablicę o znanych wymiarach i nie będziesz musiał jej zmieniać kształtu



-1

podczas testu pociągu mogłeś popełnić błąd

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

Powyższy kod jest poprawny

Mogłeś zrobić jak poniżej, co jest błędne

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.