返回文章列表

TensorFlow客戶流失預測與模型公平性分析

本文探討使用 TensorFlow 建立客戶流失預測模型,並深入剖析模型公平性議題。文章涵蓋資料預處理、模型訓練、使用 What-If Tool 探索模型行為、以及利用 SHAP 和 Alibi 進行模型解釋性分析。同時,文章也示範如何使用 Keras 訓練深度學習模型並應用於影像分類別任務,並結合 SHAP

機器學習 資料分析

深度學習模型已成為當今人工智慧和機器學習應用中的核心技術。本文將探討如何運用 TensorFlow 建構客戶流失預測模型,並進一步分析模型的公平性。首先,我們會將客戶的使用歷史資料,例如帳戶長度、通話時間和費用等,轉換成 TensorFlow 可接受的格式。接著,使用 LinearClassifier 訓練模型,並利用 What-If Tool 探索模型行為,特別關注模型在預測邊界案例時的表現。為深入理解模型的決策過程,我們將使用 SHAP 和 Alibi 進行模型解釋性分析,揭示特徵的重要性以及它們對預測結果的影響。此外,本文也將示範如何使用 Keras 訓練深度學習模型進行影像分類別,並結合 SHAP 解釋模型預測,提供更全面的模型理解和應用。

使用TensorFlow進行客戶流失預測與AI模型公平性分析

在電信客戶流失分類別場景中,客戶的使用歷史資料被用於預測客戶是否可能流失。這些資料包括客戶的帳戶長度、所在區域程式碼、國際通話計劃是否啟用、語音信箱計劃、語音信箱訊息數量、白天通話總時間、總通話次數和總費用等。這些特徵有助於預測客戶未來流失的可能性。

資料預處理與模型訓練

首先,需要將資料轉換為TensorFlow模型可以接受的格式。以下函式將DataFrame轉換為tf.Example協定緩衝區列表:

def df_to_examples(df, columns=None):
    examples = []
    if columns == None:
        columns = df.columns.values.tolist()
    for index, row in df.iterrows():
        example = tf.train.Example()
        for col in columns:
            if df[col].dtype is np.dtype(np.int64):
                example.features.feature[col].int64_list.value.append(int(row[col]))
            elif df[col].dtype is np.dtype(np.float64):
                example.features.feature[col].float_list.value.append(row[col])
            elif row[col] == row[col]:
                example.features.feature[col].bytes_list.value.append(row[col].encode('utf-8'))
        examples.append(example)
    return examples

內容解密:

  1. 遍歷DataFrame的每一行:對於DataFrame中的每一行,建立一個tf.train.Example例項。
  2. 根據資料型別填充特徵:根據每一列的資料型別,將值新增到對應的特徵列表中(int64、float或bytes)。
  3. 新增到範例列表:將構建好的tf.train.Example新增到範例列表中。

接下來,需要將標籤欄位轉換為數值格式,以適用於二元分類別模型:

def make_label_column_numeric(df, label_column, test):
    df[label_column] = np.where(test(df[label_column]), 1, 0)

內容解密:

  1. 條件判斷:使用np.where根據測試條件將標籤欄位的值轉換為1或0。
  2. 更新DataFrame:直接在原始DataFrame上更新標籤欄位。

模型訓練與評估

選定特徵和標籤欄位後,可以定義特徵規範並訓練TensorFlow估計器模型:

label_column = 'churn'
make_label_column_numeric(df, label_column, lambda val: val == 'yes')
input_features = ['account_length', 'area_code', 'international_plan', 'voice_mail_plan', 'number_vmail_messages', 
                  'total_day_minutes', 'total_day_calls', 'total_day_charge', 'total_eve_minutes', 
                  'total_eve_calls', 'total_eve_charge', 'total_night_minutes', 'total_night_calls', 
                  'total_night_charge', 'total_intl_minutes', 'total_intl_calls', 'total_intl_charge', 
                  'number_customer_service_calls']
