sklearn: trovati array con un numero di campioni incoerente quando si chiama LinearRegression.fit ()


102

Sto solo cercando di fare una semplice regressione lineare ma sono sconcertato da questo errore per:

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

che produce:

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

Queste selezioni devono avere le stesse dimensioni e dovrebbero essere array numpy, quindi cosa mi manca?

Risposte:


116

Sembra che sklearn richieda la forma dei dati di (numero di riga, numero di colonna). Se la forma dei dati è simile a (numero di riga,) (999, ), non funziona. Usando numpy.reshape(), dovresti cambiare la forma dell'array in (999, 1), ad esempio usando

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

Nel mio caso, ha funzionato con quello.


6
la mia forma dei dati è (10L,), come posso convertirla in (10L, 1). Quando utilizzo data = data.reshape (len (data), 1), la forma risultante è (10L, 1L) non (10L, 1)
user3841581

@ user3841581 fare riferimento a questo post .
George Liu

1
@Boern Grazie per il commento. Ho anche scoperto che X_train dovrebbe essere di taglia (N, 1) ma y_train dovrebbe essere di taglia (N,) non (N, 1), altrimenti non funziona, almeno non per me.
CrossEntropy

data.reshape (...) potrebbe mostrare un avviso di deprivazione se i dati sono un oggetto Series. Usa data.values.reshape (...)
NightFurry

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

24

Sembra che tu stia usando pandas dataframe (dal nome df2).

Puoi anche fare quanto segue:

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

NOTA: ho rimosso i "valori" poiché questo converte la serie pandas in numpy.ndarray e numpy.ndarray non ha l'attributo to_frame ().


11

Visto nel corso base di apprendimento profondo di Udacity:

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

2
Grazie! Questo è davvero il più semplice e facile da capire!
Juan A. Navarro

In realtà, il parametro Y è previsto come una forma (lunghezza,). Grazie!
Michael_Zhang

5

Penso che l'argomento "X" di regr.fit debba essere una matrice, quindi dovrebbe funzionare quanto segue.

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

4

Ho riscontrato questo errore perché ho convertito i miei dati in un file np.array. Ho risolto il problema convertendo i miei dati in un np.matrixinvece e prendendo la trasposizione.

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

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


2
expects X(feature matrix)

Prova a mettere le tue caratteristiche in una tupla come questa:

features = ["TV", "Radio", "Newspaper"]
X = dati [caratteristiche]

1

Ho affrontato un problema simile. Il problema nel mio caso era che il numero di righe in X non era uguale al numero di righe in y.

cioè il numero di voci nelle colonne delle caratteristiche non era uguale al numero di voci nella variabile di destinazione poiché avevo eliminato alcune righe dalle colonne delle caratteristiche.


0

Per analizzare due array (array1 e array2) devono soddisfare i due requisiti seguenti:

1) Devono essere un numpy.ndarray

Controllare con

type(array1)
# and
type(array2)

Se questo non è il caso, almeno uno di loro si esibisce

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

2) Le dimensioni devono essere le seguenti:

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

N è il numero di elementi presenti nell'array. Per fornire ad array1 il giusto numero di assi eseguire:

array1 = array1[:, numpy.newaxis]

0

Come menzionato sopra, l'argomento X deve essere una matrice o un array numpy con dimensioni note. Quindi potresti probabilmente usare questo:

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

Quindi il tuo dataframe verrebbe convertito in un array con dimensioni note e non avrai bisogno di rimodellarlo



-1

durante la frazione di prova del treno potresti aver fatto un errore

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

Il codice sopra è corretto

Potresti aver fatto come sotto, il che è sbagliato

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.