使用 HashingVectorizer 进行文本向量化

数据挖掘 Python scikit-学习 nlp 随机森林 数据框
2022-03-13 03:54:40

这是我拥有的示例数据:

标签 1(Val:X)、标签 2(Val:Y)、标签 3(Val:Z)、标签(Val:P)

标签 1(Val:A)、标签 2(Val:B)、标签 3(Val:C)、标签(Val:Q)

标签 1(Val:D)、标签 2(Val:E)、标签 3(Val:F)、标签(Val:R)

标签 1(Val:G)、标签 2(Val:H)、标签 3(Val:I)、标签(Val:S)

我首先将标签放入数据框 df,将标签放入单独的数据框 df_label。然后使用 HashingVectorizer 准备文本以供 ML 模型处理(我想将字符串散列成唯一的数值,以便 ML 模型可以对其进行训练)

vectorizer = HashingVectorizer()

X_train = vectorizer.transform(df)

y_train = vectorizer.transform(df_label)

clf = RandomForestClassifier(n_jobs=2, random_state=0)

clf.fit(X_train, y_train)

当我执行此操作时,我得到:ValueError: Unknown label type: 'unknown' on y_train.

我对 Python 和 ML 都是新手,我不确定问题出在我的基本逻辑上,还是只是一个微不足道的实现问题。感谢您的洞察力和支持。

4个回答

我最近正在检查一些事情。思想会在这里留下一个工作代码,以防万一。

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction import FeatureHasher
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
import numpy as np

categories = [
    'alt.atheism',
    'talk.religion.misc',
    'comp.graphics',
    'sci.space',
]
newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True, 
categories=categories, random_state=91)
newsgroups_test = fetch_20newsgroups(subset='test', shuffle=True, 
categories=categories, random_state=91)

vectorizer = FeatureHasher(input_type='string')
X_train = vectorizer.fit_transform(newsgroups_train.data)
X_test = vectorizer.fit_transform(newsgroups_test.data)

Y_train = newsgroups_train.target
Y_test = newsgroups_test.target
print(X_train.shape)
print(Y_train.shape)
print(X_test.shape)
print(Y_test.shape)

rf = RandomForestClassifier(n_jobs=-1, n_estimators=100)
rf.fit(X_train, Y_train)
pred = rf.predict(X_test)

score = metrics.accuracy_score(Y_test, pred)
print("accuracy: {:.3f}".format(score))

尽管很难理解您的数据样本,但我会尝试根据我从您的问题中理解的内容来纠正您。

每当您使用任何矢量化器时,请确保您首先对您的语料库/数据应用拟合,然后对其进行转换。

在您的情况下,您已经应用了 transform() 而没有在 X_train 上应用 fit。

重要提示:您不必在 Label 上执行 HashingVectorizer。更正您的代码:

   vectorizer = HashingVectorizer()
   X_train = vectorizer.fit_transform(df)
   clf = RandomForestClassifier(n_jobs=2, random_state=0)
   clf.fit(X_train, df_label)

我建议使用 TfidfVectorizer() 代替 HashingVectorizer() 但在此之前对此进行一些研究。

始终参考 sklearn 文档,以便对您有所帮助

希望能帮助到你!

我猜ValueError: Unknown label type: 'unknown' on y_train您的数据类型中有一些不受支持/无效的数据类型,y_train或者该类型确实有效但与RandomForestClassifier预期不符。

请执行以下操作:

  1. 打印/绘制y_train并确保所有值都有意义。HashingVectorizer可能无法散列某些特殊情况(例如外语字符或缺失值)。
  2. 使用typedtype找出v_train数据类型。确保它与RandomForestClassifier 预期一致。

ps 正如@outlier 提到的,我们通常不会转换我们的标签(y_train在您的情况下)。许多分类器可以将字符串/字母作为类标签来处理。如果他们不能,我们可以使用简单的映射,例如 P -> 0、Q -> 1 等。以下为您完成这项工作:

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
encoder.fit(y)
encoded_y = encoder.transform(y)

您正在对标签数据集执行转换。你不必那样做。矢量化器仅适用于文本数据集。因为您正在对标签执行转换,所以它将返回一个稀疏矩阵。您的 ML 算法的 fit 方法只需要一个 Array 形状的标签。阅读关于 scikit-learn 的文档。

我希望你明白你做错了什么。