2017-01-12 1 views
0

Я пытаюсь сравнить различные методы расчета расстояния и различные системы голосования в алгоритме k-ближайших соседей. В настоящее время моя проблема заключается в том, что независимо от того, что я делаю precision_recall_fscore_support метод scikit-learn дает точно такие же результаты для точности, отзыва и fscore. Почему это? Я пробовал его на разных наборах данных (радужка, стекло и вино). Что я делаю не так? Код до сих пор:Точность, напомнить, оценка F1 равна с sklearn

#!/usr/bin/env python3 
from collections import Counter 
from data_loader import DataLoader 
from sklearn.metrics import precision_recall_fscore_support as pr 
import random 
import math 
import ipdb 

def euclidean_distance(x, y): 
    return math.sqrt(sum([math.pow((a - b), 2) for a, b in zip(x, y)])) 

def manhattan_distance(x, y): 
    return sum(abs([(a - b) for a, b in zip(x, y)])) 

def get_neighbours(training_set, test_instance, k): 
    names = [instance[4] for instance in training_set] 
    training_set = [instance[0:4] for instance in training_set] 
    distances = [euclidean_distance(test_instance, training_set_instance) for training_set_instance in training_set] 
    distances = list(zip(distances, names)) 
    print(list(filter(lambda x: x[0] == 0.0, distances))) 
    sorted(distances, key=lambda x: x[0]) 
    return distances[:k] 

def plurality_voting(nearest_neighbours): 
    classes = [nearest_neighbour[1] for nearest_neighbour in nearest_neighbours] 
    count = Counter(classes) 
    return count.most_common()[0][0] 

def weighted_distance_voting(nearest_neighbours): 
    distances = [(1/nearest_neighbour[0], nearest_neighbour[1]) for nearest_neighbour in nearest_neighbours] 
    index = distances.index(min(distances)) 
    return nearest_neighbours[index][1] 

def weighted_distance_squared_voting(nearest_neighbours): 
    distances = list(map(lambda x: 1/x[0]*x[0], nearest_neighbours)) 
    index = distances.index(min(distances)) 
    return nearest_neighbours[index][1] 

def main(): 
    data = DataLoader.load_arff("datasets/iris.arff") 
    dataset = data["data"] 
    # random.seed(42) 
    random.shuffle(dataset) 
    train = dataset[:100] 
    test = dataset[100:150] 
    classes = [instance[4] for instance in test] 
    predictions = [] 
    for test_instance in test: 
     prediction = weighted_distance_voting(get_neighbours(train, test_instance[0:4], 15)) 
     predictions.append(prediction) 
    print(pr(classes, predictions, average="micro")) 

if __name__ == "__main__": 
    main() 

ответ

1

Проблема в том, что вы используете среднее значение «микро».

Как указано here:

Как написано в документации: «Отметим, что для„микро“-averaging в мультиклассируют обстановке будет производить равной точности, вспомнить и [Изображение: F], в то время как «Взвешенное» усреднение может привести к F-оценке, которая равна , а не между точностью и отзывом ». http://scikit-learn.org/stable/modules/model_evaluation.html

Но если вы уронили метку большинства, используя параметр метки, затем микро-усреднения отличается от точности и точность отличается от отзыва.

Смежные вопросы