2016-09-24 3 views
0

Я имею дело с различением двух категорий А и В эти дни, и я считаю, что если категория B содержит несколько подкатегорий B1, B2, B3 ...distinguishment с подкатегориями

Иногда отличить результат лучше явный маркировка B1, B2, B3 (суб категории этикетки), но иногда результат лучше для сбора подкатегорий и просто присваивая им B.

В другом слове, иногда

y=[A, A, A, ..., B1, B1, ..., B2, B2, ... B3, B3, ...] 

лучше, но иногда,

y=[A, A, A, ..., B, B, B, ...] 

лучше.

Я думаю, наивно есть два удара эффект результат:

  1. корпус 1 включает больше информации
  2. случай 2 алгоритм может сосредоточиться больше на различие А и В

Но Я не уверен, что мое предположение верно, кто-нибудь знает об этом? И когда вы имеете дело с этим случаем, когда есть подкатегории, каков ваш способ получить лучший результат?

ответ

0

В этой ситуации вы можете использовать двухуровневый классификатор, который сначала предсказывает класс верхнего уровня, а второй выбирает наиболее вероятный класс второго уровня, который падает ниже. Вот какой-то код, который я использовал,

from sklearn.base import BaseEstimator, ClassifierMixin 
import pandas as pd 
import numpy as np 

class TwoLevelClassifier(BaseEstimator, ClassifierMixin): 
    """ 
    A two-level classifier intended to be used with labels taken from a 2-level taxonomy. 
    The labels are pipe-separated class-subclass pairs as "class|subclass". 

    >>> from sklearn.linear_model import LogisticRegression() 
    >>> X = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]]) 
    >>> y1 = pd.Series(['A','A','B']) 
    >>> y2 = pd.Series(['A1','A2','B1']) 
    >>> y = y1 + "|" + y2 
    >>> clf = TwoLevelClassifier(LogisticRegression(), LogisticRegression()) 
    >>> clf.fit(X,y) 
    """ 

    def __init__(self, classifier1, classifier2): 
     self.classifier1 = classifier1 
     self.classifier2 = classifier2 

    def fit(self, X, y): 
     y1 = y.str.split('|').str[0] 
     y2 = y.str.split('|').str[1] 
     self.classifier1.fit(X, y1) 
     self.classifier2.fit(X, y) 
     self.classes_ = self.classifier2.classes_ 

    def predict_proba(self, X): 
     level1_pred = pd.Series(self.classifier1.predict(X)) 
     probs = pd.DataFrame(self.classifier2.predict_proba(X), columns = self.classifier2.classes_) 
     classes_ = self.classifier2.classes_ 
     mask = np.array(pd.Series(level1_pred).map(lambda x: [y.split('|')[0] == x for y in classes_]).tolist()) 
     probs_filtered = probs.where(mask, 0) 
     return probs_filtered.values 

    def predict(self, X): 
     probs = self.predict_proba(X) 
     return probs.idxmax(axis=1) 
Смежные вопросы