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?
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.
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
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 != '']
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?