web-dev-qa-db-de.com

ValueError: String konnte nicht in Float konvertiert werden:

Ich folge diesem Tutorial, um einen Naive Bayes Classifier zu schreiben: http://machinelearningmastery.com/naive-bayes-classifier-scratch-python/

Ich bekomme diesen Fehler immer wieder:

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

Hier ist der Teil meines Codes, an dem 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 so heißt die Datei:

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()

Meine Datei fvectors.csv sieht so aus

Was läuft hier falsch und wie kann ich es beheben?

4
Thom Elliott

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 die Kopfzeile überspringen möchten, können Sie dies mit

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 die Ausnahme einfach ignorieren:

try:
    float(element)
except ValueError:
    pass

Wenn Sie sich für die Option (2) entscheiden, stellen Sie sicher, dass Sie nur die erste Zeile oder nur Zeilen mit Text überspringen, die Sie genau kennen. 

3
Taras Matsyk

Beim Abbild Ihrer Daten kann Python die letzte Spalte Ihrer Daten nicht mit den Werten square und circle konvertieren. Außerdem haben Sie in Ihren Daten einen Header, den Sie überspringen müssen. 

Versuchen Sie es mit diesem Code:

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
1
James

Es gibt eine leere Zeile.

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

Sie können den Wert vor dem Casting überprüfen:

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

Sie laden hier Strings in den Konstruktor float, der, wenn nicht unter bestimmten Bedingungen, einen Fehler auslöst:

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

Anstatt ein Listenverständnis zu verwenden, ist es vielleicht besser, eine for-Schleife zu verwenden, um diesen Fall leichter handhaben zu können:

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

Weitere Informationen zum Erfassen von Ausnahmen finden Sie hier:

Try/Except in Python: Wie ignoriert man Ausnahmen richtig?

0
Julien