在機器學習應用中,模型可解釋性對於理解模型行為和建立信任至關重要。本文首先探討時間序列模型 SARIMA 的可解釋性,接著以 IMDB 電影評論情感分析為例,深入研究自然語言處理(NLP)中的模型可解釋性技術。對於時間序列模型,我們利用 LIME 和 SP-LIME 技術分析模型係數和特徵重要性,揭示模型預測的依據。在 NLP 任務中,我們使用 ELI5 解釋邏輯迴歸模型的預測結果,並探討 TF-IDF 向量化技術、N-gram 特徵提取和不同分析器對模型效能和可解釋性的影響。藉由這些技術,我們可以更深入地理解模型的決策過程,提高模型的透明度和可信度,並為模型改進提供方向。

時間序列模型的可解釋性探討

在前一章中,我們探討了時間序列模型的建構與分析,本章節將進一步討論如何解釋時間序列模型的結果。時間序列模型的可解釋性對於理解模型預測的依據至關重要,特別是在使用諸如 SARIMA(季節性自迴歸整合移動平均模型)等複雜模型時。

SARIMA 模型的解釋

SARIMA 模型是一種廣泛使用的時間序列預測模型,它結合了自迴歸(AR)、整合(I)和移動平均(MA)三個部分,以處理具有季節性和非季節性的時間序列資料。透過對模型的係數進行分析,我們可以瞭解不同滯後項對預測值的影響。

使用 LIME 進行模型解釋

LIME(Local Interpretable Model-agnostic Explanations)是一種用於解釋複雜機器學習模型預測結果的技術。透過將時間序列模型視為監督學習模型,並使用滯後項作為特徵,我們可以利用 LIME 來解釋模型的預測結果。

import lime
import lime.lime_tabular

# 初始化 LIME 直譯器
explainer = lime.lime_tabular.LimeTabularExplainer(np.array(X),
                                                  mode='regression',
                                                  feature_names=X.columns,
                                                  class_names=['t'],
                                                  verbose=True)

# 對特定記錄進行解釋
i = 60
exp = explainer.explain_instance(np.array(X)[i], new_model.predict, num_features=12)
exp.show_in_notebook(show_table=True)

內容解密:

  • 首先,我們匯入了必要的 LIME 函式庫,並初始化了一個 LIME 直譯器,用於對我們的時間序列模型進行解釋。
  • LimeTabularExplainer 的初始化引數中,mode='regression' 表示我們正在處理一個迴歸任務。
  • feature_namesclass_names 分別用於指定特徵名稱和目標變數的名稱。
  • 我們選擇了第 60 筆記錄進行解釋,並使用 explain_instance 方法來產生解釋結果。

SP-LIME:全域性理解模型

SP-LIME(Submodular Pick)是一種用於提供模型全域性理解的方法,透過選擇一組具有代表性的例項來展示模型的決策邊界。

from lime import submodular_pick

# 初始化 SP-LIME
sp_obj = submodular_pick.SubmodularPick(explainer, np.array(X), new_model.predict,
                                        num_features=12, num_exps_desired=10)

# 儲存解釋結果
import matplotlib.pyplot as plt
plt.savefig('[exp.as_pyplot_figure() for exp in sp_obj.sp_explanations].png', dpi=300)

內容解密:

  • SP-LIME 的目的是提供一個全域性的模型理解,透過挑選一組例項來代表模型的決策過程。
  • SubmodularPick 初始化時,需要提供之前建立的 LIME 直譯器、資料集、預測函式等引數。
  • num_exps_desired 引數用於指定希望產生的解釋數量。

NLP 任務的可解釋性

接下來,我們將討論如何在自然語言處理(NLP)任務中使用可解釋性技術,如 ELI5 和 SHAP。文字分類別是 NLP 中的一個基本任務,涉及將文字資料分類別到不同的類別中。瞭解模型如何做出這些分類別決定對於模型的信任和改進至關重要。

使用 ELI5 和 SHAP 進行文字分類別的可解釋性

ELI5 和 SHAP 是兩種流行的可解釋性函式庫,分別提供了不同的視角來理解模型的預測結果。在文字分類別任務中,這些函式庫可以幫助我們識別出哪些詞彙或短語對於模型的預測結果最為重要。

# 這裡將展示如何使用 ELI5 或 SHAP 進行文字分類別的可解釋性分析

內容解密:

  • 待補充的程式碼範例將展示如何使用特定的函式庫(如 ELI5 或 SHAP)來對文字分類別模型進行可解釋性分析。
  • 這將涉及初始化直譯器、對特定文字例項進行解釋等步驟。

自然語言處理中的可解釋性:以文字分類別為例

文字分類別的重要性

在現今的數位時代,非結構化的文字資料無處不在,包括社交媒體、電子郵件、聊天應用程式、HTML 網頁、Word 檔案、客戶服務中心的支援票以及線上調查回應等。這些資料的處理和分析對於企業和組織來說至關重要。文字分類別是自然語言處理(NLP)中的一個基本任務,涉及將文字資料分類別為預定義的類別。

文字分類別的應用場景

  1. 檔案分類別:輸入是一篇文字檔案,輸出是二元類別或多類別標籤。
  2. 情感分析:如果文字中包含情感標籤,則情感分析可以視為檔案分類別的一種;否則,它是一種根據詞典的分類別。
  3. 命名實體識別(NER):輸入是一篇文字檔案,輸出是命名實體類別。
  4. 文字摘要:將大段文字壓縮成簡潔的形式。

文字分類別的可解釋性需求

由於文字資料是高維度的,因此用於分類別文字的預測模型需要被解釋,以便向終端使用者展示預測背後的理由或特徵。在二元分類別中,瞭解哪些關鍵字對某一類別是正面或負面的至關重要。在多類別分類別中,這變得更加複雜,因為需要解釋所有導致特定類別預測的關鍵字。

圖 7-1:文字解釋中的步驟

輸入文字以向量的形式表示,使用檔案詞矩陣(Document Term Matrix)開發分類別模型,最後使用可解釋性函式庫來解釋預測的類別,以瞭解哪些特徵或詞彙對預測特定類別標籤負責。

使用 IMDB 資料集進行文字分類別

本章節使用來自 http://ai.stanford.edu/~amaas/data/sentiment/ 的 Large Movie Review Dataset。該資料集包含 50,000 篇評論,其中 25,000 篇已經標註為正面或負面評論,用於訓練和測試文字分類別模型。

import warnings
warnings.filterwarnings("ignore")
import pandas as pd

# 載入 IMDB 資料集
imdb = pd.read_csv('IMDB Dataset.csv')
print(imdb.head())

# 分割資料集為訓練集和測試集
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegressionCV
from sklearn.pipeline import make_pipeline

vec = CountVectorizer()
clf = LogisticRegressionCV()

# 建立管道
pipeline = make_pipeline(vec, clf)

# 訓練模型
pipeline.fit(imdb['review'], imdb['sentiment'])

內容解密:

  1. warnings.filterwarnings("ignore"):忽略警告訊息,避免幹擾輸出結果。
  2. imdb = pd.read_csv('IMDB Dataset.csv'):載入 IMDB 資料集,該資料集包含電影評論及其對應的情感標籤(正面或負面)。
  3. CountVectorizer():將文字資料轉換為向量表示,也就是所謂的檔案詞矩陣(DTM)。每個詞彙被視為一個特徵,詞彙的出現次數作為其特徵值。
  4. LogisticRegressionCV():使用帶有交叉驗證的邏輯迴歸模型進行分類別。邏輯迴歸是一種廣泛用於二元分類別問題的機器學習演算法。
  5. make_pipeline(vec, clf):建立一個管道,將 CountVectorizer 和 LogisticRegressionCV 串聯起來,簡化了資料處理和模型訓練的流程。
  6. pipeline.fit(imdb['review'], imdb['sentiment']):訓練模型,使用 IMDB 資料集中的評論作為輸入,特徵值(情感標籤)作為輸出。

結語

在自然語言處理領域,文字分類別是一個重要的任務,而對文字分類別模型的可解釋性需求日益增加。透過使用適當的工具和技術,如 CountVectorizer 和 LogisticRegressionCV,我們可以建立一個有效的文字分類別模型,並進一步分析其預測結果,從而提高模型的透明度和可信度。

自然語言處理(NLP)中的模型可解釋性:以情感分析為例

前言

在自然語言處理(NLP)領域,模型的準確性固然重要,但隨著模型複雜度的增加,瞭解模型如何做出預測變得越來越困難。本篇將探討如何使用可解釋性工具來理解NLP模型,特別是在情感分析任務上的應用。

情感分析模型建立

首先,我們使用IMDB資料集建立一個簡單的情感分析模型。該模型使用CountVectorizer將文字資料轉換為向量表示,然後透過LogisticRegressionCV進行訓練。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegressionCV
from sklearn.pipeline import make_pipeline
from sklearn import metrics

# 建立管道
vec = CountVectorizer()
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)

# 訓練模型
pipe.fit(imdb.review, imdb.sentiment)

# 評估模型
def print_report(pipe):
    y_test = imdb.sentiment
    y_pred = pipe.predict(imdb.review)
    report = metrics.classification_report(y_test, y_pred)
    print(report)
    print("accuracy: {:0.3f}".format(metrics.accuracy_score(y_test, y_pred)))

print_report(pipe)

內容解密:

  1. CountVectorizer的作用:將文字資料轉換為向量表示,每個詞對應一個特徵。
  2. LogisticRegressionCV的作用:使用邏輯迴歸進行分類別,並透過交叉驗證選擇最佳的正則化引數。
  3. make_pipeline的作用:將向量化和分類別器組合成一個管道,簡化了資料處理和模型訓練的流程。
  4. print_report函式的作用:評估模型的效能,包括精確度、召回率和F1分數等指標。

使用ELI5進行模型可解釋性分析

ELI5是一個用於解釋機器學習模型的工具,可以幫助我們理解模型的預測結果。

import eli5

# 顯示模型的權重
eli5.show_weights(clf, feature_names=vec.get_feature_names(), target_names=set(imdb.sentiment))

