0

訓練數據:當特徵的tf-idf值相同時,不同特徵的權重(w1,w2,...)值如何隨每個類的不同而有所不同?

"class_a" : ["first class"], 
"class_b" : ["second class"], 
"class_c" : ["third class"], 
"class_d" : ["fourth class"] 

特點:

['class', 'first', 'fourth', 'second', 'third'] 

袋字特徵矩陣(TF-IDF):

[[ 0.46263733 0.88654763 0.   0.   0.  ] 
[ 0.46263733 0.   0.   0.88654763 0.  ] 
[ 0.46263733 0.   0.   0.   0.88654763] 
[ 0.46263733 0.   0.88654763 0.   0.  ]] 

後,我有符合上述特徵與LinearSVC我以下coef矩陣:

coef_:

[[-0.150651 0.96191919 -0.41688159 -0.41685917 -0.41686954] 
[-0.15064478 -0.41687195 -0.41686523 0.96193299 -0.41687502] 
[-0.15065627 -0.4168764 -0.41689067 -0.41684964 0.9619155 ] 
[-0.15064427 -0.41687134 0.96192893 -0.41686184 -0.41687397]] 

我所瞭解的是,對不同特徵的不同權重實際上模仿了特徵對待分類的特定類的重要性。

但是,鑑於tf-idf值相同,權重值實際上有何不同?

例如class_a中的功能'first'的tf-idf值是0.88654763,而class_b中的功能'second'tf-idf值也是相同的,即0.88654763。但根據矩陣,相應的權重分別爲0.961919190.96193299,它們稍有不同。這種差異背後的原因是什麼?

回答

0

此差異與LinearSVC的參數tolmax_iter有關。作爲documentation states

TOL:浮子,可選的(缺省值= 0.0001)

Tolerance for stopping criteria. 

max_iter:INT,(缺省值= 1000)

The maximum number of iterations to be run. 

見,分類器將使用max_iter參數來運行訓練數據上的迭代次數以更新模式的權重。在每次迭代中,它將使用tol值檢查結果,以檢查是否達到了所需的錯誤。如果是,它將停止訓練並且不會完成全部1000次(默認值max_iter)迭代。

正如你所看到的默認tol是0.0001。而你顯示的所有重量都略有不同,都在這個範圍內。所以它不是一個令人擔憂的問題,而且非常正常。

您可以通過這個最小代碼中看到的tol自己的行爲:

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.svm import LinearSVC 

X = ['first class', 'second class', 'third class', 'fourth class'] 
X = TfidfVectorizer().fit_transform(docs).toarray() 
y = ['class_a', 'class_b', 'class_c', 'class_d'] 

# Default tol here 
clf = LinearSVC().fit(X, y) 

# Output is same as you posted 
print(clf.coef_) 
[[-0.15064323 0.96193836 -0.41686937 -0.41687202 -0.41687321] 
[-0.15064323 -0.41686181 -0.41687322 0.96192944 -0.41687064] 
[-0.1506464 -0.41686748 -0.41687281 -0.41686593 0.96192392] 
[-0.15064927 -0.41686229 0.96192608 -0.41687639 -0.41687521]] 


#Change the tol to 0.00001 
clf = LinearSVC().fit(X, y) 

print(clf.coef_) 

#See the output here 
[[-0.15064144 0.96191569 -0.41685567 -0.41687646 -0.41685635] 
[-0.15064127 -0.41687676 -0.41685671 0.96192942 -0.41686841] 
[-0.1506501 -0.41686079 -0.41687639 -0.4168781 0.96192589] 
[-0.15063806 -0.41685062 0.96192083 -0.41686449 -0.41687203]] 


#Change the tol to even smaller 0.000001 
clf = LinearSVC().fit(X, y) 

#See the output here 
print(clf.coef_) 

[[-0.15063876 0.96192418 -0.41688131 -0.41685592 -0.4168546 ] 
[-0.15065588 -0.41688004 -0.41685034 0.96190778 -0.41687786] 
[-0.15064299 -0.41687365 -0.41687663 -0.4168614 0.96193592] 
[-0.15064058 -0.41687195 0.96192538 -0.41685941 -0.41686517]] 

希望你明白我的意思。隨意問任何疑問。

相關問題