2016-12-05 2 views
0

Ich versuche alle fehlenden Daten (wie durch '?' Angegeben) in NaN zu setzen und benutze das Imputationswerkzeug von sklearn, um sie zu mitteln in einen Mittelwert. Um auf mein Problem reproduzierbar zu sein, ich habe meinen Code wie unten aufgeführt: Ich benutze PyCharm als IDE, Mac OS X und anaconda auf Py 2.7.12Fehler beim Drehen eines Fragezeichens ('?') In NaN beim Eingeben von Maschinenlerndaten

Dies ist mein Code:

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/communities/communities.data', header=None, sep=',\s', na_values=["?"]) 
df.tail() 
from sklearn.preprocessing import Imputer 
imr = Imputer(missing_values='NaN', strategy='mean', axis=0) 
imr= imr.fit(df) 

Und hier ist meine Fehlermeldung

/Users/zdong/anaconda/bin/python/Users/zdong/PycharmProjects/ml/crim_workingfile.py 
/Users/zdong/PycharmProjects/ml/crim_workingfile.py:4: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'. 
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning databases/communities/communities.data', header=None, sep=',\s', na_values=["?"]) 
Traceback (most recent call last): 
    File "/Users/zdong/PycharmProjects/535_final/535_workingfile.py", line 8, 
in <module> 
imr= imr.fit(df) 
    File "/Users/zdong/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/imputation.py", 
line 156, in fit 
force_all_finite=False) 
    File "/Users/zdong/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py" 
line 382, in check_array 
array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: invalid literal for float(): 6,?,?,Ontariocity,10,0.2,0.78,0.14,0.46,0.24,0.77,0.5,0.62,0.4,0.17,0.21,1,0.4,0.73,0.22,0.25,0.26,0.47,0.29,0.36,0.24,0.28,0.32,0.22,0.27,0.25,0.29,0.16,0.35,0.5,0.55,0.16,0.47,0.58,0.53,0.2,0.6,0.24 

Bitte helfen Sie mir den verwüsteten Anfänger QAQ ...

+0

Ich weiß nichts über sklearn im Besonderen, aber der Fehler, den Sie erhalten, ist, weil es versucht, in ein Float-Array zu konvertieren, und nicht '?' zu einem. 'NaN' wäre in Ordnung, also konvertiere vielleicht einfach alles '?' dazu vor dem Parsen? – Iluvatar

+0

@Iluvatar Danke ... Wie kann ich diese "?" in NaN? Sorry ... Ich weiß, dass diese Frage ein bisschen albern ist ... –

+0

Ah, ich sehe, du benutzt 'na_values ​​= ["?"] ', Also sollte es das fangen. Es kann sein, dass dein 'sep'' ', \ s'' ist, aber es sieht so aus, als wäre es nur eine CSV, die du dort hast (keine Leerzeichen zwischen Kommas). Wenn das der Fall ist, würde es die ganze Zeile als eine einzige Spalte nehmen. – Iluvatar

Antwort

0

Okay, ich denke, es gibt hier genug für eine tatsächliche Antwort. Wenn Sie Ihre Daten betrachten, sehen die ersten 5 Spalten wie Informationen über die Städte aus (Name, andere Werte> = 1) und der Rest sieht aus wie die Daten, die Sie interessieren für die fit, die Sie in der letzten Zeile machen.

Ihr Problem ist, dass die Anpassung versucht, alle Daten in einen Float zu werfen, und offensichtlich auf die Stadt Namen fehlschlägt. Die in die Anpassung übernommenen Daten sollten wahrscheinlich alles außer den ersten 5 Spalten sein (vielleicht 4, wenn Spalte 5 die Verzerrung ist?). Probieren Sie so etwas wie:

df = pd.read_csv('communities.data', header=None, na_values=["?"], usecols=range(5, 128)) 

und ändern Sie die 5 je nachdem, welche Spalten Sie benötigen.

+0

Das funktioniert genau richtig! Ich danke dir sehr! –

Verwandte Themen