2016-11-22 113 views
2

我使用Python的sklearn分類文本。始終概率:predict_proba,sklearn

我調用函數predict_proba,它看起來像這樣:

[[ 6.74918834e-53 1.59981248e-51 2.74934762e-26 1.24948745e-43 
    2.93801753e-48 3.43788315e-18 1.00000000e+00 2.96818867e-20]] 

即使我試圖把歧義數據,它看起來總是這樣。 這似乎並不可能對我來說,classfier始終確保百分之百的,所以有什麼問題呢?

此刻我正在使用MultinomialNB分類器和它的約文本分類。我使用報紙文章帶班像體育經濟等來訓練我的模型。訓練樣本的大小是175,分佈是這樣的:

{'business': 27, 
    'economy': 20, 
    'lifestyle': 22, 
    'opinion': 11, 
    'politics': 30, 
    'science': 21, 
    'sport': 21, 
    'tech': 23} 

我的管道是這樣的,我的特點是主要袋的詞和類似文本長度有一定的語言關鍵人物

cv = CountVectorizer(min_df=1, ngram_range=(1,1), max_features=1000) 
tt = TfidfTransformer() 
lv = LinguisticVectorizer() # custom class 
clf = MultinomialNB() 

pipeline = Pipeline([ 
('features', FeatureUnion([ 
    ('ngram_tf_idf', Pipeline([ 
    ('counts', cv), 
    ('tf_idf', tt), 
    ])), 
('linguistic', lv), 
])), 
('scaler', StandardScaler(with_mean=False)), 
('classifier', clf) 
]) 

如果你想看看我的訓練例子,我有上傳吧:wetransfer.com

UPDATE:也許值得一提的是,在測試樣品當前設置分數0.67 。但在使用StandardScaler之前,概率分佈更加現實(即不總是100%) - 但它只得到0.2。

UPDATE:在管道中加入MaxAbsScaler後,它似乎正常工作。有人可以解釋這種奇怪的行爲嗎?

+0

你能分享你所使用的算法和你的數據看起來更多的細節?只有您提供的內容很難回答您的問題。 – burhan

+0

如果你使用僅僅用175的訓練樣本袋的詞的功能,你可能有更多的功能比樣品,這是一個很好的食譜沒有適當調整學習過擬合。 burhan的觀點是,如果沒有對實際數據進行處理,就很難給出有針對性的反饋意見。 –

+0

@RandyC:我添加了我的訓練樣本。 即使模型過度擬合,如果我輸入一個包含「足球」,「商業」和「氣候」等文字的文本,並且這些都在詞袋中,我認爲概率不應該是百分百的其中一個類... – ScientiaEtVeritas

回答

2

這意味着,特別是考慮到它是樸素貝葉斯至少有一個成立:

  • 你有一個錯誤在您的數據處理程序,也許你改變你的整個文檔作爲一個單一的詞,而不是實際把它分成幾部分?檢查每一步,確保您的文檔實際上是在單詞級別編碼的。
  • 你的數據是「破壞」(有唯一字唯一標識類),例如新聞組數據集最初包括的信息,其中的類名是從字面上指定的(因此每個文件約運動已經「組:運動@ ...」等)
  • 你有巨大不相稱的類,只是你的模型只是預測多數類所有的時間。
+0

謝謝你的建議。 我不認爲數據處理例程中存在一個錯誤。當前的設置在測試數據(70個測試樣本)上得分爲0.67,同時有7個類別,所以它顯着超過隨機猜測。 我試圖用不同的報紙來源來防止損壞的數據,我也檢查了一些文章來檢查數據質量,雖然有一些空間來提高數據質量,但不應該像你提到的那樣存在重大問題。 樣本中的類幾乎平均分佈(請參閱OP),並且預計的類會變化,但始終爲100%。 – ScientiaEtVeritas