Python數據科學:神經網絡

圖片


(Artificial Neural Network,ANN)人工神經網絡模型,以數學和物理的方法對人腦神經網絡進行簡化、抽象和模擬。算法


本次只是一個簡單的神經網絡入門,涉及神經元模型和BP神經網絡。網絡


這裏簡單瞭解一下機器學習的三要素,分別是模型、策略與算法。dom


模型包括非隨機效應部分(被解釋變量和解釋變量之間的關係,多爲函數關係)和隨機效應部分(擾動項)。機器學習


策略是指如何設定最優化的目標函數,常見的目標函數有線性迴歸的殘差平方和、邏輯迴歸的似然函數、SVM中的合頁函數等。ide


算法是對目標函數求參的方法,好比經過求導的方法計算,或者使用數值計算領域的算法求解。函數


其中神經網絡就是採用數值算法求解參數,這就意味着每次計算獲得的模型參數都會是不一樣的。學習



/ 01 / 神經網絡測試


01 神經元模型優化


神經網絡中最基本的成分是神經元模型。spa


每一個神經元都是一個多輸入單輸出的信息處理單元,輸入信號經過帶權重的鏈接傳遞,和閾值對比後獲得總輸入值,再經過激活函數的處理產生單個輸出


神經元的輸出,是對激活函數套用輸入加權和的結果。


神經元的激活函數使得神經元具備不一樣的信息處理特性,反映了神經元輸出與其激活狀態之間的關係。


本次涉及到的激活函數有閾值函數(階躍函數)、sigmoid函數(S型函數)。


02 單層感知器


感知器是一種具備單層計算單元的神經網絡,只能用來解決線性可分的二分類問題。


沒法運用到多層感知器中,沒法肯定隱藏層的指望輸出。


它的結構相似以前的神經元模型。


激活函數採用單極性(或雙極性)閾值函數。


03 BP神經網絡


採用偏差反向傳播算法(有監督學習算法)訓練的多層神經網絡稱爲BP神經網絡。


屬於多層前饋型神經網絡,模型的學習過程由信號的正向傳播偏差反向傳播兩個過程組成。


進行正向傳播時信號從輸入層計算各層加權和,經由各隱層最終傳遞到輸出層,獲得輸出結果,比較輸出結果與指望結果(監督信號),獲得輸出偏差。


偏差反向傳播是依照梯度降低算法將偏差沿着隱藏層到輸入層逐層反向傳播,將偏差分攤給各層的全部單元,從而獲得各個單元的偏差信號(學習信號),據此修改各單元權值。


這兩個信號傳播過程不斷循環以更新權值,最終根據斷定條件判斷是否結束循環。


其網絡結構廣泛爲單隱層網絡,包括輸入層隱層輸出層


激活函數多采用sigmoid函數或線性函數,這裏隱層和輸出層均採用sigmoid函數。



/ 02/ Python實現


神經網絡在有明確的訓練樣本後,網絡的輸入層結點數(解釋變量個數)和輸出層結點數(被解釋變量的個數)便已肯定。


須要考慮的則是隱含層的個數和每一個隱含層的結點個數。


下面利用書中的數據進行實戰一波,一份移動離網數據


移動通信用戶消費特徵數據,目標字段爲是否流失,具備兩個分類水平(是與否)。


自變量包含了用戶的基本信息、消費的產品信息以及用戶的消費特徵。


讀取數據。


 
 

import pandas as pd
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split

# 設置最大顯示行數
pd.set_option('display.max_rows'10)
# 設置最大顯示列數
pd.set_option('display.max_columns'10)
# 設置顯示寬度爲1000,這樣就不會在IDE中換行了
pd.set_option('display.width'1000)
# 讀取數據,skipinitialspace:忽略分隔符後的空白
churn = pd.read_csv('telecom_churn.csv', skipinitialspace=True)
print(churn)


輸出數據概況,包含3000多個用戶數據。


image.png


使用scikit-learn中的函數將數據集劃分爲訓練集和測試集


 
 

# 選取自變量數據
data = churn.iloc[:, 2:]
# 選取因變量數據
target = churn['churn']
# 使用scikit-learn將數據集劃分爲訓練集和測試集
train_data, test_data, train_target, test_target = train_test_split(data, target, test_size=0.4, train_size=0.6, random_state=1234)


神經網絡須要對數據進行極值標準化


須要對連續變量進行極值標準化,分類變量須要轉變爲虛擬變量。


其中多分類名義變量必須轉變爲虛擬變量,而等級變量和二分類變量則能夠選擇不轉變,當作連續變量處理便可。


