Строка Python в int для классификации

python

657 просмотра

1 ответ

1 Репутация автора

Я читаю книгу «Машинное обучение в действии».

Один пример в Главе 2 преобразует строку в int для использования в классификации. Например, 'student' = 1, 'teacher' = 2, engineer = 3.

Посмотрите код ниже в строке 12. Пока появляется ошибка, я ее выполняю:

недопустимый литерал для int () с основанием 10: 'largeDose'

Где моя проблема

def file2matrix(filename):
    fr = open(filename)
    numberOfLines = len(fr.readlines())         #get the number of lines in the file
    returnMat = zeros((numberOfLines,3))        #prepare matrix to return
    classLabelVector = []                       #prepare labels return   
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))
        index += 1
    return returnMat,classLabelVector

код звонящего:

from numpy import *
import kNN
datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt')
import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
#ax.scatter(datingDataMat[:,1], datingDataMat[:,2])
ax.scatter(datingDataMat[:,1], datingDataMat[:,2], array(datingLabels),      array(datingLabels))
plt.show()

Трассировка и ошибка:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile
    execfile(filename, namespace)
  File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)
  File "C:/Users/Zhiming Zhang/Documents/Machine Learning/kNN/execute.py", line 10, in <module>
    datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt')
  File "kNN.py", line 48, in file2matrix
    classLabelVector.append(int(listFromLine[-1]))

ValueError: недопустимый литерал для int () с основанием 10: 'largeDoses'

Автор: user6601116 Источник Размещён: 17.07.2016 09:50

Ответы (1)


1 плюс

36191 Репутация автора

Вы пытаетесь преобразовать строку типа "largeDose" в int, используя функцию преобразования int(). Но это не так. Функция int()преобразует только строки, которые выглядят как целые числа (например "123"), в целые числа.

В вашем случае вы можете использовать - if- elif- elseкаскад или словарь.

Каскад:

if listFromLine[-1] == 'largeDose':
    result = 1
elif listFromLine[-1] == 'teacher':
    result = 2
elif …
    …
else:
    result = 42  # or raise an exception or whatever

Словарь:

conversion = {
    'largeDose': 1,
    'teacher': 2,
    … }
# ...
# later, in the loop:
classLabelVector.append(conversion[listFromLine[-1]])
# The above will raise a KeyError if an unexpected value is given.
# Ir in case you want to use a default value:
classLabelVector.append(conversion.get(listFromLine[-1], 42))
Автор: Alfe Размещён: 17.07.2016 10:10
Вопросы из категории :
32x32