2014-09-01 42 views
1

这是关于功能集的一个非常基本的问题。使用MultinomialNB组合功能集

比方说,我有一群人有各种功能,我想提出建议。他们还写了一段自由形式的文本,这对我需要向他们推荐的内容非常重要。

我可以了解如何向量化他们的示例文本,但我不知道如何再添加功能,如国籍,年龄,性别等等等等

所以我有这样的:

#dbsession = sqlalchemy session 

people = dbsession.query(People).filter(People.category!="inactive") 
all_text = [(a.all_text, a.category) for a in people ] 
vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5, stop_words='english') 
X_train = vectorizer.fit_transform([x[0] for x in all_text]) 
y_train = ([x[1] for x in all_text]) 
classifier = MultinomialNB() 
classifier.fit(X_train,y_train) 

print("Training score: {0:.1f}%".format(classifier.score(X_train, y_train) * 100)) 
a = People.populate_from_db(dbsession,2309601) # this gives me the person I want to categorise 
print a 

sample_text = a.all_text 
t_form = vectorizer.transform([sample_text]) 
probs = classifier.predict_proba(t_form) 
for i,p in enumerate(probs[0]): 
    print "# ", classifier.classes_[i] , "%.2f %%" % (p*100) 

(是的,我知道我不应该使用训练集中的一个项目进行测试,但是我只是在将实际数据放入之前先运行代码)。

现在,如果人物对象具有属性如“国籍”,那么将其加入到分类中的最佳方式是什么?更难?

+0

这些不是多项NB的好功能,因为它们不是频率。切换到'LogisticRegression',并使用'DictVectorizer'进行特征提取。 'TfidfVectorizer'实际上仅用于词频特性。 – 2014-09-01 15:40:17

+0

谢谢@larsmans - 我是新手(如果你没有猜到),并从http://scikit-learn.org/stable/auto_examples/document_classification_20newsgroups.html获得我的主要示例。我将如何取代LogisticRegression/DictVectorizer?直接在代码中? – 2014-09-01 16:30:46

+0

比这更有意思。忘记我所说的话,你可以做的最简单的事情可能是在你的文档中加入'sex = male'(或'= female')和'nationality = WHATEVER',然后看看朴素贝叶斯是否挑选它。 – 2014-09-01 20:30:57

回答

1

1)添加额外的字段到您的向量的问题。

A)只需创建一个新的X_train_extended,其尺寸与X_train + 1相同,用于您要添加的每个事物。 B)试着使用scikit中的FeatureUnion来为你做这件事。

2)您的添加是否有意义?在这种情况下 - 不。存储“年龄”的数值对于MulinomialNB模型没有意义。无论如何,它可能会起作用,但是您应该意识到您正在做的事现在违反了您尝试使用的模型的假设。

没有人可以告诉你应该使用什么模型,因为我们没有你的数据,但你应该了解你的模型是什么以及它做了什么假设。然后,您可以决定将这些附加功能的最佳形式放入模型中。

+0

我可以理解,年龄的文本价值没有任何用处,但如果国籍确实表明了一些趋势呢?我假设所写的文字是英文的,但我正在考虑某些国家可能适合不同群体的可能性。感谢您的回应。 – 2014-09-01 16:59:26

+2

这表明您不了解模型。它不是年龄的文本值。如果年龄是一个整数,MultinomialNB然后说“X年龄发生”,其中X是年龄。这只是没有意义。它可能有用,但它没有意义。你不能解释它。同样适用于国籍。 – 2014-09-01 19:06:29

+0

确定年龄并不是一件好事......但是在添加ngrams =(1,3)后,我看到用于准确评估的相关特征。如果我有一些时间,我会尝试你提出的建议。 – 2014-09-03 23:19:12