ValueError:未知标签类型:RandomForestClassifier中的“未知”

时间:2019-02-09 08:03:45

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

我正在尝试使用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'

有人可以建议解决方案吗?

1 个答案:

答案 0 :(得分:0)

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

  

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

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

如果您尝试将某些数据分类为strictecd类别数,例如“好产品”,“损坏的产品”等...,您可以不逐字编码此数据,而是通过标签编码器将其编码为标签:

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

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应用于每行以逐字而不是char形式)明智的二值化):

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数据进行某些处理,则可能会导致错误。最好实例化两个转换器,然后分别使用。