features_and_labels = input_features + [label_column]
feature_spec = create_feature_spec(df, features_and_labels)
classifier = tf.estimator.LinearClassifier(feature_columns=create_feature_columns(input_features, feature_spec))
train_inpf = functools.partial(tfexamples_input_fn, examples, feature_spec, label_column)
classifier.train(train_inpf, steps=num_steps)

內容解密:

  1. 定義特徵和標籤:選定用於模型訓練的特徵和標籤欄位。
  2. 建立特徵規範:使用create_feature_spec函式根據選定的欄位建立特徵規範。
  3. 訓練模型:使用LinearClassifier和訓練輸入函式進行模型訓練。

使用What-If Tool進行模型行為探索

訓練好的模型可以使用Google的What-If Tool(WIT)進行評估和視覺化:

test_examples = df_to_examples(test_df[0:num_datapoints])
config_builder = WitConfigBuilder(test_examples).set_estimator_and_feature_spec(classifier, feature_spec).set_label_vocab(['Churn', 'No Churn'])
WitWidget(config_builder, height=tool_height_in_px)

內容解密:

  1. 準備測試資料:將測試資料轉換為tf.Example格式。
  2. 組態WIT:設定WIT以使用測試範例、訓練好的分類別器和特徵規範。
  3. 視覺化:使用WitWidget顯示視覺化結果,可以探索模型的行為,包括效能和公平性。

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

在圖 8-3 中,藍色點代表無客戶流失案例,紅色點代表客戶流失案例。從測試資料集中觀察編號 1073 的紀錄,其客戶流失機率為 0.016%,無客戶流失機率為 98.4%,這是一個良好的預測結果。然而,當檢視編號 799 的案例時,客戶流失機率為 49.2%,無客戶流失機率為 50.8%。這類別案例對模型來說相當模糊,預測模型難以區分客戶流失與否。

What-If 工具預設使用 0.5 的分類別閾值。若預測機率超過 0.5,則預測為正類別(無客戶流失);否則,預測為負類別(客戶流失)。在右側面板的散佈圖中,顯示了推斷分數,即機率分數。若推斷分數大於 0.5,則為正類別;否則,為負類別。存在一些邊界案例,因此需要額外的模型微調。

資料點編輯與推斷結果分析

左側面板的資料點編輯器允許檢視和編輯個別紀錄的值,並觀察對預測推斷的影響。這展示了模型推斷的能力和對預測結果的詳細解釋。對於同樣的編號 799 案例,當將帳戶長度更改為 210,總日通話次數更改為 227,以及其他某些引數,並點選左側選單中的「預測」按鈕,可以看到客戶流失推斷分數從 49.2% 下降到 25.8%,無客戶流失機率從 50.8% 上升到 74.2%,對應於模擬的第二次執行。

部分相依圖(PDP)分析

部分相依圖(PDP)顯示了一個或兩個特徵對機器學習模型預測結果的邊際貢獻。圖 8-7 展示了模型中使用的所有獨立變數的部分相依圖,並按變異程度排序。

隨著帳戶長度的增加,推斷分數逐漸降低。區域程式碼變數的部分相依圖如圖 8-8 所示。

模型效能評估

在評估模型的整體效能時,可以考慮混淆矩陣,它說明瞭模型中客戶流失與無客戶流失案例之間的匹配和不匹配情況。在圖 8-9 所示的效能和公平性螢幕中,可以看到 ROC 曲線、AUC 曲線、混淆矩陣和成本比率。可以更改閾值機率值以更改分類別矩陣。

評估指標

  • 精確度(Precision):模型正確預測正類別標籤的頻率。
  • 召回率(Recall):模型正確預測資料集中正類別的比例。

深度學習模型的解釋性

根據深度神經網路的模型正逐漸成為人工智慧和機器學習實施的骨幹。未來,資料探勘的發展將受到根據人工神經網路的高階建模技術的影響。神經網路自 1950 年代發明以來,為何近年來變得如此重要?神經網路是一種平行資訊處理系統,其輸入相互連線,類別似於人類大腦中的神經元,以傳輸資訊,從而執行面部識別和影像識別等任務。

