Um vetor-coluna y foi passado quando uma matriz 1d era esperada


117

Eu preciso para se ajustar RandomForestRegressora partir sklearn.ensemble.

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

Este código sempre funcionou até que eu fiz algum pré-processamento de dados ( train_y). A mensagem de erro diz:

DataConversionWarning: Um vetor de coluna y foi passado quando uma matriz 1d era esperada. Altere a forma de y para (n_samples,), por exemplo, usando ravel ().

model = forest.fit (train_fold, train_y)

Anteriormente train_yera uma série, agora é uma matriz numpy (é um vetor coluna). Se eu aplicar train_y.ravel(), ele se torna um vetor linha e nenhuma mensagem de erro aparece, através da etapa de predição leva muito tempo (na verdade, nunca termina ...).

Na documentação de RandomForestRegressorachei que train_ydeveria ser definido como y : array-like, shape = [n_samples] or [n_samples, n_outputs] Alguma ideia de como resolver esse problema?


o que é train_fold.shapee train_y.shape?
Alexander

@Alexander: train_fold: tupla (749904,24) ... train: y.ravel (): tupla (749904,)
Klausos Klausos

Parece bem. Você já tentou treinar 100 linhas de dados para garantir que funcione corretamente (já que você disse que nunca terminou)? Além disso, você examinou o conteúdo dos seus train_ydados para garantir que o pré-processamento não os corrompeu?
Alexander

Imprima RF_tuned_parameterspara nós, por favor.
Imanol Luengo

@imaluengo: {'n_estimators': 40, 'max_features': 0.8, 'n_jobs': 2, 'verbose': True, 'min_samples_split': 6, 'random_state': 123}
Klausos Klausos

Respostas:


188

Mude esta linha:

model = forest.fit(train_fold, train_y)

para:

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

Editar:

.valuesfornecerá os valores em uma matriz. (forma: (n, 1)

.ravel irá converter essa forma de matriz em (n,)


33
Alguém pode explicar o que realmente muda.
Rahul Bali

2
AttributeError: objeto 'numpy.ndarray' não tem atributos 'valores'
john ktejik

12
Se você tiver um numpy.ndarray, use train_y.ravel ().
Charity Leschinski

13
@RahulParashar o que ravel()faz é: quando você tem y.shape == (10, 1), usando y.ravel().shape == (10, ). Em palavras ... ele achata uma matriz.
PascalVKooten

Este é mesmo um aviso útil?
alex

18

Eu também encontrei essa situação quando estava tentando treinar um classificador KNN . mas parece que o aviso desapareceu depois que mudei:
knn.fit(X_train,y_train)
para
knn.fit(X_train, np.ravel(y_train,order='C'))

À frente desta linha eu usei import numpy as np.


Ao usar a .ravel()abordagem, meu vetor de coluna era um conversor para um vetor de linha em vez de uma matriz, mas essa correção funcionou para mim.
kabdulla

12

Eu tive o mesmo problema. O problema era que os rótulos estavam em um formato de coluna enquanto ele esperava em uma linha. usarnp.ravel()

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

Espero que isso resolva isso.


1
Você quer dizer np.ravel()?
Pramesh Bajracharya de

10

use o código abaixo:

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

se você ainda está recebendo tapa por erro tão idêntico como abaixo?

Unknown label type: %r" % y

use este código:

y = train_y.ravel()
train_y = np.array(y).astype(int)
model = forest.fit(train_fold, train_y)

3

Outra maneira de fazer isso é usar ravel

model = forest.fit(train_fold, train_y.values.reshape(-1,))

Eu gostaria apenas de acrescentar que isso funcionará para Pandas Series, mas não para Pandas DataFrames.
Sal Alturaigi

2

Com o neuraxle , você pode resolver isso facilmente:

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 é uma estrutura semelhante a sklearn para ajuste de hiperparâmetros e AutoML em projetos de aprendizado profundo!


1
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])

2
Embora este código possa resolver a questão, incluir uma explicação de como e por que isso resolve o problema realmente ajudaria a melhorar a qualidade de sua postagem e provavelmente resultaria em mais votos positivos. Lembre-se de que você está respondendo à pergunta para os leitores no futuro, não apenas para a pessoa que está perguntando agora. Por favor edite sua resposta para adicionar explicações e dar uma indicação do que limitações e premissas se aplicam.
Dharman

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.