【问题标题】:ValueError: Unknown label type: 'unknown' in RandomForestClassifierValueError:未知标签类型:RandomForestClassifier 中的“未知”
【发布时间】:2019-07-03 09:39:42
【问题描述】:

我正在尝试使用 RandomForestClassifier 训练数据集

transformer = TfidfVectorizer(lowercase=True, stop_words=stop, max_features=500)
X = transformer.fit_transform(df.Text)
y = transformer.fit_transform(df.category)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = RandomForestClassifier()

model.fit(X_train, y_train)

我的数据集是这样的

Review(text format)    Category(text format)
Its good product       good product
Its damaged product    damaged product

我收到一个错误

raise ValueError("Unknown label type: %r" % y_type)
ValueError: Unknown label type: 'unknown'

任何人都可以提出任何解决方案吗?

【问题讨论】:

    标签: python python-3.x scikit-learn random-forest


    【解决方案1】:

    RandomForestClassifier 实例需要以下数据作为标签:

    y : 类似数组,形状 = [n_samples] 或 [n_samples, n_outputs] 目标值(分类中的类标签,回归中的实数)。

    transformer.fit_transform(df.category) 返回'<class 'numpy.float64'> 类型的稀疏矩阵,这不是预期的。

    如果您尝试将某些数据分类为数量有限的类别,例如“好产品”、“损坏的产品”……等等,您可以不逐字地对这些数据进行编码,而是通过标签编码器将其编码为标签:

    (关于预测每个单词的多标签分类见下文)

    transformer = TfidfVectorizer(lowercase=True, stop_words=stop, max_features=500)
    X = transformer.fit_transform(df.Text)
    le = LabelEncoder()
    y = le.fit_transform(df.category)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    
    model = RandomForestClassifier()
    model.fit(X_train, y_train)
    
    le.inverse_transform(model.predict(X_test))
    Out:
    array(['good product', 'good product'], dtype=object)
    

    - (左右)- 这是最简单的解决方案。

    如果你打算做一些多标签分类,有两个问题:

    1. 会有很多标签,具体取决于df.category 行中不同单词的数量
    2. 稀疏矩阵是可以转换为 numpy.array 的东西,但它会占用内存,并且矩阵包含浮点数,因为它是 tf-idf 值,但RandomForestClassifier 可以很好地处理整数标签:李>

    所以,

    y.toarray()
    array([[0.        , 0.77722116, 0.62922751, 0.        ],
           [0.84292635, 0.        , 0.53802897, 0.        ],
           [0.        , 0.        , 0.        , 1.        ],
           [0.        , 0.77722116, 0.62922751, 0.        ]])
    

    - 好的,它可以转换为一些{0, 1} 整数数组,但使用MultiLabelBinarizer 更容易(注意split 应用于每一行以获得逐字而不是逐字符二值化):

    transformer = TfidfVectorizer(lowercase=True, stop_words=stop, max_features=500)
    X = transformer.fit_transform(df.Text)
    mlb = MultiLabelBinarizer()
    y = mlb.fit_transform(df.category.map(lambda x: x.split()))
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    
    model = RandomForestClassifier()
    model.fit(X_train, y_train)
    

    那个情况,y 是:

    y
    Out:
    array([[0, 1, 1, 0],
           [1, 0, 1, 0],
           [0, 0, 0, 1],
           [0, 1, 1, 0]])
    

    它可以预测单词:

    mlb.inverse_transform(model.predict(X_test))
    Out:
    [('good', 'product'), ('good', 'product')]
    

    改装 TfidfTransformer 很危险
    题外话,但是:你在这里改装了矢量化器:

    X = transformer.fit_transform(df.Text)
    print(transformer.vocabulary_)
    y = transformer.fit_transform(df.category)
    print(transformer.vocabulary_)
    Out:
    {'its': 3, 'good': 1, 'product': 6, 'damaged': 0, 'sttate': 7, 'is': 2, 'unknown': 8, 'one': 5, 'more': 4}
    {'good': 1, 'product': 2, 'damaged': 0, 'unknown': 3}
    

    - 如果您稍后尝试使用转换器对Text 数据进行一些处理,它可能会导致错误。最好实例化两个转换器并分别使用它们。

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2021-05-11
      • 2018-01-01
      • 2018-12-16
      • 2021-08-17
      • 2018-03-16
      • 2020-05-14
      • 2017-08-29
      • 2018-12-10
      相关资源
      最近更新 更多