理論上,神經網路已經存在超過 50 年,但直到計算領域取得一定進展,特別是 GPU 和 TPU 在執行高階計算、大規模矩陣乘法等方面的演進,才使得神經網路專案在實際場景中的執行成為可能。在本章中,您將學習到根據神經網路的方法在各種資料探勘任務(如分類別、迴歸、預測和特徵縮減)中的應用。人工神經網路(ANN)的運作方式與人類大腦相似,其中數十億個神經元相互連線以進行資訊處理和洞察生成。

解釋深度學習模型

大腦的生物網路為連線真實場景中的元素以進行資訊處理和洞察生成提供了基礎。神經元的層次結構透過層次相互連線,其中一層的輸出成為另一層的輸入。資訊透過權重從一層傳遞到另一層。每個神經元相關的權重包含洞察力,使得下一級別的識別和推理變得更加容易。人工神經網路是一種非常流行且有效的技術。

深度學習模型的可解釋性

深度學習模型是一種由多層神經元組成的複雜系統,每一層都與特定的權重相關聯。不同層之間的關聯由數學方程式控制,這些方程式將資訊從一層傳遞到另一層。實際上,一個人工神經網路模型內部有多個數學方程式在運作。圖9-1展示了根據神經網路的模型的一般架構,其中顯示了輸入層、輸出層和隱藏層。

神經網路的基本架構

神經網路有三個核心層:輸入層、隱藏層和輸出層。這些層是任何根據神經網路的架構的核心。人工神經網路是一種強大的技術,可以解決許多現實世界的問題,如分類別、迴歸和特徵選擇。人工神經網路能夠從新的輸入資料中學習,以提高分類別或迴歸任務的效能,並適應輸入環境的變化。

圖9-1中的每個圓圈代表一個神經元。深度學習的一大優勢在於,我們不需要專注於為模型訓練建立手工特徵。特徵之間的互動作用不需要由人類建立,而是在訓練過程中自動生成的。

神經網路的變體

從演算法或計算的角度來看,神經網路有多種變體,用於不同的場景。下面將概念性地解釋幾種變體,以便了解它們在實際應用中的使用。

  • 單隱藏層神經網路:這是最簡單的神經網路形式,如圖9-1所示。它只有一個隱藏層。
  • 多隱藏層神經網路:這種形式的神經網路有多個隱藏層連線輸入資料和輸出資料。計算的複雜度增加,需要更多的計算能力。
  • 前饋神經網路:在這種形式的神經網路架構中,資訊從一層傳遞到另一層,沒有迭代。
  • 反向傳播神經網路:這種形式的神經網路有兩個重要的步驟。前饋工作透過將資訊從輸入層傳遞到隱藏層,然後從隱藏層傳遞到輸出層。其次,它計算誤差並將其反向傳播到前面的層。

還有另一種根據使用和結構的分類別,可以解釋如下:

  • 迴圈神經網路(RNN):主要用於順序資訊處理,如音訊處理、文字分類別等。
  • 深度神經網路(DNN):用於高維結構化資料問題,其中特徵互動作用非常複雜,難以手動構建每個特徵。
  • 卷積神經網路(CNN):主要用於影像資料,其中畫素大小產生高維矩陣。需要以卷積的方式合成資訊以進行影像分類別。

使用SHAP進行深度學習模型解釋

正如前幾章所提到的,SHAP是一個偉大的函式庫,用於所有型別的模型解釋、區域性模型解釋和全域模型解釋。SHAP值是根據博弈論的方法計算出來的。下面是SHAP值的計算公式。

Deep SHAP框架

Deep SHAP是一個用於從根據深度學習的模型中匯出SHAP值的框架,可以使用Keras或TensorFlow開發模型。以MNIST資料集為例,樣本資料點顯示數字的畫素值,並使用深度學習模型進行影像分類別。下面顯示了SHAP值。

使用Alibi進行模型解釋

除了DeepLIFT和Deep SHAP之外,還有另一個開源函式庫叫做Alibi。它是一個根據Python的函式庫,旨在解釋機器學習模型。下面是安裝Alibi和使用另一個叫做Ray的函式庫加速搜尋Alibi的程式碼。

