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.