ValueError: Unknown label type: 'unknown' in RandomForestClassifier
ValueError: Unknown label type: 'unknown' in RandomForestClassifier
我正在尝试使用 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'
有人可以提出任何解决方案吗?
一个 RandomForestClassifier
实例需要以下数据作为标签:
y : array-like, shape = [n_samples] or [n_samples, n_outputs]
The target values (class labels in classification, real numbers in regression).
但是 transformer.fit_transform(df.category)
returns '<class 'numpy.float64'>
类型的稀疏矩阵,这不是预期的。
如果您尝试将某些数据分类到数量有限的类别中,例如"good product"、"damaged product"、...等,您可以不逐字编码此数据,而是通过标签编码器将其编码为标签:
(关于预测每个词的多标签分类见下文)
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)
-(或左右)-这是最简单的解决方案。
如果你打算做一些多标签分类,有两个问题:
- 会有很多标签,具体取决于
df.category
行中不同单词的数量
- 稀疏矩阵是可以转换为 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
数据做一些处理,它可能会导致错误。最好实例化两个transformer,分开使用
我正在尝试使用 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'
有人可以提出任何解决方案吗?
一个 RandomForestClassifier
实例需要以下数据作为标签:
y : array-like, shape = [n_samples] or [n_samples, n_outputs] The target values (class labels in classification, real numbers in regression).
但是 transformer.fit_transform(df.category)
returns '<class 'numpy.float64'>
类型的稀疏矩阵,这不是预期的。
如果您尝试将某些数据分类到数量有限的类别中,例如"good product"、"damaged product"、...等,您可以不逐字编码此数据,而是通过标签编码器将其编码为标签:
(关于预测每个词的多标签分类见下文)
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)
-(或左右)-这是最简单的解决方案。
如果你打算做一些多标签分类,有两个问题:
- 会有很多标签,具体取决于
df.category
行中不同单词的数量 - 稀疏矩阵是可以转换为 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
数据做一些处理,它可能会导致错误。最好实例化两个transformer,分开使用