2014-08-16 4 views
2

Предположим, у меня есть задача классификации, где я хочу классифицировать текст как «Спам» или «Ветвь». «Точность» счет (в расчете на «TP/(TP + FP)») была бы полезной мерой ошибки, чтобы определить, сколько «Ham» сообщения были неправильно классифицированы как «спам», предполагая следующую спутанность матрицу:Есть ли способ определить порядок ярлыков в LabelEncoder scikit-learn?

enter image description here

насколько я знаю, scikit вычисляет матрицу спутанность после следующей схеме:

enter image description here

Теперь, если я использую кодер этикетки (см код ниже), это дало бы «Спам» class label 1 и «ham» метка класса 0, которая отменит матрицу путаницы (FP будет стать TN и т. д.), чтобы показатель точности получал другое значение. Итак, мой вопрос заключается в том, есть ли способ, с помощью которого я могу указать кодировщик ярлыков, для которого метка назначается для какого класса? (В этом случае это просто, я могу решить проблему простым пониманием списка, но мне интересно, есть ли что-то уже в scikit.)

Итак, цель состоит в том, чтобы использовать LabelEncode, чтобы дать «спам» класс этикетки 0 и «хам» класс этикетки 1.

from sklearn.preprocessing import LabelEncoder 

X = df['text'].values 
y = df['class'].values 

print('before: %s ...' %y[:5]) 

le = LabelEncoder() 
y = le.fit_transform(y) 

print('after: %s ...' %y[:5]) 


before: ['spam' 'ham' 'ham' 'ham' 'ham'] ... 
after: [1 0 0 0 0] ... 
+0

Этикетки пронумерованы в отсортированном порядке, поэтому для слов, которые будут означать в алфавитном порядке. Это не похоже на то, что LabelEncoder предоставляет способ указания пользовательского порядка. Но было бы довольно просто написать свою собственную функцию, которая просто отображает ваши строки в числа так, как вы хотите. – BrenBarn

ответ

0

Конечно, если вы используете precision_score(... pos_label=1, ...) вы можете присвоить положительный ярлык к классу вручную, что очень важно, чтобы вычислить «правильный» потому что уравнение для точности зависит от того, что вы «положительный» класс (Precision = tp/(tp + fp))

Но случай, когда маркировка может вызвать проблемы, заключалась в том, что я делал кросс-валидацию и, например, хотел вычислить точность, поскольку функция cross_validation не имеет параметра для
«положительная метка»

cross_val_score(clf, X_train, y_train, cv=cv, scoring='precision')

Однако, как показано на GitHub, обходной путь, чтобы создать «пользовательский бомбардира», который можно использовать в кросс-проверки для решения проблемы метки:

from functools import partial 
from sklearn.metrics import precision_score, make_scorer 
custom_scorer = make_scorer(partial(precision_score, pos_label="1")) 
1

LabelEncoder использует порядок, встроенный в Python, то есть то, что вы получите от sorted без key или сравнения функция. Но метрики оценки, которые являются асимметричными по. этикетки взять аргумент в pos_label ключевое слово, чтобы явно сделать один класс «позитивный» класс:

>>> a = np.random.randint(0, 2, 10) 
>>> a 
array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0]) 
>>> precision_recall_fscore_support(a, np.ones(10), pos_label=1, average='micro') 
(0.20000000000000001, 1.0, 0.33333333333333337, None) 
>>> precision_recall_fscore_support(a, np.ones(10), pos_label=0, average='micro') 
/home/larsmans/src/scikit-learn/sklearn/metrics/classification.py:920: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 due to no predicted samples. 
(0.0, 0.0, 0.0, None) 
Смежные вопросы