多類別文字分類別在實際應用中常面臨模型解釋性的挑戰。理解模型預測原因對於提升模型信任度和調優至關重要。本文以客戶投訴資料集為例,逐步展示如何構建多類別分類別模型,並使用多種技術分析其可解釋性。首先,對資料進行預處理,包含資料清洗、抽樣和類別重新命名。接著,使用 TF-IDF 將文字轉換為數值向量,並訓練邏輯迴歸和隨機梯度下降模型。然後,利用 ELI5 函式庫分析模型權重和個別預測結果,揭示關鍵特徵對預測的影響。此外,文章還探討了不同特徵工程方法,例如移除停用詞、字元級 N-Gram 和雜湊向量化,對模型效能和可解釋性的影響,並比較了不同方法的優缺點。最後,引入 What-If 工具(WIT)分析模型的公平性,進一步提升模型的透明度和可靠性,提供更全面的模型理解。

多類別文字分類別的可解釋性

在處理多類別分類別問題時,我們面臨的挑戰是如何解釋每個類別的預測結果。與二元分類別不同,多類別分類別需要為每個類別提供重要的正負特徵。本章節將探討如何使用客戶投訴資料集來建立一個多類別分類別模型,並使用可解釋性技術來理解模型的預測結果。

資料準備

首先,我們需要準備資料集。我們從 https://catalog.data.gov/dataset/consumer-complaint-database 下載客戶投訴資料集。資料集包含客戶投訴的敘述和產品類別。

import pandas as pd

# 讀取資料集
df = pd.read_csv('complaints.csv')

# 檢視資料集的基本資訊
df.shape
df.info()

# 建立一個新的 DataFrame,包含 'Product' 和 'Consumer complaint narrative' 兩列
df1 = df[['Product', 'Consumer complaint narrative']].copy()

# 移除缺失值
df1 = df1[pd.notnull(df1['Consumer complaint narrative'])]

# 簡化列名
df1.columns = ['Product', 'Consumer_complaint']

# 對資料進行抽樣,以減少計算時間
df2 = df1.sample(20000, random_state=1).copy()

# 對類別進行重新命名
df2.replace({'Product': {'Credit reporting, credit repair services, or other personal consumer reports': 'Credit reporting, repair, or other', 'Credit reporting': 'Credit reporting, repair, or other', 'Credit card': 'Credit card or prepaid card', 'Prepaid card': 'Credit card or prepaid card', 'Payday loan': 'Payday loan, title loan, or personal loan', 'Money transfer': 'Money transfer, virtual currency, or money service', 'Virtual currency': 'Money transfer, virtual currency, or money service'}}, inplace=True)

內容解密:

  1. 資料讀取與基本處理:首先讀取客戶投訴資料集,並檢視其形狀和基本資訊。
  2. 建立新的 DataFrame:選取 ‘Product’ 和 ‘Consumer complaint narrative’ 兩列,並移除缺失值,以簡化後續分析。
  3. 資料抽樣:對資料進行抽樣,以減少計算時間。
  4. 類別重新命名:對產品類別進行重新命名,以簡化類別標籤。

特徵工程

接下來,我們需要對文字資料進行特徵工程。我們使用 TF-IDF 向量器來將文字資料轉換為數值特徵。

from sklearn.feature_extraction.text import TfidfVectorizer

# 建立 TF-IDF 向量器
vectorizer = TfidfVectorizer(ngram_range=(1, 2), stop_words='english', sublinear_tf=True, min_df=5)

# 對文字資料進行向量化
X = vectorizer.fit_transform(df2['Consumer_complaint'])
y = df2['Product']

內容解密:

  1. TF-IDF 向量器:使用 TF-IDF 向量器來將文字資料轉換為數值特徵。
  2. 引數設定:設定 ngram_range 為 (1, 2),表示考慮單字和雙字組合;設定 stop_words 為 ’english’,表示移除英文停用詞;設定 sublinear_tf 為 True,表示使用 sublinear TF;設定 min_df 為 5,表示忽略出現次數少於 5 的詞彙。

