首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择滑雪板管道对用户文本数据进行分类

选择滑雪板管道对用户文本数据进行分类
EN

Stack Overflow用户
提问于 2016-01-12 03:17:07
回答 2查看 2.2K关注 0票数 2

我正在用Python开发一个机器学习应用程序(使用sklearn模块),目前正试图确定一个用于执行推理的模型。对这一问题的简要描述:

考虑到用户数据的许多实例,我试图根据相对关键字包含将它们分类为不同的类别。它是受监督的,所以我有很多很多已经分类的预先分类数据的例子。(每一段数据都在2到12字之间。)

我目前正试图在两种可能的模式之间作出决定:

  1. CountVectorizer +多项朴素Bayes.使用sklearn的CountVectorizer获得跨培训数据的关键字计数。然后,使用朴素贝叶斯对数据进行MultinomialNB分类。
  2. 使用tf-以色列国防军词加权关键字计数+标准的朴素贝叶斯。使用CountVectorizer获取训练数据的关键字计数矩阵,利用sklearn的TfidfTransformer将该数据转换为tf加权,然后将其转储到标准的朴素贝叶斯模型中。

我已经阅读了这两种方法中使用的类的文档,它们似乎都很好地解决了我的问题。

对于这类问题,TF-下手加权标准朴素贝叶斯模型为什么会优于多项式朴素贝叶斯,有什么明显的原因吗?这两种方法有什么明显的问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-01-12 05:45:08

朴素贝叶斯和MultinomialNB是相同的算法。你所得到的区别来自于tfidf变换,它惩罚了在你的语料库中的很多文档中出现的单词。

我的建议是:使用sublinear_tf并调优TfidfVectorization的二进制参数和规范化参数。

同时,尝试各种不同的分类器,我怀疑它会给你更好的结果,如果你适当地调整正则化类型的值(惩罚,8 l1或l2)和正则化参数(alpha)。

如果你对它们进行适当的调整,我怀疑你可以用SGDClassifier和对数损失(Logistic回归)或铰链损失(SVM)来获得更好的结果。

人们通常调整参数的方式是通过scikit-learn中的GridSearchCV类进行的。

票数 2
EN

Stack Overflow用户

发布于 2016-01-12 05:59:47

我同意大卫的评论。你会想要训练不同的模型,看看哪一个是最好的。

代码语言:javascript
复制
import pandas as pd
import numpy as np

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB, GaussianNB, BernoulliNB
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV

from pprint import pprint

df = pd.DataFrame({'Keyword': ['buy widget', 'buy widgets', 'fiberglass widget',
                               'fiberglass widgets', 'how much are widget',
                               'how much are widgets', 'installing widget',
                               'installing widgets', 'vinyl widget', 'vinyl widgets',
                               'widget cost', 'widget estimate', 'widget install',
                               'widget installation', 'widget price', 'widget pricing',
                               'widgets cost', 'widgets estimate', 'widgets install',
                               'widgets installation', 'widgets price', 'widgets pricing',
                               'wood widget', 'wood widgets'],
                   'Label': ['Buy', 'Buy', 'Fiberglass', 'Fiberglass', 'Cost', 'Cost',
                             'Install', 'Install', 'Vinyl', 'Vinyl', 'Cost', 'Estimate',
                             'Install', 'Install', 'Cost', 'Cost', 'Cost', 'Estimate',
                             'Install', 'Install', 'Cost', 'Cost', 'Wood', 'Wood']},
                  columns=['Label', 'Keyword'])

X = df['Keyword']
y = df['Label']

##pipeline = Pipeline(steps=[
##  ('cvect', CountVectorizer()),
##  ('mnb', MultinomialNB())
##  ])

pipeline = Pipeline(steps=[
  ('tfidf', TfidfVectorizer()),
  ('bnb', BernoulliNB())
  ])

parameters = {'tfidf__ngram_range': [(1,1), (1,2)],
              'tfidf__stop_words': [None, 'english'],
              'tfidf__use_idf': [True, False],
              'bnb__alpha': [0.0, 0.5, 1.0],
              'bnb__binarize': [None, 0.2, 0.5, 0.7, 1.0],
              'bnb__fit_prior': [True, False]}

grid = GridSearchCV(pipeline, parameters, scoring='accuracy', cv=2, verbose=1)
grid.fit(X, y)

print('Best score:', grid.best_score_)
print('Best parameters:', pprint(grid.best_params_, indent=2))

# Here's how to predict (uncomment)
#pred = grid.predict(['buy wood widget', 'how much is a widget'])

#print(pred)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34735016

复制
相关文章

相似问题

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