機器學習實戰:應用ANN預測客戶解約

0x00 人工神經網絡介紹

人工神經網絡(Artificial Neural Network,即ANN ),是20世紀80 年代以來人工智能領域興起的研究熱點。它從信息處理角度對人腦神經元網絡進行抽象, 建立某種簡單模型,按不同的連接方式組成不同的網絡。在工程與學術界也常直接簡稱為神經網絡或類神經網絡。神經網絡是一種運算模型,由大量的節點(或稱神經元)之間相互 連接構成。每個節點代表一種特定的輸出函數,稱為激活函數(activation function)。每兩個節點間的連接都代表一個對於通過該連接信號的加權值,稱之為權重,這相當於人工神經網絡的記憶。網絡的輸出則依網絡的連接方式,權重值和激勵函數的不同而不同。而網絡自身通常都是對自然界某種算法或者函數的逼近,也可能是對一種邏輯策略的表達。

0x01 基礎知識準備

本文需要讀者瞭解以下內容:

激活函數ANN的工作原理ANN的學習原理梯度下降隨機梯度下降前向網絡反饋網絡

對基礎知識瞭解不太紮實的讀者也不用擔心,頭條號後續會補充基礎知識的相關文章。

0x02 環境搭建(Windows)

1、安裝Anaconda,具體步驟請參考頭條號文章《 》

2、打開Anaconda Prompt

3、執行如下命令創建虛擬環境

conda create -n tensorflow python=3.5 anaconda

注意:

如果出現錯誤The path 'vcruntime140.dll' specified in the package manifest cannot be found.

說明是沒有安裝vs2015,安裝vs2015即可解決

4、激活虛擬環境

activate tensorflow

5、安裝Theano、TensorFlow、Keras

conda install theano

conda install mingw libpython

pip install tensorflow

pip install keras

6、更新所有軟件到最新版本

conda update --all

7、運行 Spyder:

spyder

0x03 問題描述

現有一個包含10000條銀行客戶數據的數據集,包含銀行客戶的一些基本信息,如:客戶ID,姓名,信用積分,國家,性別,年齡,與銀行簽約時長,資產,產品數,是否有信用卡,是否活躍,年薪和是否已經解約(也就是拋棄了這家銀行),所有數據都是獨立的。目前需要根據此數據集預測哪些客戶傾向與這家銀行解約,這樣可以達到提前對這些客戶做相應措施的目的。要數據集的朋友請看評論。

如下圖所示,exited為1表示已解約,exited為0表示未解約

0x04 創建ANN模型

創建ANN模型分為兩部分,第一部分為數據處理,第二部分為創建ANN模型。

本文問題為分類問題,我們需要篩選能夠影響客戶去留的輸入數據,和客戶留下或者離開的輸出數據。

數據處理步驟如下:

1、導入需要的庫

在spyder左側的編輯框輸入以下內容,並按control+enter執行它們

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

2、導入數據集

執行下面代碼

dataset = pd.read_csv('Churn_Modelling.csv')

X = dataset.iloc[:, 3:13].values

y = dataset.iloc[:, 13].values

dataset,X,y變量分別為:

dataset

X

y

3、將分類變量列轉換成二進制數。

執行如下語句:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

labelencoder_X_1 = LabelEncoder()

X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])

labelencoder_X_2 = LabelEncoder()

X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])

onehotencoder = OneHotEncoder(categorical_features = [1])

X = onehotencoder.fit_transform(X).toarray()

X = X[:, 1:]

其中涉及到了OneHot編碼的知識。簡單來說就是將每種分類用二進制的一位表示,是哪種分類哪一位就是1,其它位就是0。

執行之後的X如下圖所示:

3、將數據集分為訓練集和測試集

執行下面的代碼:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

4、將數據進行特徵縮放

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.transform(X_test)

創建ANN模型步驟如下:

5、導入Keras庫

import keras

from keras.models import Sequential

from keras.layers import Dense

6、初始化ANN

classifier = Sequential()

7、增加輸入層和第一個隱含層

classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))

8、增加第二個隱含層

classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))

9、增加輸出層

classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))

10、編譯ANN

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

11、用訓練集訓練

classifier.fit(X_train, y_train, batch_size = 10, epochs = 100)

12、用測試集測試

y_pred = classifier.predict(X_test)

y_pred = (y_pred > 0.5)

13、生成混淆矩陣

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)

注意:

有些函數的詳細使用方法在spyder裡面有幫助,例如將光標放在Dense上,按control+i打開help文檔

按ctrl+i

Dense類

0x05 結論

如下圖所示,橫向是測試集,縱向是預測結果。

準確率為85.25%

0x06 總結

本文介紹了什麼是ANN,如何搭建實驗環境,如何下載數據,數據預處理,使用ANN模型預測客戶是否會解約。

例如應用訓練好的模型預測客戶是否會解約

現某客戶信息如下:

Geography: FranceCredit Score: 600Gender: MaleAge: 40 years oldTenure: 3 yearsBalance: $60000Number of Products: 2Does this customer have a credit card ? YesIs this customer an Active Member: YesEstimated Salary: $50000

使用ANN模型預測他是否會解約:

new_prediction = classifier.predict(sc.transform(np.array([[0.0, 0, 600, 1, 40, 3, 60000, 2, 1, 1, 50000]])))

new_prediction = (new_prediction > 0.5)

答案是客戶不會解約。

0x07 寫在最後

下篇文章將介紹ANN的評價與優化。

本文是系列文章,後續還將以類似形式推出如下內容:

CNN(卷積神經網絡)

RNN(循環神經網絡)

SOMs(自組織特徵映射神經網絡)

Boltzmann Machine(玻爾茲曼機)

AutoEncoders(自動編碼器)

Regression&Classification(迴歸和聚類)

本文到此就介紹完了,感謝大家的閱讀。