模型訓練與可解釋性

我們使用隨機梯度下降分類別器來訓練模型,並使用 ELI5 函式庫來提供可解釋性。

from sklearn.linear_model import SGDClassifier
from eli5 import show_weights

# 訓練模型
clf = SGDClassifier(random_state=42)
clf.fit(X, y)

# 檢視模型權重
show_weights(clf, vec=vectorizer, top=20)

內容解密:

  1. 模型訓練:使用隨機梯度下降分類別器來訓練模型。
  2. 模型權重:使用 ELI5 函式庫來檢視模型權重,瞭解哪些特徵對預測結果有重要影響。

多類別文字分類別模型的解釋能力分析

本章節將探討如何使用機器學習模型來進行多類別文字分類別,並進一步解釋模型的預測結果。我們將使用一個消費者投訴資料集,透過邏輯迴歸模型進行分類別,並利用ELI5函式庫來解釋模型的預測結果。

資料預處理與模型訓練

首先,我們使用CountVectorizer將文字資料轉換為向量表示,然後使用LogisticRegressionCV進行多類別分類別模型的訓練。

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

vec = CountVectorizer()
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(df2.Consumer_complaint, df2.Product)

內容解密:

  • CountVectorizer用於將文字資料轉換為詞頻向量,是處理文字資料的基礎步驟。
  • LogisticRegressionCV是一種邏輯迴歸模型,適用於多類別分類別問題,並自動進行交叉驗證以選擇最佳的正則化引數。
  • make_pipeline用於建立一個管道,將向量化和模型訓練串聯起來,簡化了流程。

模型評估

接下來,我們評估模型的效能,使用classification_reportaccuracy_score來評估模型的準確性和F1分數。

from sklearn import metrics

def print_report(pipe):
    y_test = df2.Product
    y_pred = pipe.predict(df2.Consumer_complaint)
    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)

內容解密:

  • classification_report提供了各類別的精確率、召回率和F1分數,是評估多類別分類別模型的重要指標。
  • accuracy_score計算了模型的整體準確性,直接反映了模型的預測能力。

模型解釋

為了進一步理解模型的預測結果,我們使用ELI5函式庫來解釋模型的權重和預測結果。

import eli5
eli5.show_weights(clf, feature_names=vec.get_feature_names(), target_names=set(df2.Product))

內容解密:

  • eli5.show_weights用於顯示模型對於各類別的重要特徵(詞彙),幫助理解哪些詞彙對於預測結果有重要影響。
  • feature_names引數提供了詞彙的名稱,使得結果更具解釋性。
  • target_names引數指定了類別的名稱,使得結果更容易理解。

區域性解釋

我們還可以對單個樣本的預測結果進行解釋,瞭解哪些詞彙對於該樣本的預測結果有重要影響。

eli5.show_prediction(clf, np.array(df2.Consumer_complaint)[0], vec=vec, target_names=set(df2.Product))

內容解密:

  • eli5.show_prediction用於顯示單個樣本的預測結果和影響該結果的重要特徵。
  • 透過分析這些特徵,可以瞭解模型為什麼做出這樣的預測。

最佳化模型

最後,我們嘗試透過移除停用詞來最佳化模型,進一步提高模型的效能。

vec = CountVectorizer(stop_words='english')
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(df2.Consumer_complaint, df2.Product)

內容解密:

  • stop_words='english'引數用於移除英語停用詞,減少噪音對模型的影響。
  • 移除停用詞後,模型的準確性和F1分數可能會有所變化,需要重新評估。

自然語言處理中的文字分類別可解釋性探討