內容解密:

  1. eli5.show_weights的作用:顯示模型的權重,幫助我們瞭解哪些特徵對模型的預測結果影響最大。
  2. feature_names引數的作用:提供特徵的名稱,使得結果更容易理解。
  3. target_names引數的作用:提供目標變數的名稱,幫助我們瞭解模型的預測結果。

區域性可解釋性分析

除了瞭解模型的整體表現外,我們還可以使用ELI5來分析單個樣本的預測結果。

# 分析單個樣本的預測結果
eli5.show_prediction(clf, imdb.review[0], vec=vec, target_names=set(imdb.sentiment))

內容解密:

  1. eli5.show_prediction的作用:分析單個樣本的預測結果,顯示哪些詞對預測結果貢獻最大。
  2. BIAS項的作用:表示模型的偏差項,對預測結果有影響。

移除停用詞後的分析

移除停用詞可以幫助我們更好地理解模型的預測結果。

# 移除停用詞
vec = CountVectorizer(stop_words='english')
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(imdb.review, imdb.sentiment)
print_report(pipe)

內容解密:

  1. stop_words='english'的作用:移除英文停用詞,減少無關緊要的特徵對模型的影響。
  2. 移除停用詞的影響:可以提高模型的效能和可解釋性。

使用TF-IDF向量化器

TF-IDF向量化器可以幫助我們更好地表示文字資料中的詞匯重要性。

# 使用TF-IDF向量化器
from sklearn.feature_extraction.text import TfidfVectorizer

vec = TfidfVectorizer()
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(imdb.review, imdb.sentiment)
print_report(pipe)

內容解密:

  1. TfidfVectorizer的作用:將文字資料轉換為TF-IDF表示,考慮了詞匯在整個語料函式庫中的重要性。
  2. TF-IDF的計算公式:詞i在檔案j中的TF-IDF值 = 詞i在檔案j中的詞頻 * log(檔案總數 / 包含詞i的檔案數)。

TF-IDF向量化在文字分類別中的應用與最佳化

在處理文字資料時,TF-IDF(詞頻-逆檔案頻率)是一種非常有效的向量表示方法,尤其是在處理高頻詞彙時。本章節將探討TF-IDF在文字分類別任務中的應用,並透過實驗比較不同組態下的模型表現。

初始TF-IDF向量化實驗

首先,利用TfidfVectorizer對IMDB評論資料進行向量化,並結合LogisticRegressionCV進行情感分類別模型的訓練。實驗結果顯示,TF-IDF轉換後的模型準確率與未轉換前相差無幾,但機率值和評分有所變化。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegressionCV
from sklearn.pipeline import make_pipeline

vec = TfidfVectorizer()
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(imdb.review, imdb.sentiment)
print_report(pipe)

內容解密:

  1. TfidfVectorizer():初始化TF-IDF向量化器,將文字資料轉換為TF-IDF向量表示。
  2. LogisticRegressionCV():使用交叉驗證的邏輯迴歸分類別器,提高模型的泛化能力。
  3. make_pipeline(vec, clf):建立一個包含向量化和分類別的管道,簡化資料處理流程。
  4. pipe.fit(imdb.review, imdb.sentiment):訓練模型,使用IMDB評論資料和對應的情感標籤。

移除停用詞的TF-IDF向量化

進一步地,透過在TfidfVectorizer中設定stop_words='english'來移除停用詞,可以減少特徵維度,提高模型效率。實驗結果表明,這種方法可以獲得更好的準確率。

vec = TfidfVectorizer(stop_words='english')
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(imdb.review, imdb.sentiment)
print_report(pipe)

內容解密:

  1. stop_words='english':指定移除英語停用詞,降低無意義詞彙對模型的影響。
  2. 移除停用詞後,模型的特徵維度降低,有助於提高模型的訓練效率和準確率。

N-gram特徵提取

除了單詞級別的特徵提取,還可以透過N-gram方法提取字元或詞彙序列的特徵。實驗中使用了字元級別的2-gram到5-gram特徵,並結合TF-IDF向量化進行情感分類別,取得了99.8%的訓練準確率。

vec = TfidfVectorizer(stop_words='english', analyzer='char', ngram_range=(2,5))
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(imdb.review, imdb.sentiment)
print_report(pipe)

內容解密:

  1. analyzer='char':指定分析器為字元級別,提取字元序列的N-gram特徵。
  2. ngram_range=(2,5):設定N-gram的範圍,從2-gram到5-gram,捕捉不同長度的字元序列特徵。
  3. 這種方法能夠有效提高模型的分類別能力,尤其是在處理長文字時。

char_wb分析器的應用

為了進一步最佳化模型,可以使用char_wb分析器,它能夠提取詞內(word-boundary)的N-gram特徵,避免了重疊N-gram的幹擾。

vec = TfidfVectorizer(stop_words='english', analyzer='char_wb', ngram_range=(2,5))
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(imdb.review, imdb.sentiment)
print_report(pipe)

內容解密:

  1. analyzer='char_wb':使用詞內字元N-gram分析器,提取更精確的詞內特徵。
  2. 這種方法能夠有效提高模型的準確性和穩定性。