1. 程式人生 > >如何利用Python和深度神經網路鎖定即將流失的客戶?業績過十萬!

如何利用Python和深度神經網路鎖定即將流失的客戶?業績過十萬!

煩惱

作為一名資料分析師,你來到這家跨國銀行工作已經半年了。

今天上午,老闆把你叫到辦公室,面色凝重。

你心裡直打鼓,以為自己捅了什麼簍子。幸好老闆的話讓你很快打消了顧慮。

客戶主要分佈在法國、德國和西班牙。

你手裡掌握的資訊,包括他們的年齡、性別、信用、辦卡資訊等。客戶是否已流失的資訊在最後一列(Exited)。

請選擇左側的Python 3.6版本下載安裝。

其次是新建資料夾,起名為demo-customer-churn-ann,並且從這個連結下載資料,放到該資料夾下。

點選介面右上方的New按鈕,新建一個Python 3 Notebook,起名為customer-churn-ann。

準備工作結束,下面我們開始清理資料。

清理

首先,讀入資料清理最常用的pandas和numpy包。

可以看到,資料完整無誤讀入。但是並非所有的列都對我們預測使用者流失有作用。我們一一甄別一下:

  • RowNumber:行號,這個肯定沒用,刪除
  • CustomerID:使用者編號,這個是順序發放的,刪除
  • Surname:使用者姓名,對流失沒有影響,刪除
  • CreditScore:信用分數,這個很重要,保留
  • Geography:使用者所在國家/地區,這個有影響,保留
  • Gender:使用者性別,可能有影響,保留
  • Age:年齡,影響很大,年輕人更容易切換銀行,保留
  • Tenure:當了本銀行多少年使用者,很重要,保留
  • Balance:存貸款情況,很重要,保留
  • NumOfProducts:使用產品數量,很重要,保留
  • HasCrCard:是否有本行信用卡,很重要,保留
  • IsActiveMember:是否活躍使用者,很重要,保留
  • EstimatedSalary:估計收入,很重要,保留
  • Exited:是否已流失,這將作為我們的標籤資料

在Scikit-learn工具包裡面,專門提供了方便的工具 LabelEncoder ,讓我們可以方便地將類別資訊變成數值。

這樣是不是就完事大吉了呢?

不對,Gender還好說,只有兩種取值方式,要麼是男,要麼是女。我們可以把“是男性”定義為1,那麼女性就取值為0。兩種取值只是描述類別不同,沒有歧義。

而Geography就不同了。因為資料集裡面可能的國家地區取值有3種,所以就轉換成了0(法國)、1(德國)、2(西班牙)。問題是,這三者之間真的有序列(大小)關係嗎?

答案自然是否定的。我們其實還是打算用數值描述分類而已。但是取值有數量的序列差異,就會給機器帶來歧義。它並不清楚不同的取值只是某個國家的程式碼,可能會把這種大小關係帶入模型計算,從而產生錯誤的結果。

沒有。

因為本例中,OneHotEncoder轉換出來的3列數字,實際上是不獨立的。給定其中兩列的資訊,你自己都可以計算出其中的第3列取值。

好比說,某一行的前兩列數字是 (0, 0) ,那麼第三列肯定是1。因為這是轉換規則決定的。3列裡只能有1個是1,其餘都是0。

如果你做過多元線性迴歸,應該知道這種情況下,我們是需要去掉其中一列,才能繼續分析的。不然會落入“虛擬變數陷阱”(dummy variable trap)。

我們刪掉第0列,避免掉進坑裡。

X = np.delete(X, [0], 1)

再次列印第一行:

這樣在後面訓練的時候,他就可以和前面的特徵矩陣一一對應來操作計算了。

既然標籤代表了類別,我們也把它用OneHotEncoder轉換,這樣方便我們後面做分類學習。

onehotencoder = OneHotEncoder()

y = onehotencoder.fit_transform(y).toarray()

