数值错误:无法将字符串转换为浮点数。

4
我正在按照这篇教程编写朴素贝叶斯分类器:http://machinelearningmastery.com/naive-bayes-classifier-scratch-python/,但是一直出现以下错误:
dataset[i] = [float(x) for x in dataset[i]]
ValueError: could not convert string to float: 

这是我的代码中出现错误的部分:

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

以下是文件的命名方式:

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

我的文件fvectors.csv看起来是这样的

出了什么问题?如何解决?

4个回答

5
尝试跳过标题,第一列中的空标题导致了此问题。
>>> float(' ')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float:

如果您想跳过标题,可以通过以下方式实现:

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) 或者您可以忽略该异常:

try:
    float(element)
except ValueError:
    pass

如果您选择选项(2),请确保仅跳过第一行或仅跳过包含文本并且您确定的行。

1

查看您的数据图像,Python 无法将数据中最后一列具有值为 squarecircle 的数据进行转换。此外,您的数据中有一个标题需要跳过。

尝试使用以下代码:

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

0

这里有一行空白。

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

可以在强制转换之前检查值:
dataset[i] = [float(x) for x in dataset[i] if x != '']

0
您正在将字符串加载到 float 构造函数中,在特定条件下除外,否则会引发错误:
dataset[i] = [float(x) for x in dataset[i]]

不要使用列表推导式,也许最好使用for循环,这样你可以更轻松地处理这种情况:

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

关于捕获异常的更多信息,请参见:

Python中的Try/Except:如何正确忽略异常?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接