大家早安,昨天示範了國民好兄弟SVM實作跟比較進階的文本情感分析方式。但是做出來的時候結果不是很好,所以我在文章結束的時候留了一個懸念(其實就是我太懶而已)。現在就來告訴大家怎麼看特徵在模型訓練的過程中到底跟模型培養出多好的感情。模型在做決定的時候會因為跟某個特徵的感情比較好就比較容易受到它的影響。其實就跟我們一樣,當我們在做決定的時候也會因為參考家人朋友的建議,而且關係越親近的人越容易影響我們。而我們把特徵跟模型之間的親密度稱作「特徵重要性(Feature Importance)」。也就是說,我們可以透過feature importance去確認是不是有些特徵對模型分類根本就沒有什麼幫助。至於這個數值怎麼算出來就不是我們今天要探討的東西了,因為套件裡面通常都會附上直接幫我們計算的功能。But! 不同套件使用的feature importance計算方法可能不同,所以如果出現需要比較不同模型之間feature importance的情形,最好還是先確認過他們的計算方法是否一致比較好。
廢話不多說,馬上就接續剛剛的訓練結果來看看模型的feature importance。其實我們在訓練模型的時候就已經把特徵的重要性存進模型裡面了,所以直接用coef_
就可以把他叫出來。
importance = model.coef_
features = test_feature.columns
for i in range(len(features)):
print(features[i] + ": " + str(importance[0][i]))
# 輸出
neu: -0.1515935626369455
pos: 0.8111639306554717
neg: -0.5304115242647433
total: 0.565842939443961
真的是一塊蛋糕,但是你知道這些數字的意思嗎?為什麼有正有負呢?讓我們畫張圖來看看~先把算出來的重要性數值跟feature產出一個新的dataframe。
coef_list = []
for i in range(0,4):
coef = model.coef_[0][i]
coef_list.append(coef)
coef = pd.DataFrame(coef_list, index = test_feature.columns, columns = ["coefficients"])
接著用pandas
內建的畫圖功能先畫出基本的圖片之後加上matplotlib.pyplot
提供的功能微調出好看的圖片。
import matplotlib.pyplot as plt
coef.plot(kind='barh', figsize=(8, 5), colormap = "Pastel2")
plt.title('Feature Importance')
plt.axvline(x=0, color='.8')
plt.xlim(-1, 1)
plt.subplots_adjust(left=.4)
因為scikit learn
計算特徵重要性的方法是透過統計方法看特徵跟資料之間的相關係數,所以會有正相關(隨著特徵分數增加,資料被分成正面的可能性也變高)跟負相關(隨著特徵分數增加,資料被分成正面的可能性也變低)。正相關的相關係數會是正數,負相關則是負數,而他們的數值範圍就在-1到1之間。也就是說當特徵重要性的絕對值越大,就表示它的重要性越高。再回到上面這張圖,看起來就是中立分數跟綜合分數的影響力比較小,所以我們大刀闊斧把這兩個特徵拿掉再重新訓練一次模型。就可以得到下面的結果:
# 輸出
[[207 59]
[ 90 187]]
accuracy: 0.73
precision: 0.73
recall: 0.73
fscore: 0.73
看起來確實比昨天的數值好了那麼一~點點,看來是我們現在找出來的特徵還不夠好,除了把沒用的東西拿掉之外,我們還能再找其他特徵近來訓練看看。如果你發現不管用什麼特徵,結果好像都差強人意,那你可以考慮換其他模型來用用看。如果這樣還是不行,那有兩種可能。第一種是你就是一直抓錯重點;第二種是你的資料不夠多或是不夠具有代表性。所以基本上機器學習的過程裡面,能出錯的地方有太多了,如果結果不透理想,我們可以做的事情還是不少,真的全部試完再開始絕望也沒關係XDD 好啦關於特徵重要性介紹的番外篇就到這邊結束,我要去打今天的本篇了,掰掰~