我正在用Python开发一个机器学习应用程序(使用sklearn模块),目前正试图确定一个用于执行推理的模型。对这一问题的简要描述:
考虑到用户数据的许多实例,我试图根据相对关键字包含将它们分类为不同的类别。它是受监督的,所以我有很多很多已经分类的预先分类数据的例子。(每一段数据都在2到12字之间。)
我目前正试图在两种可能的模式之间作出决定:
我已经阅读了这两种方法中使用的类的文档,它们似乎都很好地解决了我的问题。
对于这类问题,TF-下手加权标准朴素贝叶斯模型为什么会优于多项式朴素贝叶斯,有什么明显的原因吗?这两种方法有什么明显的问题吗?
发布于 2016-01-12 05:45:08
朴素贝叶斯和MultinomialNB是相同的算法。你所得到的区别来自于tfidf变换,它惩罚了在你的语料库中的很多文档中出现的单词。
我的建议是:使用sublinear_tf并调优TfidfVectorization的二进制参数和规范化参数。
同时,尝试各种不同的分类器,我怀疑它会给你更好的结果,如果你适当地调整正则化类型的值(惩罚,8 l1或l2)和正则化参数(alpha)。
如果你对它们进行适当的调整,我怀疑你可以用SGDClassifier和对数损失(Logistic回归)或铰链损失(SVM)来获得更好的结果。
人们通常调整参数的方式是通过scikit-learn中的GridSearchCV类进行的。
发布于 2016-01-12 05:59:47
我同意大卫的评论。你会想要训练不同的模型,看看哪一个是最好的。
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)https://stackoverflow.com/questions/34735016
复制相似问题