2016-01-14 15 views
9

Sto usando Python scikit-learn per la regressione lineare semplice su dati ottenuti da csv.Scikit-learn: errore nel modello di fitting - L'input contiene NaN, infinito o un valore troppo grande per float64

reader = pandas.io.parsers.read_csv("data/all-stocks-cleaned.csv") 
stock = np.array(reader) 

openingPrice = stock[:, 1] 
closingPrice = stock[:, 5] 

print((np.min(openingPrice))) 
print((np.min(closingPrice))) 
print((np.max(openingPrice))) 
print((np.max(closingPrice))) 

peningPriceTrain, openingPriceTest, closingPriceTrain, closingPriceTest = \ 
    train_test_split(openingPrice, closingPrice, test_size=0.25, random_state=42) 


openingPriceTrain = np.reshape(openingPriceTrain,(openingPriceTrain.size,1)) 

openingPriceTrain = openingPriceTrain.astype(np.float64, copy=False) 
# openingPriceTrain = np.arange(openingPriceTrain, dtype=np.float64) 

closingPriceTrain = np.reshape(closingPriceTrain,(closingPriceTrain.size,1)) 
closingPriceTrain = closingPriceTrain.astype(np.float64, copy=False) 

openingPriceTest = np.reshape(openingPriceTest,(openingPriceTest.size,1)) 
closingPriceTest = np.reshape(closingPriceTest,(closingPriceTest.size,1)) 

regression = linear_model.LinearRegression() 

regression.fit(openingPriceTrain, closingPriceTrain) 

predicted = regression.predict(openingPriceTest) 

Il valori minimi e massimi sono mostrati come 0,0 0,6 41998,0 2593,9

Eppure io sto ottenendo questo errore ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

Come dovrei rimuovere questo errore? Perché dal risultato precedente è vero che non contiene infiniti o valori Nan.

Qual è la soluzione per questo?

Edit: all-stock-cleaned.csv è avaliabale a http://www.sharecsv.com/s/cb31790afc9b9e33c5919cdc562630f3/all-stocks-cleaned.csv

+0

Si prega di provare a fornire un esempio riproducibile. – iled

+0

@iled all-stocks-clean.csv è disponibile all'indirizzo http://www.sharecsv.com/s/cb31790afc9b9e33c5919cdc562630f3/all-stocks-cleaned.csv –

risposta

21

Il problema con il vostro regressione è che in qualche modo NaN 's essere nascosto nel dati. Questo potrebbe essere facilmente controllato con il seguente frammento di codice:

import pandas as pd 
import numpy as np 
from sklearn import linear_model 
from sklearn.cross_validation import train_test_split 

reader = pd.io.parsers.read_csv("./data/all-stocks-cleaned.csv") 
stock = np.array(reader) 

openingPrice = stock[:, 1] 
closingPrice = stock[:, 5] 

openingPriceTrain, openingPriceTest, closingPriceTrain, closingPriceTest = \ 
    train_test_split(openingPrice, closingPrice, test_size=0.25, random_state=42) 

openingPriceTrain = openingPriceTrain.reshape(openingPriceTrain.size,1) 
openingPriceTrain = openingPriceTrain.astype(np.float64, copy=False) 

closingPriceTrain = closingPriceTrain.reshape(closingPriceTrain.size,1) 
closingPriceTrain = closingPriceTrain.astype(np.float64, copy=False) 

openingPriceTest = openingPriceTest.reshape(openingPriceTest.size,1) 
openingPriceTest = openingPriceTest.astype(np.float64, copy=False) 

np.isnan(openingPriceTrain).any(), np.isnan(closingPriceTrain).any(), np.isnan(openingPriceTest).any() 

(True, True, True) 

Se si tenta assegnazione dei valori mancanti come di seguito:

openingPriceTrain[np.isnan(openingPriceTrain)] = np.median(openingPriceTrain[~np.isnan(openingPriceTrain)]) 
closingPriceTrain[np.isnan(closingPriceTrain)] = np.median(closingPriceTrain[~np.isnan(closingPriceTrain)]) 
openingPriceTest[np.isnan(openingPriceTest)] = np.median(openingPriceTest[~np.isnan(openingPriceTest)]) 

tuo regressione verrà eseguito senza problemi, senza un problema:

regression = linear_model.LinearRegression() 

regression.fit(openingPriceTrain, closingPriceTrain) 

predicted = regression.predict(openingPriceTest) 

predicted[:5] 

array([[ 13598.74748173], 
     [ 53281.04442146], 
     [ 18305.4272186 ], 
     [ 50753.50958453], 
     [ 14937.65782778]]) 

In breve: mancano dei valori nei dati, come indicato dal messaggio di errore.

EDIT::

forse un approccio più facile e più semplice sarebbe quella di verificare se si dispone di eventuali dati mancanti a destra dopo aver letto i dati con panda:

data = pd.read_csv('./data/all-stocks-cleaned.csv') 
data.isnull().any() 
Date     False 
Open      True 
High      True 
Low      True 
Last      True 
Close     True 
Total Trade Quantity  True 
Turnover (Lacs)   True 

e poi imputare il dati con una delle due linee indicati

data = data.fillna(lambda x: x.median()) 

o

data = data.fillna(method='ffill') 
+2

Grazie mille! -Il metodo = ffill ha funzionato! –

+0

np.isnan (openingPriceTrain) .any(), np.isnan (closingPriceTrain) .any(), np.isnan (openingPriceTest) .any() (Vero, Vero, Vero) questa parte mi ha aiutato a determinare il problema, grazie mille – Rahul