2017-03-26 4 views
4

ich dieses Tutorial bin nach einem Bayes-Klassifikator zu schreiben: http://machinelearningmastery.com/naive-bayes-classifier-scratch-python/Valueerror: konnte nicht Zeichenfolge konvertieren zu schweben:

Ich halte diesen Fehler:

dataset[i] = [float(x) for x in dataset[i]] 
ValueError: could not convert string to float: 

Hier ist der Teil meiner Code, wo der Fehler auftritt:

def loadDatasetNB(filename): 
    lines = csv.reader(open(filename, "rt")) 
    dataset = list(lines) 
    for i in range(len(dataset)): 
     dataset[i] = [float(x) for x in dataset[i]] 
    return dataset 

Und hier ist, wie die Datei aufgerufen wird:

def NB_Analysis(): 
    filename = 'fvectors.csv' 
    splitRatio = 0.67 
    dataset = loadDatasetNB(filename) 
    trainingSet, testSet = splitDatasetNB(dataset, splitRatio) 
    print('Split {0} rows into train={1} and test={2} rows').format(len(dataset), len(trainingSet), len(testSet)) 
    # prepare model 
    summaries = summarizeByClassNB(trainingSet) 
    # test model 
    predictions = getPredictionsNB(summaries, testSet) 
    accuracy = getAccuracyNB(testSet, predictionsNB) 
    print('Accuracy: {0}%').format(accuracy) 

NB_Analysis() 

My file fvectors.csv looks like this

Was geht hier falsch und wie kann ich es beheben?

Antwort

3

Versuchen Sie, eine Kopfzeile zu überspringen, eine leere Kopfzeile in der ersten Spalte verursacht das Problem.

>>> float(' ') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not convert string to float: 

Wenn Sie den Header überspringen möchten, können Sie es mit erreichen:

def loadDatasetNB(filename): 
    lines = csv.reader(open(filename, "rt")) 
    next(reader, None) # <<- skip the headers 
    dataset = list(lines) 
    for i in range(len(dataset)): 
     dataset[i] = [float(x) for x in dataset[i]] 
    return dataset 

(2) Oder Sie können einfach die Ausnahme ignorieren:

try: 
    float(element) 
except ValueError: 
    pass 

Wenn Sie sich entscheiden zu gehen, Mit Option (2), stellen Sie sicher, dass Sie nur die erste Zeile oder nur Zeilen überspringen, die Text enthalten, und Sie wissen es sicher.

0

Es gibt eine leere Zeile.

>> float('') 
ValueError: could not convert string to float: 

Sie können den Wert überprüfen, bevor es Gießen:

dataset[i] = [float(x) for x in dataset[i] if x != ''] 
0

Sie laden Strings in den float Konstruktor hier, was es sei denn, unter bestimmten Bedingungen sind, einen Fehler auslöst:

dataset[i] = [float(x) for x in dataset[i]] 

Anstatt ein Listenverständnis zu verwenden, wäre es vielleicht besser, eine for-Schleife zu verwenden, damit Sie diesen Fall leichter handhaben können:

data = [] 
for x in dataset[i]: 
    try: 
     value = float(x) 
    except ValueError: 
     value = x 
    data.append(value) 
dataset[i] = data 

Sehen Sie mehr über Ausnahmen hier fangen:

Try/Except in Python: How do you properly ignore Exceptions?

1

auf das Bild Ihrer Daten Sehen, Python kann nicht die letzte Spalte Ihrer Daten mit den Werten square und circle konvertieren. Außerdem haben Sie eine Kopfzeile in Ihren Daten, die Sie überspringen müssen.

Versuchen Sie diesen Code verwenden:

def loadDatasetNB(filename): 
    with open(filename, 'r') as fp: 
     reader= csv.reader(fp) 
     # skip the header line 
     header = next(reader) 
     # save the features and the labels as different lists 
     data_features = [] 
     data_labels = [] 
     for row in reader: 
      # convert everything except the label to a float 
      data_features.append([float(x) for x in row[:-1]]) 
      # save the labels separately 
      data_labels.append(row[-1]) 
    return data_features, data_labels 
Verwandte Themen