Как записать матрицу беспорядка в Python?

Я написал код вычисления матрицы беспорядка в 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]]

49
задан Greenstick 30 December 2017 в 16:19
поделиться

5 ответов

Вы можете сделать ваш код более лаконичным и (иногда), чтобы запустить быстрее, используя 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)
2
ответ дан 7 November 2019 в 11:14
поделиться

У меня была аналогичная потребность. Это сработало для меня:

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 [ожидаемый _ строка] [правильный _ строка] . У вас даже будет меньше кода, чем с того, с чего вы начали.

0
ответ дан 7 November 2019 в 11:14
поделиться

Вот класс путаницы Matrix, который поддерживает симпатичную печать и т. Д.:

http://nltk.googlecode.com/svn/trunk/doc/api/nltk.metrics.confusionmatrix- Pysrc.html

2
ответ дан 7 November 2019 в 11:14
поделиться

Эта функция создает путаницу 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]
3
ответ дан 7 November 2019 в 11:14
поделиться
121 --- 2288444-

В общем смысле вам нужно будет изменить свой массив вероятности. Вместо того, чтобы наличие одного номера для каждого экземпляра и классификации на основе того, больше, больше 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 для создания массива путаницы и вычисляет точность.

0
ответ дан 7 November 2019 в 11:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: