運用 Python 處理 Amazon 評論的情感分析 NLP — Random Forest、Confusion Matrix、 ROC Curve

本系列使用機器學習中 Random Forest, XGBoost, 深度學習中 LSTM 分類 Amazon 評論,並比較各模型訓練的效果。本篇討論 Random Forest 的實作,以及評估模型的方法Confusion Matrix、 ROC Curve等,並附上程式碼。

Elaine Yang
8 min readJun 30, 2021

本系列概述:

Task 1:

Text Preprocessing: NLTK + WordNet(資料介紹及前處理-前前篇)

Task 2:

Convert the reviews in TF-IDF score and Run multinomial Naive Bayes classifier(資料向量轉換及 Baseline Model -前篇)

Task 3:

Select model : Random Forest, XGBoost, LSTM(本篇)

Task 4:

Tackle Class Imbalance Problem by oversampling or undersampling

Random Forest:

隨機森林(Random forest algorithm)是基於決策樹改良的分類算法,簡單來講,決策樹(Decision Tree)可以想像每一個節點下分裂的條件都是二元的,而依據每一個節點條件判斷往下走後,就會得到我們要找的分類結果。

決策樹所分裂的條件很影響結果,進而有了隨機森林。隨機森林是一種集成算法,集合了許多的樹(Decision Tree),可以想像用多數決的方式,每棵樹預測出的結果獨立代表投票,最終取最多數的結果為最終預測結果。

既然如何分裂節點就對影響結果非常重要。我們就想想兩者分裂結果的特徵如何取吧?決策樹的成本函數(cost function)是基尼指數(Gini index),用來判斷分類結果的純度,基尼不純度越低、越趨近於零代表純度越高,代表分類越好。決策樹會計算成本最低的特徵為分裂節點,而隨機森林並不是列出所有的特徵值計算成本,而是透過隨機選取特徵列表中產生的,在同一行中也可以放回特徵屬性,每個特徵也不只可選取一次。

以下,我們就趕緊進入到實作,來看看隨機問題在 Amazon 評論的分類問題上效果如何吧。

  1. 用 Random forest訓練和測試資料(帶預設值)

模型對測試集預測的準確率: 0.955

2. k-fold交叉驗證法: 進行k=5的交叉驗證(把訓練集切成5份,1份當成驗證集)

模型對測試集預測的準確率: 0.956

3. 用RandomizedSearchCV尋求適當參數:

1)隨機搜尋參數組合: 100次

2) 隨機森林的規模: 525棵決策樹

3) 決策樹的深度: 68層

4) 模型測試集預測的準確率: 0.955

4. Confusion Matrix 講解及實作:

4.1. Confusion Matrix 講解

Confusion Matrix 對於分類問題很重要,因為評估模型預測的分類情形,實際情況為正或負,預測情況為正或負,總共會產生四種情況如下,舉例來說其中 TP就是指被模型預測為正的正樣本(預測正確)。 FP 為被模型預測為正的負樣本(漏抓)。

in2techs.com/confusion-matrix

4.2. 繪製 Confusion Matrix 實作如下:

from sklearn.metrics import confusion_matrixconmatrix = confusion_matrix(y_test, new_y_prob)conmatrix = pd.DataFrame(conmatrix,columns = [‘pred_negative ‘,’pred_neutral ‘,’pred_positive’],index = [‘actual_nagative’,’actual_neutral’,’actual_positive ‘])print(conmatrix)print()from sklearn.metrics import classification_reporttarget_names = [‘negative’,’neutral’,’positive’]report_lstm = classification_report(y_test, new_y_prob, target_names = target_names)print(report_RDF)

可以看到紅圈處,隨機森林預測對的資料筆數中:負評(nagative = 9),中性評(neutral = 11),正評(positive = 933)。

這邊看 f1-score 的部分,可以得知相對於我前篇寫的 《運用 Python 處理 Amazon 評論的情感分析 NLP — Naive Bayes, TF-IDF 》中 baseline Model- 多項式貝氏分類器來看,f1-score 顯著提高(評估模型的標準,同時考量 precision, recall),準確率也比 Naive Bayes 高。

5. ROC Curve 講解及實作:

有了 Confusion Matrix 後我們可以繪製 ROC 曲線後來更好的一眼可視化看出模型的好壞。ROC 曲線下的面積越大(Area Under Curve,簡稱AUC),即曲線越靠近左上角,代表模型分類的越好

ROC 的 X 軸由 FPR 組成, Y 軸由 TPR 組成。

5.1. TPR (recall) :

在所有實際為陽性的樣本中,被正確地判斷為陽性之比率。又稱 recall (召回率),為評估模型的靈敏性(Sensitivity),是所有正樣本中分類正確的正樣本比,以肺炎確診的篩檢舉例,100 位確診者中,篩檢可以查出 97 個確診的患者,那麼就可以稱 recall = 97 %。

5.2. FPR (偽陽性率):

在所有實際為陰性的樣本中,被錯誤地判斷為陽性之比率。

所有負樣本中,分類錯誤的負樣本。可以理解爲判斷為正,實際為負的樣本,以肺炎篩檢舉例,就是判斷為確診者,但實際上為健康的人(誤判)。

同一模型每個閾值 的 (FPR, TPR) 座標都畫在ROC空間裡,就成為特定模型的ROC曲線

5.3. ROC 實作:

以下,我們就進入到實作部分,以此案例繪製 ROC 曲線的程式碼如下:

from sklearn.metrics import roc_curvefpr = dict()tpr = dict()for i in range(3):fpr[i], tpr[i], _ = roc_curve(Y[:, i],y_prob[:, i])plt.plot(fpr[i], tpr[i], lw=2, label=’class {}’.format(i))plt.xlabel(“false positive rate”)plt.ylabel(“true positive rate”)plt.legend(loc=”best”)plt.title(“ROC curve”)plt.show()

5.4. 繪製結果如下:

本次我們使用 Random Forest,下一篇,我們將探討 XGBoost 的原理及實作,並且提供程式碼和效果評估的想法分享,歡迎追蹤並交流討論喔!

如果你喜歡我的分享,請幫我拍拍手👏👏👏

我會更加努力產出文章的喔,你們的喜歡是我的動力!如果你對我在祕魯做志工(領導力老師)和背包客的故事感興趣,也歡迎來我的粉專看看:

粉專:帶著衝動去旅行,Elaine流浪趣

--

--

Elaine Yang

半導體業雲端數位轉型產品經理。畢業於北京大學計算機技術碩士。曾任職中國美團總部產品經理、微軟亞洲研究院用戶研究員、亞馬遜電商/雲計算商業運營全職實習。關注UI、UX、產品經理、互聯網趨勢,歡迎交流成長!臉書粉專: https://pse.is/RKH42