此時的標籤變成兩列資料,一列代表顧客存留,一列代表顧客流失。

y

array([[ 0., 1.],

[ 1., 0.],

[ 0., 1.],

...,

[ 0., 1.],

[ 0., 1.],

[ 1., 0.]])

總體的資料已經齊全了。但是我們 不能 把它們 都用來 訓練。

你會發現,許多列的方差比原先小得多。機器學習起來,會更加方便。

資料清理和轉換工作至此完成。

決策樹

如果讀過我的《 貸還是不貸:如何用Python和機器學習幫你決策? 》一文,你應該有一種感覺——這個問題和貸款審批決策很像啊!既然在該文中,決策樹很好使,我們繼續用決策樹不就好了?

經檢測,決策樹在咱們的資料集上,表現得還是不錯的。總體的準確率為0.81,召回率為0.80,f1分數為0.81,已經很高了。對10個客戶做流失可能性判斷,它有8次都能判斷正確。

但是,這樣是否足夠?

我們或許可以調整決策樹的引數做優化,嘗試改進預測結果。

或者我們可以採用 深度學習 。

深度

深度學習的使用場景,往往是因為原有的模型經典機器學習模型過於簡單,無法把握複雜資料特性。

我不準備給你講一堆數學公式,咱們動手做個實驗。

請你開啟這個網址。

你會看到如下圖所示的深度學習遊樂場:

右側的圖形,裡面是藍色資料,外圈是黃色資料。你的任務就是要用模型分類兩種不同資料。

你說那還不容易?我一眼就看出來了。

你看出來沒有用。通過你的設定,讓機器也能正確區分,才算數。

圖中你看到許多加減號。咱們就通過操縱它們來玩兒一玩兒模型。

首先,點圖中部上方的"2 HIDDEN LAYERS"左側減號,把中間隱藏層數降低為1。

然後,點選"2 neurons"上面的減號,把神經元數量減少為1。

把頁面上方的Activation函式下拉框開啟,選擇“Sigmoid”。

現在的模型,其實就是經典的邏輯迴歸(Logistic Regression)。

點選左上方的執行按鈕,我們看看執行效果。

由於模型過於簡單,所以機器絞盡腦汁,試圖用一條直線切分二維平面上的兩類節點。

損失(loss)居高不下。訓練集和測試集損失都在0.4左右,顯然不符合我們的分類需求。

下面我們試試增加層數和神經元數量。這次點選加號,把隱藏層數加回到2,兩層神經元數量都取2。

再次點選執行。

經過一段時間,結果穩定了下來,你發現這次電腦用了兩條線,把平面切分成了3部分。

測試集損失下降到了0.25左右,而訓練集損失更是降低到了0.2以下。

模型複雜了,效果似乎更好一些。

再接再厲,我們把第一個隱藏層的神經元數量增加為4看看。

點選執行,不一會兒有趣的事情就發生了。

機器用一條近乎完美的曲線把平面分成了內外兩個部分。測試集和訓練集損失都極速下降,訓練集損失甚至接近於0。

這告訴我們,許多時候模型過於簡單帶來的問題,可以通過加深隱藏層次、增加神經元的方法提升模型複雜度,加以改進。

目前流行的劃分方法,是用隱藏層的數量多少來區分是否“深度”。當神經網路中隱藏層數量達到3層以上時,就被稱為“深度神經網路”,或者“深度學習”。

久聞大名的深度學習,原來就是這麼簡單。

如果有時間的話,建議你自己在這個遊樂場裡多動手玩兒一玩兒。你會很快對神經網路和深度學習有個感性認識。

框架

遊樂場背後使用的引擎,就是Google的深度學習框架Tensorflow。

所謂框架,就是別人幫你構造好的基礎軟體應用。你可以通過呼叫它們,避免自己重複發明輪子,大幅度節省時間,提升效率。