本次數據中,教育等級和套餐類型是等級變量,性別等變量爲二分類變量,這些均可以做爲連續變量進行處理。


這也就意味着本次的數據集中不存在多分類名義變量,均可做爲連續變量進行處理。


 
 

# 極值標準化處理
scaler = MinMaxScaler()
scaler.fit(train_data)

scaled_train_data = scaler.transform(train_data)
scaler_test_data = scaler.transform(test_data)


創建多層感知器模型。


 
 

# 設置多層感知器對應的模型
mlp = MLPClassifier(hidden_layer_sizes=(10,), activation='logistic', alpha=0.1, max_iter=1000)
# 對訓練集進行模型訓練
mlp.fit(scaled_train_data, train_target)
# 輸出神經網絡模型信息
print(mlp)


輸出模型信息以下。


image.png


接下來使用通過訓練集訓練的模型,對訓練集及測試集進行預測。


 
 

# 使用模型進行預測
train_predict = mlp.predict(scaled_train_data)
test_predict = mlp.predict(scaler_test_data)


輸出預測機率,用戶流失的機率。


 
 

# 輸出模型預測機率(爲1的狀況)
train_proba = mlp.predict_proba(scaled_train_data)[:, 1]
test_proba = mlp.predict_proba(scaler_test_data)[:, 1]


對模型進行評估,輸出評估數據。


 
 

# 根據預測信息輸出模型評估結果
print(metrics.confusion_matrix(test_target, test_predict, labels=[01]))
print(metrics.classification_report(test_target, test_predict))


輸出以下。


image.png


模型對流失用戶的f1-score(精確率和召回率的調和平均數)值爲0.81,效果不錯。


此外對流失用戶的靈敏度recall爲0.83,模型能識別出83%的流失用戶,說明模型識別流失用戶的能力還能夠。


輸出模型預測的平均準確度。


 
 

# 使用指定數據集輸出模型預測的平均準確度
print(mlp.score(scaler_test_data, test_target))
# 輸出值爲0.8282828282828283


平均準確度值爲0.8282。


計算模型的ROC下面積。


 
 

# 繪製ROC曲線
fpr_test, tpr_test, th_test = metrics.roc_curve(test_target, test_proba)
fpr_train, tpr_train, th_train = metrics.roc_curve(train_target, train_proba)
plt.figure(figsize=[33])
plt.plot(fpr_test, tpr_test, 'b--')
plt.plot(fpr_train, tpr_train, 'r-')
plt.title('ROC curve')
plt.show()

# 計算AUC值
print(metrics.roc_auc_score(test_target, test_proba))
# 輸出值爲0.9149632415075206


ROC曲線圖以下。


image.png


訓練集和測試集的曲線很接近,沒有過擬合現象。


AUC值爲0.9149,說明模型效果很是好。


對模型進行最優參數搜索,而且對最優參數下的模型進行訓練。


 
 

# 使用GridSearchCV進行最優參數搜索
param_grid = {
    # 模型隱層數量
    'hidden_layer_sizes': [(10, ), (15, ), (20, ), (55)],
    # 激活函數
    'activation': ['logistic''tanh''relu'],
    # 正則化係數
    'alpha': [0.0010.010.10.20.4110]
}

mlp = MLPClassifier(max_iter=1000)
# 選擇roc_auc做爲評判標準,4折交叉驗證,n_jobs=-1使用多核CPU的所有線程
gcv = GridSearchCV(estimator=mlp, param_grid=param_grid,
                   scoring='roc_auc', cv=4, n_jobs=-1)
gcv.fit(scaled_train_data, train_target)


輸出最優參數的模型的狀況。


 
 

# 輸出最優參數下模型的得分
print(gcv.best_score_)
# 輸出值爲0.9258018987136855

# 輸出最優參數下模型的參數
print(gcv.best_params_)
# 輸出參數值爲{'alpha': 0.01, 'activation': 'tanh', 'hidden_layer_sizes': (5, 5)}

# 使用指定數據集輸出最優模型預測的平均準確度
print(gcv.score(scaler_test_data, test_target))
# 輸出值爲0.9169384823390232


模型的roc_auc最高得分爲0.92,即該模型下的ROC曲線下面積爲0.92。


較以前的0.9149,提升了一點點。


模型的最優參數,激活函數爲relu類型,alpha爲0.01,隱藏層節點數爲15個。


模型的預測平均準確率爲0.9169,較以前的0.8282,提升了很多。


相關資料獲取,請點擊閱讀原文。





···  END  ···


image.png

相關文章
相關標籤/搜索