sklearn: Foram encontrados arrays com números inconsistentes de amostras ao chamar LinearRegression.fit ()


102

Estou apenas tentando fazer uma regressão linear simples, mas estou perplexo com este erro:

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

que produz:

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

Essas seleções devem ter as mesmas dimensões e devem ser matrizes numpy, então o que estou perdendo?

Respostas:


116

Parece que o sklearn requer a forma dos dados de (número da linha, número da coluna). Se a forma dos seus dados for (número da linha,) semelhante (999, ), não funciona. Ao usar numpy.reshape(), você deve alterar a forma da matriz para (999, 1), por exemplo, usar

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

No meu caso, funcionou com isso.


6
meu formato de dados é (10L,), como faço para convertê-lo para (10L, 1). Quando eu uso data = data.reshape (len (data), 1), a forma resultante é (10L, 1L) e não (10L, 1)
user3841581

@ user3841581 consulte esta postagem .
George Liu

1
@Boern Obrigado pelo comentário. Também descobri que X_train deve ser do tamanho (N, 1), mas y_train deve ser do tamanho (N,) não (N, 1), caso contrário, não funciona, pelo menos não para mim.
CrossEntropy

data.reshape (...) pode mostrar um aviso de deprication se data for objeto Series. Use data.values.reshape (...)
NightFurry

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

24

Parece que você está usando o dataframe do pandas (do nome df2).

Você também pode fazer o seguinte:

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

NOTA: Eu removi "valores", pois isso converte a série pandas em numpy.ndarray e numpy.ndarray não tem o atributo to_frame ().


11

Visto no curso básico de aprendizado profundo da Udacity:

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

2
Obrigado! Este é realmente o mais simples e fácil de entender!
Juan A. Navarro

Na verdade, o parâmetro Y é esperado como uma forma (comprimento). Obrigado!
Michael_Zhang

5

Acho que o argumento "X" de regr.fit precisa ser uma matriz, então o seguinte deve funcionar.

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

4

Encontrei esse erro porque converti meus dados em um np.array. Resolvi o problema convertendo meus dados em um np.matrixe fazendo a transposição.

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

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


2
expects X(feature matrix)

Tente colocar seus recursos em uma tupla como esta:

recursos = ['TV', 'Rádio', 'Jornal']
X = dados [recursos]

1

Eu enfrentei um problema semelhante. O problema no meu caso era que o número de linhas em X não era igual ao número de linhas em y.

ou seja, o número de entradas nas colunas de recursos não era igual ao número de entradas na variável de destino, já que eu tinha eliminado algumas linhas das colunas de recursos.


0

Para analisar dois arrays (array1 e array2), eles precisam atender aos dois requisitos a seguir:

1) Eles precisam ser um numpy.ndarray

Verificar com

type(array1)
# and
type(array2)

Se esse não for o caso, pelo menos um deles execute

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

2) As dimensões devem ser as seguintes:

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

N é o número de itens que estão na matriz. Para fornecer array1 com o número certo de eixos, execute:

array1 = array1[:, numpy.newaxis]

0

Como foi mencionado acima, o argumento X deve ser uma matriz ou um array numpy com dimensões conhecidas. Então você provavelmente poderia usar isto:

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

Assim, seu dataframe seria convertido em um array com dimensões conhecidas e você não precisará reformulá-lo



-1

durante a divisão do teste do trem, você pode ter cometido um erro

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

O código acima está correto

Você pode ter feito o seguinte, o que está errado

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
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.