支援Python語言的深度學習的框架有很多,除了Tensorflow外,還有PyTorch, Theano和MXNet等。

我給你的建議是,找到一個你喜歡的軟體包,深入學習使用,不斷實踐來提升自己的技能。 千萬不要 跟別人爭論哪個深度學習框架更好。一來蘿蔔白菜各有所愛,每個人都有自己的偏好;二來深度學習的江湖水很深,言多有失。說錯了話,別的門派可能會不高興喲。

我比較喜歡Tensorflow。但是Tensorflow本身是個底層庫。雖然隨著版本的更迭,介面越來越易用。但是對初學者來說,許多細節依然有些過於瑣碎,不容易掌握。

初學者的耐心有限,挫折過多容易放棄。

幸好,還有幾個高度抽象框架,是建立在Tensorflow之上的。如果你的任務是 應用 現成的深度學習模型,那麼這些框架會給你帶來非常大的便利。

這些框架包括Keras, TensorLayer等。咱們今天將要使用的,叫做TFlearn。

它的特點,就是長得很像Scikit-learn。這樣如果你熟悉經典機器學習模型,學起來會特別輕鬆省力。

實戰

閒話就說這麼多,下面咱們繼續寫程式碼吧。

寫程式碼之前,請回到終端下,執行以下命令,安裝幾個軟體包:

pip install tensorflow

pip install tflearn

執行完畢後,回到Notebook裡。

我們呼叫tflearn框架。

import tflearn

然後,我們開始搭積木一樣,搭神經網路層。

首先是輸入層。

net = tflearn.input_data(shape=[None, 11])

注意這裡的寫法,因為我們輸入的資料,是特徵矩陣。而經過我們處理後,特徵矩陣現在有11列,因此shape的第二項寫11。

shape的第一項,None,指的是我們要輸入的特徵矩陣行數。因為我們現在是搭建模型,後面特徵矩陣有可能一次輸入,有可能分成組塊輸入,長度可大可小,無法事先確定。所以這裡填None。tflearn會在我們實際執行訓練的時候,自己讀入特徵矩陣的尺寸,來處理這個數值。

下面我們搭建隱藏層。這裡我們要使用深度學習,搭建3層。

net = tflearn.fully_connected(net, 6, activation='relu')

net = tflearn.fully_connected(net, 6, activation='relu')

net = tflearn.fully_connected(net, 6, activation='relu')

activation剛才在深度學習遊樂場裡面我們遇到過,代表啟用函式。如果沒有它,所有的輸入輸出都是線性關係。

Relu函式是啟用函式的一種。它大概長這個樣子。

如果你想了解啟用函式的更多知識,請參考後文的學習資源部分。

隱藏層裡,每一層我們都設定了6個神經元。其實至今為之,也不存在最優神經元數量的計算公式。工程界的一種做法,是把輸入層的神經元數量,加上輸出層神經元數量,除以2取整。咱們這裡就是用的這種方法,得出6個。

搭好了3箇中間隱藏層,下面我們來搭建輸出層。

net = tflearn.fully_connected(net, 2, activation='softmax')

net = tflearn.regression(net)

這裡我們用兩個神經元做輸出,並且說明使用迴歸方法。輸出層選用的啟用函式為softmax。處理分類任務的時候,softmax比較合適。它會告訴我們每一類的可能性,其中數值最高的,可以作為我們的分類結果。

積木搭完了,下面我們告訴TFlearn,以剛剛搭建的結構,生成模型。

model = tflearn.DNN(net)

有了模型,我們就可以使用擬合功能了。你看是不是跟Scikit-learn的使用方法很相似呢?

model.fit(X_train, y_train, n_epoch=30, batch_size=32, show_metric=True)

注意這裡多了幾個引數,我們來解釋一下。

n_epoch

batch_size

show_metric

以下就是電腦輸出的最終訓練結果。其實中間執行過程看著更激動人心,你自己試一下就知道了。

