首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用HashingVectorizer实现文本矢量化

利用HashingVectorizer实现文本矢量化
EN

Data Science用户
提问于 2018-02-22 02:08:22
回答 4查看 3K关注 0票数 2

以下是我所拥有的样本数据:

标签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)

我首先将标记放入dataframe并将标签放入单独的dataframe df_label中。然后使用一个HashingVectorizer来准备由ML模型处理的文本(我希望将字符串散列为一个唯一的数值,以便ML模型能够在其上进行训练)

代码语言:javascript
复制
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都是新手,我不确定问题是与我的基本逻辑有关,还是一个微不足道的实现问题。感谢你的洞察力和支持。

EN

回答 4

Data Science用户

发布于 2018-06-13 17:15:19

我最近在检查一些事情。想在这里留下一个有用的代码,万一有帮助的话。

代码语言:javascript
复制
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))
票数 1
EN

Data Science用户

发布于 2018-02-22 06:25:03

虽然很难理解你的数据样本,但我会尝试从你的问题中纠正我所理解的。

每当您使用任何向量器时,请确保首先将fit应用于您的语料库/数据,然后再对其进行转换。

在您的情况下,您可以在X_train上应用transform()而不应用fit。

重要注意事项:您不必在标签上执行HashingVectorizer。更正您的代码:

代码语言:javascript
复制
   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文档,这样它就能帮助您。

希望能帮上忙!

票数 0
EN

Data Science用户

发布于 2018-02-22 20:23:44

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

请做以下工作:

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

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

代码语言:javascript
复制
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
encoder.fit(y)
encoded_y = encoder.transform(y)
票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/28156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档