2014-09-01 43 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