Training Step: 7499 | total loss: [1m[32m0.39757[0m[0m | time: 0.656s

| Adam | epoch: 030 | loss: 0.39757 - acc: 0.8493 -- iter: 7968/8000

Training Step: 7500 | total loss: [1m[32m0.40385[0m[0m | time: 0.659s

| Adam | epoch: 030 | loss: 0.40385 - acc: 0.8487 -- iter: 8000/8000

--

我們看到訓練集的損失(loss)大概為0.4左右。

開啟終端,我們輸入

tensorboard --logdir=/tmp/tflearn_logs/

然後在瀏覽器裡輸入 http://localhost:6006/

可以看到如下介面:

這是模型訓練過程的視覺化圖形,可以看到準確度的攀升和損失降低的曲線。

開啟GRAPHS標籤頁,我們可以檢視神經網路的結構圖形。

我們搭積木的過程,在此處一目瞭然。

評估

訓練好了模型,我們來嘗試做個預測吧。

看看測試集的特徵矩陣第一行。

X_test[0]

array([ 1.75486502, -0.57369368, -0.55204276, -1.09168714, -0.36890377,

1.04473698, 0.8793029 , -0.92159124, 0.64259497, 0.9687384 ,

1.61085707])

我們就用它來預測一下分類結果。

y_pred = model.predict(X_test)

打印出來看看:

y_pred[0]

array([ 0.70956731, 0.29043278], dtype=float32)

模型判斷該客戶不流失的可能性為0.70956731。

我們看看實際標籤資料:

y_test[0]

array([ 1., 0.])

客戶果然沒有流失。這個預測是對的。

相關推薦

如何利用Python深度神經網路鎖定即將流失客戶業績十萬

煩惱作為一名資料分析師,你來到這家跨國銀行工作已經半年了。今天上午,老闆把你叫到辦公室,面色凝重。你心裡直打鼓,以為自己捅了什麼簍子。幸好老闆的話讓你很快打消了顧慮。客戶主要分佈在法國、德國和西班牙。你手裡掌握的資訊,包括他們的年齡、性別、信用、辦卡資訊等。客戶是否已流失的資

如何用Python深度神經網路發現即將流失客戶

想不想了解如何用Python快速搭建深度神經網路,完成資料分類任務?本文一步步為你展示這一過程,

如何用Python深度神經網路識別影象?

來源:王樹義科學網部落格概要:只需要10幾行Python程式碼,你就能自己構建機器視覺模型,對圖

Python深度神經網路識別影象

進化的作用,讓人類對影象的處理非常高效。這裡,我給你展示一張照片。如果我這樣問你:你能否分辨出圖片中哪個是貓,哪個是狗?你可能立即會覺得自己遭受到了莫大的侮辱。並且大聲質問我:你覺得我智商有問題嗎?!息怒。換一個問法:你能否把自己分辨貓狗圖片的方法,描述成嚴格的規則,教給計算

如何用Python深度神經網路尋找近似圖片?

給你10萬張圖片,讓你從中找出與某張圖片最為近似的10張,你會怎麼做?不要輕言放棄,也不用一張張

使用python實現深度神經網路 1

深度學習基本概念 一、實驗介紹 1.1 實驗內容 深度學習並沒有你想象的那麼難,本課程將會一邊講解深度學習中的基本理論,一邊通過動手使用python實現一個簡單的深度神經網路去驗證這些理論,讓你從原理上真正入門深度學習。 本次實驗將會帶大家學習深度學習中的一些最基本的概念,本次實驗很重要,理解這

使用python實現深度神經網路 3

快速計算梯度的魔法--反向傳播演算法一、實驗介紹1.1 實驗內容第一次實驗最後我們說了,我們已經學習了深度學習中的模型model(神經網路)、衡量模型效能的損失函式和使損失函式減小的學習演算法learn(梯度下降演算法),還了解了訓練資料data的一些概念。但是還沒有解決梯度下降演算法中如何求損失函式梯度的問

使用python實現深度神經網路 5

深度學習 一、實驗介紹 1.1 實驗內容 上次實驗我們使用淺層神經網路達到了0.9的驗證集準確率,本次實驗我們將增加神經網路的深度,進行真正的深度學習。 1.2 實驗知識點 梯度消失問題交叉熵損失函式 1.3 實驗環境 python 2.7numpy 1.12.1

[Python人工智慧] 四.神經網路深度學習入門知識

從本篇文章開始,作者正式開始研究Python深度學習、神經網路及人工智慧相關知識。前三篇文章講解了神經網路基礎概念、Theano庫的安裝過程及基礎用法、theano實現迴歸神經網路、theano實現分類神經網路,這篇文章又回到基礎知識,結合莫煩大神的視訊學習,講解機器學習基礎

一種利用語音深度神經網路進行語音識別的新方案

A NOVEL SCHEME FOR SPEAKER RECOGNITION USING A PHONETICALLY-AWARE DEEP NEURAL NETWORK Yun Lei Nicolas Scheffer Luciana Ferrer Mitchell McLaren 美國加

如何利用Keras中的權重約束減少深度神經網路中的擬合

                                          &nb

深度學習】Python實現簡單神經網路

Python簡單神經網路 環境介紹 定義神經網路的框架 初始化 建立網路節點和連結 簡單均勻分佈隨機初始權重 正態分佈初始權重 編寫查詢函式 階段性測試 編寫訓練函式

[Python人工智慧] 六.神經網路的評價指標、特徵標準化特徵選擇

從本系列文章開始,作者正式開始研究Python深度學習、神經網路及人工智慧相關知識。前五篇文章講解了神經網路基礎概念、Theano庫的安裝過程及基礎用法、theano實現迴歸神經網路、theano實現分

python keras實戰】利用VGG卷積神經網路進行手寫字型識別

# encoding: utf-8 import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np from keras.datasets import mnist impor

機器學習(包括深度神經網路python開發環境搭建(超詳細)(適合新手)

最近接了一個大資料專案,需要進行到資料分析,作為一個從程式設計師往資料探勘工程師轉行的人來說,R語言在靈活性上不如Python,並且在深度神經網路等機器學習開源模組上,python也比R語言有更好的支援。本文主要利用Ubuntu來搭建虛擬機器來進行資料分析工作,主要利用了

深度神經網路為何很難訓練(包含梯度消失梯度爆炸等)

我選取了原文的部分內容進行轉載。之前我搜索”梯度消失和梯度爆炸“的相關部落格,發現很多都解釋的不是很好,然後看到了 極客學院 的這篇介紹,感覺介紹的挺詳細,轉載一下,大家一起分享一下~ 到現在為止,本書講神經網路看作是瘋狂的客戶。幾乎我們遇到的所有的網路

Coursera吳恩達《優化深度神經網路》課程筆記(3)-- 超引數除錯、Batch正則化程式設計框架

上節課我們主要介紹了深度神經網路的優化演算法。包括對原始資料集進行分割,使用mini-batch gradient descent。然後介紹了指數加權平均(Exponentially weighted averages)的概念以及偏移校正(bias corr

關於機器人抓取的兩篇文章,基於深度學習脈衝神經網路,以及大腦見圖

 Towards Grasping with Spiking Neural Networks for Anthropomorphic Robot Hands Dex-Net 3.0: Computing Robust Robot Suction Grasp Targe

深度神經網路之損失函式啟用函式

1.損失函式和啟用函式簡介 通過前面深度神經網路之前向傳播演算法和深度神經網路之反向傳播演算法的學習,我們能夠了解到損失函式是用來評估模型的預測值與真實值之間的差異程度。另外損失函式也是神經網路中優化的目標函式,神經網路訓練或者優化的過程就是最小化損失函式的過程