моя кривая ro c всегда идеальна и моя точность всегда 1 - PullRequest
0 голосов
/ 29 марта 2020

В последнее время я работаю над глубоким обучением, используя мою обученную модель dlib для прогнозирования ориентиров на некоторой картинке. Как сказал мой последний вопрос, у меня есть два набора точек, один из которых является истинным ориентиром (от xml), другой - прогнозируемым ориентиром (от dlib way).
Я использую sklearn roc_curve и precision_recall_cure для кривая графика, а y_test - это двоичный набор, равный 1, если обозначенное расстояние (расстояние между прогнозируемым ориентиром и делением истинного ориентира на расстояние двух глаз в истинном ориентире) <0,10, y_socre - это набор чисел с плавающей точкой, который равен 1 - нормализовано расстояние. <br>Я строю кривую RO C и кривую PR на основе этих данных, но кривая ro c всегда идеальна (от (0,0) до (1,0) до (1,1)) и точность всегда равна 1 (кривая PR - горизонтальная линия).
Вот ro c кривая. введите описание изображения здесь Я действительно запутался. Вот мой код:

    import *
    root = et.parse("***/training_with_face_landmarks.xml").getroot()
    images = {}
    for ima in root.find('images').findall('image'):
         images[ima.attrib['file']] = ima.find('box').attrib
    predictor = dlib.shape_predictor('sp.dat')
    alllandmark = {}
    for i in images:
        img_mat = cv2.imread('dogs/' + i)
        alllandmark[i] = predictor(img_mat,dlib.rectangle(int(images[i]['left']),int(images[i]['top']),int(images[i]['left'])+int(images[i]['width']),int(images[i]['top'])+int(images[i]['height'])))
    truelandmark = {}
    for ima in root.find('images').findall('image'):
         temp = []
         for part_im in ima.find('box').findall('part'):
            temp.append(dlib.point(int(part_im.attrib['x']), int(part_im.attrib['y'])))
         truelandmark[ima.attrib['file']] = temp
    score_temp = []
    temp = []
    for name in truelandmark:
        stand = ((truelandmark[name][1].x - truelandmark[name][5].x) ** 2 + (truelandmark[name][1].y - truelandmark[name][5].y)**2)**0.5
        differ = ((truelandmark[name][1].x - alllandmark[name].part(1).x) ** 2 + (truelandmark[name][1].y - alllandmark[name].part(1).y)**2)**0.5
        score_temp.append(1-differ/stand)
        if rate < 0.10:
            temp.append(1)
        else:
            temp.append(0)
    y_test = np.array(temp)
    y_score = np.array(score_temp)
    fpr, tpr, thr = roc_curve(y_test, y_score, pos_label=1)
    auc = roc_auc_score(y_test, y_score)
    then plot...

Если честно, у меня есть представление об этом. Может быть, кривая на самом деле идеальна из-за выбора y_score и y_test. В моей стратегии они тесно связаны (если y_score [x]> 0,9, y_test [x] = 1). Так что, возможно, мой способ построения кривой ro c совершенно неверен. Я добавил случайные числа с плавающей точкой от 0 до 0,04 к y_score, чтобы кривая ro c выглядела более нормальной. По моему мнению, поскольку я всегда добавляю числа с плавающей точкой в ​​диапазоне от 0 до 0,04, добавленные числа могут быть уменьшены при сравнении двух алгоритмов. Я сказал своему учителю, что он считает, что это неправильно.
Кривая PR такая же.
Итак, я выбрал неправильно y_test или y_score? Или я сделал что-то не так на ранней стадии?

1 Ответ

0 голосов
/ 03 апреля 2020

Если я правильно понимаю, есть теоретическая ошибка в том, как вы ставите проблему (и код косвенно). Согласно тому, что вы написали:

y_test - это двоичный набор, равный 1, если нормализованное расстояние (расстояние между прогнозируемым ориентиром и истинным ориентиром делится на расстояние двух глаз в истинном ориентире) <0,10 </p>

В принципе, вы рассматриваете y_test как переменную, напрямую зависящую от прогноза, что является методологическим противоречием.

Фактически, y_test должен быть списком истинных двоичных данных. этикетки как таковые. Это как-то «правда» само по себе и не должно зависеть от того, насколько (хорошо) вы способны предсказать.

Цель классификации / регрессии - приблизить предсказание к истине, а НЕ истину, близкую к предсказанию .

...