Przekazano wektor-kolumnę y, gdy oczekiwano tablicy 1d

119

Muszę zmieścić RandomForestRegressorod sklearn.ensemble.

forest = ensemble.RandomForestRegressor(**RF_tuned_parameters)
model = forest.fit(train_fold, train_y)
yhat = model.predict(test_fold)

Ten kod zawsze działał, dopóki nie wykonałem wstępnego przetwarzania danych ( train_y). Komunikat o błędzie mówi:

DataConversionWarning: przekazano wektor-kolumnę y, gdy oczekiwano tablicy 1d. Zmień kształt y na (n_samples,), na przykład za pomocą ravel ().

model = forest.fit (train_fold, train_y)

Wcześniej train_ybyła to seria, teraz jest to tablica numpy (jest to wektor kolumnowy). Jeśli zastosuję train_y.ravel(), staje się wektorem wierszowym i nie pojawia się żaden komunikat o błędzie, a krok przewidywania zajmuje bardzo dużo czasu (w rzeczywistości nigdy się nie kończy ...).

W dokumentach RandomForestRegressorznalazłem, że train_ypowinno to być zdefiniowane jako y : array-like, shape = [n_samples] or [n_samples, n_outputs] Każdy pomysł, jak rozwiązać ten problem?

Klausos Klausos
źródło
co to jest train_fold.shapei train_y.shape?
Alexander,
@Alexander: train_fold: tuple (749904,24) ... train: y.ravel (): tuple (749904,)
Klausos Klausos
Wygląda w porządku. Czy próbowałeś trenować 100 wierszy danych, aby upewnić się, że działa poprawnie (ponieważ powiedziałeś, że nigdy się nie skończyło)? Czy sprawdziłeś również zawartość swoich train_ydanych, aby upewnić się, że przetwarzanie wstępne ich nie uszkodziło?
Alexander
Wydrukuj RF_tuned_parametersdla nas.
Imanol Luengo
@imaluengo: {'n_estimators': 40, 'max_features': 0.8, 'n_jobs': 2, 'verbose': True, 'min_samples_split': 6, 'random_state': 123}
Klausos Klausos

Odpowiedzi:

192

Zmień tę linię:

model = forest.fit(train_fold, train_y)

do:

model = forest.fit(train_fold, train_y.values.ravel())

Edytować:

.valuespoda wartości w tablicy. (kształt: (n, 1)

.ravel przekonwertuje ten kształt tablicy na (n,)

Linda MacPhee-Cobb
źródło
33
Ktoś mógłby wyjaśnić, co tak naprawdę zmienia.
Rahul Bali
2
AttributeError: Obiekt „numpy.ndarray” nie ma atrybutu „wartości”
john ktejik
12
Jeśli masz numpy.ndarray, użyj zamiast tego train_y.ravel ().
Charity Leschinski
13
@RahulParashar co ravel()robi to: kiedy masz y.shape == (10, 1), używając y.ravel().shape == (10, ). Słowami ... spłaszcza tablicę.
PascalVKooten
Czy to w ogóle przydatne ostrzeżenie?
Alex
18

Z taką sytuacją spotkałem się również, gdy próbowałem wytrenować klasyfikator KNN . ale wydaje się, że ostrzeżenie zniknęło po zmianie:
knn.fit(X_train,y_train)
na
knn.fit(X_train, np.ravel(y_train,order='C'))

Przed tą linią użyłem import numpy as np.

Simon Leung
źródło
Podczas korzystania z tego .ravel()podejścia mój wektor kolumnowy był konwertowany na wektor wierszowy, a nie tablicę, ale ta poprawka działała dla mnie.
kabdulla
12

Miałem ten sam problem. Problem polegał na tym, że etykiety były w formacie kolumny, podczas gdy oczekiwał tego w wierszu. posługiwać sięnp.ravel()

knn.score(training_set, np.ravel(training_labels))

Mam nadzieję, że to rozwiązuje problem.

mohammad hassan bigdeli shamlo
źródło
1
Masz na myśli np.ravel()?
Pramesh Bajracharya
10

użyj poniższego kodu:

model = forest.fit(train_fold, train_y.ravel())

jeśli nadal otrzymujesz policzek przez pomyłkę tak samo jak poniżej?

Unknown label type: %r" % y

użyj tego kodu:

y = train_y.ravel()
train_y = np.array(y).astype(int)
model = forest.fit(train_fold, train_y)
Koral
źródło
3

Innym sposobem na to jest użycie ravel

model = forest.fit(train_fold, train_y.values.reshape(-1,))
sushmit
źródło
Chciałbym tylko dodać, że to zadziała dla Pandas Series, ale nie dla Pandas DataFrames.
Sal Alturaigi
2

Dzięki Neuraxle możesz łatwo rozwiązać ten problem:

p = Pipeline([
   # expected outputs shape: (n, 1)
   OutputTransformerWrapper(NumpyRavel()), 
   # expected outputs shape: (n, )
   RandomForestRegressor(**RF_tuned_parameters)
])

p, outputs = p.fit_transform(data_inputs, expected_outputs)

Neuraxle to podobny do sklearn framework do strojenia hiperparametrów i AutoML w projektach uczenia głębokiego!

AlexB
źródło
1
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])
Bibby Wang
źródło
2
Chociaż ten kod może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie zaowocowałoby większą liczbą pozytywnych głosów. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnień i dać wskazówkę co zastosować ograniczenia i założenia.
Dharman
0

Y = y.wartości [:, 0]

Y - formated_train_y

y - train_y

Jeyakeethan Geethan
źródło