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?

ensolarado
fonte

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.

Yul
fonte
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 ().

user24981
fonte
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']])
xilef
fonte
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)
Anish
fonte
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)))

Josh Grinberg
fonte
2
expects X(feature matrix)

Tente colocar seus recursos em uma tupla como esta:

recursos = ['TV', 'Rádio', 'Jornal']
X = dados [recursos]
Yuanxu Xu
fonte
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.

Shivam Agrawal
fonte
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]
Richard
fonte
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

Andy J.
fonte
0

Alguns dias enfrentei o mesmo problema. A razão era matrizes de tamanhos diferentes.

Engr Saliheen Afridi
fonte
-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)
naveen
fonte