在自然語言處理(NLP)領域中,文字分類別是最重要的應用場景之一。它可用於消費者投訴分類別、原始文字分類別為各種實體,以及將情感分類別為正面和負面等任務。這些任務涵蓋了二元分類別和多類別分類別。在本章中,我們將重點關注監督式機器學習模型的可解釋性。

從詞頻向量到TF-IDF向量

首先,我們將詞頻向量(Count Vectorizer)替換為TF-IDF向量(TfidfVectorizer),並觀察其對區域性可解釋性的影響。以下為具體的程式碼實作:

from sklearn.feature_extraction.text import TfidfVectorizer

vec = TfidfVectorizer()
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(df2.Consumer_complaint, df2.Product)
print_report(pipe)

內容解密:

  1. 使用TfidfVectorizer將文字資料轉換為TF-IDF向量表示。
  2. LogisticRegressionCV用於建立具有交叉驗證的邏輯迴歸模型。
  3. make_pipeline將向量化和模型訓練過程串聯起來。
  4. pipe.fit對資料進行模型訓練。

根據實驗結果,TF-IDF方法將整體準確率提高到90.1%,並且第一個投訴樣本的區域性可解釋性也有所改善,機率分數達到72.5%。

進一步實驗:移除停用詞的TF-IDF

接下來,我們嘗試使用移除停用詞的TF-IDF向量化方法,觀察其對區域性可解釋性的影響。

vec = TfidfVectorizer(stop_words='english')
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(df2.Consumer_complaint, df2.Product)
print_report(pipe)
eli5.show_prediction(clf, np.array(df2.Consumer_complaint)[0], vec=vec, target_names=set(df2.Product))

內容解密:

  1. stop_words='english'引數用於移除英語停用詞。
  2. 其他部分與前一步驟相同。

實驗結果顯示,移除停用詞後,整體模型準確率略微提高到90.6%,第一個投訴樣本的抵押貸款類別機率分數變為73.5%。

特徵建立:字元級N-Gram

進一步地,我們嘗試使用字元級N-Gram(從2-Gram到5-Gram)進行特徵建立。

vec = TfidfVectorizer(stop_words='english', analyzer='char', ngram_range=(2,5))
clf = LogisticRegressionCV()
pipe = make_pipeline(vec, clf)
pipe.fit(df2.Consumer_complaint, df2.Product)
print_report(pipe)
eli5.show_prediction(clf, np.array(df2.Consumer_complaint)[0], vec=vec, target_names=set(df2.Product))

內容解密:

  1. analyzer='char'表示使用字元級分析。
  2. ngram_range=(2,5)表示建立從2-Gram到5-Gram的特徵。

結果顯示,準確率提高到91.4%,抵押貸款類別的機率分數進一步提高到74.2%。

使用雜湊向量化與隨機梯度提升模型

為了控制詞彙長度,我們引入雜湊向量化(HashingVectorizer)與隨機梯度提升模型(SGDClassifier)。

from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.linear_model import SGDClassifier

vec = HashingVectorizer(stop_words='english', ngram_range=(1,2))
clf = SGDClassifier(random_state=42)
pipe = make_pipeline(vec, clf)
pipe.fit(df2.Consumer_complaint, df2.Product)
print_report(pipe)

內容解密:

  1. HashingVectorizer用於建立雜湊向量表示。
  2. SGDClassifier用於建立隨機梯度提升模型。

雖然整體模型準確率下降到85.7%,但第一個投訴樣本的機率分數提高到78%。然而,這是一個偏頗的模型,主要特徵「mortgage」主導了分類別結果。

使用 What-If 工具(WIT)進行 AI 模型公平性分析

前言

隨著人工智慧(AI)和機器學習(ML)技術的發展,模型的公平性和可解釋性成為了越來越重要的議題。Google 所開發的 What-If 工具(WIT)提供了一個強大的平台,用於探查和分析機器學習模型的公平性和偏見。本章將介紹如何使用 WIT 來分析 AI 模型的公平性,並透過具體案例來展示其應用。

