【问题标题】:Text Classification - How to transform and fit multiple string features into a machine learning model?文本分类 - 如何将多个字符串特征转换和拟合到机器学习模型中?
【发布时间】:2020-07-01 12:05:01
【问题描述】:

在我的数据集中有 3 个输入列(制造商、短文本、供应商),我希望从中创建一个矢量化特征列表。然后我期望将其融入机器学习模型中。最后一列(类别)是标签。我在数据集中有 200 万行。 我无法同时对所有三列进行矢量化。

数据样本

train_X, test_X, train_Y, test_Y = model_selection.train_test_split(df[["Manufacturer", "short text", "supplier"], df['category'],test_size=0.15, random_state=500)

train_X = pd.DataFrame(data = train_X)
train_Y = pd.DataFrame(data = train_Y)
test_X = pd.DataFrame(data = test_X)
test_Y = pd.DataFrame(data = test_Y)


# creating SVM model
text_clf_svm    =   Pipeline([('vect',  CountVectorizer(lowercase=True, preprocessor= None, tokenizer= None, ngram_range=(1,6), stop_words= 'english', analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False)),       
                              ('tfidf', TfidfTransformer()),            
                              ('clf-svm',   SGDClassifier(loss='modified_huber',    penalty='l2',shuffle=True,      
                               alpha=0.000001,  max_iter=9, random_state=None)),])      


#running training data on svm model
text_clf_svm1 = text_clf_svm.fit(train_X, train_Y)

错误

Found input variables with inconsistent numbers of samples

请告诉我如何将所有 3 列一起矢量化。

提前致谢。

【问题讨论】:

  • 尝试将Manufacturershort textsupplier 合并为一列,并使用它来训练您的模型。至少这是我在分类问题上所做的,其中我有产品名称和三个不同的类别。
  • @anddt - 我已经尝试过了,它工作得很好。但我想了解如何在保持列分开的同时将其融入机器学习模型。
  • 我可能错了,但我认为这没有多大意义。 TfidfTransformer 为列中的每个单词构建一个频率数组。将它应用于您的每一列显然会产生不同长度的数组(并非每个单词都出现在您的所有列中,因此合并它们的重要性)。希望这会有所帮助。
  • 但是如果你将不同的列折叠成另一列,这不会让模型感到困惑吗?或者至少它无法确定任何自变量的重要性,即。 (特征)。除非我刚刚开始学习并且在我的作业中遇到了这个确切的问题,否则我错过了一些东西

标签: python machine-learning text-classification


【解决方案1】:

你基本上是在问如何vectorise data。 有不同类型的数据(例如:表格数据、文本数据、图像数据……),对于每种数据类型,可以使用不同的矢量化技术。表格数据可以由分类变量(通过 one-hot 编码矢量化)或连续变量(通过标准化矢量化)组成。文本数据可以使用例如 Bag of words 或 TF-IDF 进行矢量化。

对于您的数据集,以下是每列的数据类型:

  • 制造商、供应商、类别 = 分类
  • 短文本 = 文本

我知道这可能会造成混淆,因为您的分类特征是由字符串组成的,因此乍一看可能会认为它是文本。 但是您基本上有两种前进方式:

  1. 您将“制造商”和“供应商”视为类别,并且仅在“短文本”上使用CountVectorizer。然后将所有特征的矢量化连接在一起,并将其输入到模型中
  2. 或者,按照 cmets 中的建议,将 3 列连接在一起,并将生成的字符串视为新的文本列,使用 CountVectoriser 对其进行矢量化,然后传递给模型

这两种方法是不同的,掌握第一种方法可能会非常有趣,因为它可以证明对未来更复杂的数据集很方便。

【讨论】:

  • 您是否有关于如何使用您提出的第一种方法的更多参考资料/示例?我阅读的大多数书籍/文章都将文本数据视为一大块文本。例如,在电子邮件的情况下,您有一个标题/正文/等,在这种情况下,最好为每个功能设置不同的权重。很高兴知道使用这种设置的最佳实践,但我几乎找不到任何参考:/
  • @d4nielfr4nco 您可以使用 LabelEncoder 结合 FeatureUnion 来实现我所描述的。在 FeatureUnion 中,您也可以为每个转换器传递自定义权重。
猜你喜欢
  • 2019-07-13
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 2016-07-31
  • 1970-01-01
  • 2018-05-10
  • 2020-06-19
相关资源
最近更新 更多