Я написал код вычисления матрицы беспорядка в Python:
def conf_mat(prob_arr, input_arr):
# confusion matrix
conf_arr = [[0, 0], [0, 0]]
for i in range(len(prob_arr)):
if int(input_arr[i]) == 1:
if float(prob_arr[i]) < 0.5:
conf_arr[0][1] = conf_arr[0][1] + 1
else:
conf_arr[0][0] = conf_arr[0][0] + 1
elif int(input_arr[i]) == 2:
if float(prob_arr[i]) >= 0.5:
conf_arr[1][0] = conf_arr[1][0] +1
else:
conf_arr[1][1] = conf_arr[1][1] +1
accuracy = float(conf_arr[0][0] + conf_arr[1][1])/(len(input_arr))
prob_arr является массивом, что мой возвращенный классификационный код и демонстрационный массив похож на это:
[1.0, 1.0, 1.0, 0.41592955657342651, 1.0, 0.0053405015805891975, 4.5321494433440449e-299, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.70943426182688163, 1.0, 1.0, 1.0, 1.0]
input_arr является исходными маркировками класса для набора данных, и он похож на это:
[2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1]
То, что мой код пытается сделать: я получаю prob_arr и input_arr и для каждого класса (1, и 2) я проверяю, неправильно классифицируются ли они или нет.
Но мой код только работает на два класса. Если я выполняю этот код для нескольких классифицируемых данных, он не работает. Как я могу сделать это для нескольких классов?
Например, для набора данных с тремя классами, это должно возвратиться: [[21,7,3],[3,38,6],[5,4,19]]
Вы можете сделать ваш код более лаконичным и (иногда), чтобы запустить быстрее, используя Numpy
. Например, в двухклассных случаях ваша функция может быть переписана как (см. mply.acc ()
):
def accuracy(actual, predicted):
"""accuracy = (tp + tn) / ts
, where:
ts - Total Samples
tp - True Positives
tn - True Negatives
"""
return (actual == predicted).sum() / float(len(actual))
, где:
actual = (numpy.array(input_arr) == 2)
predicted = (numpy.array(prob_arr) < 0.5)
У меня была аналогичная потребность. Это сработало для меня:
find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print
-121--552299- Почему руководители проекта получают требования? Там, где я работаю, у нас есть бизнес-аналитик, который помогает получить требования, хотя иногда разработчики могут обратиться к конечным пользователям, чтобы получить требования в некоторых случаях, так как не все известно в начале.
У нас есть горстка разработчиков, один BA и один руководитель проекта. В прошлом у нас был еще один BA, чтобы помочь наметить, что требуется и насколько сложной будет общая система.
-121--4690804-Необходимо сопоставить классы со строкой в матрице путаницы.
Здесь отображение является тривиальным:
def row_of_class(classe):
return {1: 0, 2: 1}[classe]
В цикле вычислите ожидаемый _ строка
, правильный _ строка
и приращение conf _ arr [ожидаемый _ строка] [правильный _ строка]
. У вас даже будет меньше кода, чем с того, с чего вы начали.
Вот класс путаницы Matrix, который поддерживает симпатичную печать и т. Д.:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.metrics.confusionmatrix- Pysrc.html
Эта функция создает путаницу Matrics для любого количества классов.
def create_conf_matrix(expected, predicted, n_classes):
m = [[0] * n_classes for i in range(n_classes)]
for pred, exp in zip(predicted, expected):
m[pred][exp] += 1
return m
def calc_accuracy(conf_matrix):
t = sum(sum(l) for l in conf_matrix)
return sum(conf_matrix[i][i] for i in range(len(conf_matrix))) / t
В отличие от вашей функции выше, вы должны извлекать прогнозируемые классы перед вызовом функции, основываясь на ваших результатах классификации, I.E. sth. вроде
[1 if p < .5 else 2 for p in classifications]
В общем смысле вам нужно будет изменить свой массив вероятности. Вместо того, чтобы наличие одного номера для каждого экземпляра и классификации на основе того, больше, больше 0,5, вам нужно понадобиться список баллов (один для каждого класса), а затем принять наибольшее количество баллов в качестве класса, который был выбрал (aka argmax).
Вы можете использовать словарь для удержания вероятностей для каждой классификации:
prob_arr = [{classification_id: probability}, ...]
Выбор классификации будет что-то вроде:
for instance_scores in prob_arr :
predicted_classes = [cls for (cls, score) in instance_scores.iteritems() if score = max(instance_scores.values())]
Это обрабатывает случай, когда два класса имеют одинаковые оценки. Вы можете получить один балл, выбрав первый в этом списке, но как вы справляетесь, что зависит от того, что вы классифицируете.
Как только у вас есть список прогнозируемых классов и список ожидаемых классов, вы можете использовать код типа TORSTEN MAREK для создания массива путаницы и вычисляет точность.