什麼是 What-If 工具(WIT)?

What-If 工具(WIT)是一個由 Google 在 2019 年發布的開源工具,旨在幫助開發者和資料科學家瞭解機器學習模型的內在機制和潛在偏見。WIT 可以用於分析迴歸模型、分類別模型和多類別分類別模型等不同型別的機器學習模型。透過 WIT,使用者可以視覺化地探查模型的行為,模擬不同的輸入,並檢查模型的輸出結果。

安裝 What-If 工具

要使用 WIT,首先需要安裝相關的套件。以下是安裝 WIT 的步驟:

!pip install witwidget

安裝完成後,需要在 Jupyter Notebook 環境中執行以下命令:

jupyter nbextension install --py --symlink --sys-prefix witwidget
jupyter nbextension enable --py --sys-prefix witwidget

內容解密:

  1. !pip install witwidget:安裝 WIT 的 widget 套件。
  2. jupyter nbextension install --py --symlink --sys-prefix witwidget:安裝 WIT 的 Jupyter Notebook 擴充功能。
  3. jupyter nbextension enable --py --sys-prefix witwidget:啟用 WIT 的 Jupyter Notebook 擴充功能。

準備資料和模型

本例中使用了一個客戶流失資料集(Churn Dataset)。首先,需要載入資料集並進行預處理:

import pandas as pd

df = pd.read_csv('ChurnData.csv')
del df['Unnamed: 0']
df.head()

內容解密:

  1. import pandas as pd:載入 Pandas 套件,用於資料處理。
  2. df = pd.read_csv('ChurnData.csv'):載入客戶流失資料集。
  3. del df['Unnamed: 0']:刪除不需要的欄位。
  4. df.head():顯示資料集的前幾行。

建立 TensorFlow 特徵規範

WIT 需要 TensorFlow 特徵規範來格式化輸入資料。以下函式用於建立特徵規範:

import tensorflow as tf

def create_feature_spec(df, columns=None):
    feature_spec = {}
    if columns == None:
        columns = df.columns.values.tolist()
    for f in columns:
        if df[f].dtype is np.dtype(np.int64):
            feature_spec[f] = tf.io.FixedLenFeature(shape=(), dtype=tf.int64)
        elif df[f].dtype is np.dtype(np.float64):
            feature_spec[f] = tf.io.FixedLenFeature(shape=(), dtype=tf.float32)
        else:
            feature_spec[f] = tf.io.FixedLenFeature(shape=(), dtype=tf.string)
    return feature_spec

內容解密:

  1. def create_feature_spec(df, columns=None):定義一個函式,用於建立 TensorFlow 特徵規範。
  2. feature_spec = {}:初始化一個空的字典,用於儲存特徵規範。
  3. if columns == None::如果沒有指定欄位,則使用資料集中的所有欄位。
  4. for f in columns::遍歷每個欄位,並根據其資料型別建立相應的特徵規範。

使用 WIT 分析模型公平性

透過 WIT,可以視覺化地分析模型的公平性。以下是一個簡單的例子,展示如何使用 WIT 來分析模型的偏見:

from witwidget.notebook.visualization import WitConfigBuilder
from witwidget.notebook.visualization import WitWidget

# 建立 WitConfigBuilder 物件
config_builder = WitConfigBuilder(df)

# 建立 WitWidget 物件
wit_widget = WitWidget(config_builder, height=800)

內容解密:

  1. from witwidget.notebook.visualization import WitConfigBuilder:載入 WitConfigBuilder 類別,用於建立 WIT 的組態。
  2. from witwidget.notebook.visualization import WitWidget:載入 WitWidget 類別,用於建立 WIT 的視覺化介面。
  3. config_builder = WitConfigBuilder(df):建立一個 WitConfigBuilder 物件,並傳入資料集。
  4. wit_widget = WitWidget(config_builder, height=800):建立一個 WitWidget 物件,並傳入組態和高度引數。