web-dev-qa-db-fra.com

ValueError: impossible de convertir la chaîne en float:

Je suis un tutoriel pour écrire un classificateur Naive Bayes: http://machinelearningmastery.com/naive-bayes-classifier-scratch-python/

Je continue à avoir cette erreur:

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

Voici la partie de mon code où l'erreur se produit: 

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

Et voici comment s'appelle le fichier:

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

Mon fichier fvectors.csv ressemble à ceci

Qu'est-ce qui ne va pas ici et comment puis-je résoudre le problème?

4
Thom Elliott

Essayez de sauter un en-tête, un en-tête vide dans la première colonne est à l'origine du problème.

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

Si vous voulez ignorer l'en-tête, vous pouvez le réaliser avec:

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) Ou vous pouvez simplement ignorer l'exception:

try:
    float(element)
except ValueError:
    pass

Si vous décidez d'utiliser l'option (2), veillez à ne sauter que la première ligne ou uniquement les lignes contenant du texte et vous le saurez à coup sûr. 

3
Taras Matsyk

En examinant l'image de vos données, python ne peut pas convertir la dernière colonne de vos données avec les valeurs square et circle. En outre, vous avez un en-tête dans vos données que vous devez ignorer. 

Essayez d'utiliser ce 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

Il y a une ligne vide.

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

Vous pouvez vérifier la valeur avant de la lancer:

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

Vous chargez ici des chaînes dans le constructeur float, qui, sauf si elles sont dans des conditions spécifiques, génèrent une erreur:

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

Au lieu d'utiliser une compréhension de liste, il serait peut-être préférable d'utiliser une boucle for afin de pouvoir gérer plus facilement ce cas:

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

En savoir plus sur la capture d'exceptions ici:

Essayez/Sauf en Python: Comment ignorez-vous correctement les exceptions?

0
Julien