!pip install alibi
!pip install alibi[ray]
!pip install tensorflow_datasets
!pip install keras

安裝與設定

  1. 安裝Alibi函式庫:!pip install alibi
  2. 安裝alibi[ray]函式庫:!pip install alibi[ray]
  3. 安裝tensorflow_datasets函式庫:!pip install tensorflow_datasets
  4. 安裝Keras函式庫:!pip install keras

內容解密:

上述程式碼是用來安裝必要的函式庫,以便使用Alibi進行模型解釋。首先,我們安裝了Alibi函式庫本身。然後,我們安裝了alibi[ray],它是一個依賴函式庫,用於加速搜尋過程。接著,我們安裝了tensorflow_datasets,用於收集一些資料集以供本章使用。最後,我們安裝了Keras函式庫,用於建立深度學習模型。

技術解析

使用Alibi進行模型解釋需要安裝多個相關的函式庫,包括Alibi本身、alibi[ray]、tensorflow_datasets和Keras。每個函式庫都有其特定的功能和用途。例如,Alibi提供了模型解釋的功能,而alibi[ray]則用於加速搜尋過程。tensorflow_datasets提供了多個可用的資料集,而Keras則用於建立和訓練深度學習模型。

綜上所述,透過安裝和使用這些函式庫,我們可以有效地使用Alibi進行深度學習模型的解釋和分析。這對於理解模型的決策過程和提高模型的透明度具有重要意義。

使用Keras進行深度學習模型訓練與解釋

深度學習模型在影像分類別任務中展現出卓越的效能,而Keras作為一個強大的深度學習框架,提供了簡潔易用的API來構建和訓練這些模型。本文將探討如何使用Keras訓練一個影像分類別模型,並使用SHAP(SHapley Additive exPlanations)函式庫來解釋模型的預測結果。

匯入必要的函式庫與載入資料

首先,我們匯入必要的函式庫並載入MNIST資料集,這是一個經典的手寫數字影像分類別資料集。

from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
import matplotlib.pyplot as plt
%matplotlib inline

# 設定引數
batch_size = 128
num_classes = 10
epochs = 12
img_rows, img_cols = 28, 28

# 載入MNIST資料集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 資料預處理
if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# 將類別向量轉換為二元類別矩陣
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

內容解密:

  • 載入MNIST資料集並進行必要的資料預處理,包括調整資料形狀和正規化畫素值。
  • 將類別標籤轉換為二元類別矩陣,以便於模型訓練。

構建影像分類別模型

接下來,我們構建一個簡單的卷積神經網路(CNN)模型來進行影像分類別。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

內容解密:

  • 使用Sequential模型堆積疊多個層,包括卷積層、最大池化層、丟棄層和全連線層。
  • 卷積層用於提取影像特徵,最大池化層用於降低空間維度,丟棄層用於防止過擬合。
  • 全連線層用於最終的分類別,使用softmax啟用函式輸出類別機率。

訓練模型

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))

內容解密:

  • 使用訓練資料對模型進行訓練,設定批次大小和迭代次數。
  • 在訓練過程中,使用測試資料進行驗證,以監控模型的效能。

評估模型

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

內容解密:

  • 使用測試資料評估模型的效能,包括損失和準確率。

使用SHAP解釋模型預測

最後,我們使用SHAP函式庫來解釋模型的預測結果。

import shap
import tensorflow as tf
tf.compat.v1.disable_v2_behavior() # 如果遇到Tensor相關錯誤,請執行此行

background = x_train[np.random.choice(x_train.shape[0],100, replace=False)]
explainer = shap.DeepExplainer(model, background)
shap_values = explainer.shap_values(x_test[1:5])

# 繪製特徵歸因圖
shap.image_plot(shap_values, -x_test[1:5])

內容解密:

  • 使用SHAP的DeepExplainer來解釋模型的預測結果。
  • 繪製特徵歸因圖,以視覺化的方式展示每個特徵對預測結果的貢獻。