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?

słoneczny
źródło

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.

Yul
źródł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 ().

user24981
źródło
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']])
xilef
źródło
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)
Anish
źródło
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)))

Josh Grinberg
źródło
2
expects X(feature matrix)

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

features = ['TV', 'Radio', 'Newspaper']
X = dane [funkcje]
Yuanxu Xu
źródło
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.

Shivam Agrawal
źródło
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]
Richard
źródło
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

Andy J.
źródło
0

Czasami miałem ten sam problem. Powodem były tablice o różnych rozmiarach.

Engr Saliheen Afridi
źródło
-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)
naveen
źródło