【问题标题】:distinguishment with sub categories与子类别的区别
【发布时间】:2016-09-26 08:42:17
【问题描述】:

这些天我正在处理区分两个类别 A 和 B,我发现当类别 B 包含一些子类别 B1、B2、B3 时......

有时区分结果更适合显式标记 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算法可以更专注于A和B的区分

但我不确定我的假设是否正确,有人知道吗?而在处理这种情况时,当有子类别时,您如何获得最佳结果?

【问题讨论】:

    标签: machine-learning scikit-learn


    【解决方案1】:

    在这种情况下,您可以使用两级分类器,它首先预测顶级类别,然后选择最有可能落在下面的二级类别。这是我用过的一些代码,

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-25
      • 2012-12-26
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多