用 Python 算法預測客戶行爲案例!

作者丨吳達科

這是一份 kaggle 上的銀行的數據集,研究該數據集可以預測客戶是否認購定期存款 y。這裏包含 20 個特徵。

1. 分析框架

2. 數據讀取,數據清洗

# 導入相關包
import numpy as np
import pandas as pd 
# 讀取數據
data = pd.read_csv('./1bank-additional-full.csv')
# 查看錶的行列數
data.shape

輸出:


這裏只有 nr.employed 這列有丟失數據,查看下:

data['nr.employed'].value_counts()

這裏只有 5191.0 這個值,沒有其他的,且只有 7763 條數據,這裏直接將這列當做異常值,直接將這列直接刪除了。

# data.drop('nr.employed', axis=1, inplace=True)

3. 探索性數據分析

3.1 查看各年齡段的人數的分佈

這裏可以看出該銀行的主要用戶主要集中在 23-60 歲這個年齡層,其中 29-39 這個年齡段的人數相對其他年齡段多。

import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.figure(figsize=(20, 8), dpi=256)
sns.countplot(x='age', data=data)
plt.title("各年齡段的人數")

3.2 其他特徵的一些分佈

plt.figure(figsize=(18, 16), dpi=512)
plt.subplot(221)
sns.countplot(x='contact', data=data)
plt.title("contact分佈情況")

plt.subplot(222)
sns.countplot(x='day_of_week', data=data)
plt.title("day_of_week分佈情況")

plt.subplot(223)
sns.countplot(x='default', data=data)
plt.title("default分佈情況")

plt.subplot(224)
sns.countplot(x='education', data=data)
plt.xticks(rotation=70)
plt.title("education分佈情況")

plt.savefig('./1.png')

plt.figure(figsize=(18, 16), dpi=512)
plt.subplot(221)
sns.countplot(x='housing', data=data)
plt.title("housing分佈情況")

plt.subplot(222)
sns.countplot(x='job', data=data)
plt.xticks(rotation=70)
plt.title("job分佈情況")

plt.subplot(223)
sns.countplot(x='loan', data=data)
plt.title("loan分佈情況")

plt.subplot(224)
sns.countplot(x='marital', data=data)
plt.xticks(rotation=70)
plt.title("marital分佈情況")

plt.savefig('./2.png')

plt.figure(figsize=(18, 8), dpi=512)
plt.subplot(221)
sns.countplot(x='month', data=data)
plt.xticks(rotation=30)

plt.subplot(222)
sns.countplot(x='poutcome', data=data)
plt.xticks(rotation=30)
plt.savefig('./3.png')

3.3 各特徵的相關性

plt.figure(figsize=(10, 8), dpi=256)
plt.rcParams['axes.unicode_minus'] = False
sns.heatmap(data.corr(), annot=True)
plt.savefig('./4.png')

4. 特徵規範化

4.1 將自變量的特徵值轉換成標籤類型

# 特徵化數據
from sklearn.preprocessing import LabelEncoder
features = ['contact', 'day_of_week', 'default', 'education', 'housing',
           'job','loan', 'marital', 'month', 'poutcome']

le_x = LabelEncoder()
for feature in features:
    data[feature] = le_x.fit_transform(data[feature])

4.2 將結果 y 值轉換成 0、1

def parse_y(x):
    if (x == 'no'):
        return 0
    else:
        return 1
data['y'] = data['y'].apply(parse_y)
data['y'] = data['y'].astype(int)

4.3 數據規範化

# 數據規範化到正態分佈的數據
# 測試數據和訓練數據的分割
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
ss = StandardScaler()
train_x, test_x, train_y, test_y = train_test_split(data.iloc[:,:-1], 
                                                   data['y'], 
                                                   test_size=0.3)
train_x = ss.fit_transform(train_x)
test_x = ss.transform(test_x)

5. 模型訓練

5.1 AdaBoost 分類器

from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
ada = AdaBoostClassifier()
ada.fit(train_x, train_y)
predict_y = ada.predict(test_x)
print("準確率:", accuracy_score(test_y, predict_y))

5.2 SVC 分類器

from sklearn.svm import SVC
svc = SVC()
svc.fit(train_x, train_y)
predict_y = svc.predict(test_x)
print("準確率:", accuracy_score(test_y, predict_y))

5.3 K 鄰近值分類器

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(train_x, train_y)
predict_y = knn.predict(test_x)
print("準確率:", accuracy_score(test_y, predict_y))

5.4 決策樹分類器

from sklearn.tree import DecisionTreeClassifier
dtc = DecisionTreeClassifier()
dtc.fit(train_x, train_y)
predict_y = dtc.predict(test_x)
print("準確率:", accuracy_score(test_y, predict_y))

6 模型評價

6.1 AdaBoost 分類器

from sklearn.metrics import roc_curve
from sklearn.metrics import auc
plt.figure(figsize=(8,6))
fpr1, tpr1, threshoulds1 = roc_curve(test_y, ada.predict(test_x))
plt.stackplot(fpr1, tpr1,color='steelblue', alpha = 0.5, edgecolor = 'black')
plt.plot(fpr1, tpr1, linewidth=2, color='black')
plt.plot([0,1], [0,1], ls='-', color='red')
plt.text(0.5, 0.4, auc(fpr1, tpr1))
plt.title('AdaBoost分類器的ROC曲線')

6.2 SVC 分類器

plt.figure(figsize=(8,6))
fpr2, tpr2, threshoulds2 = roc_curve(test_y, svc.predict(test_x))
plt.stackplot(fpr2, tpr2, alpha = 0.5)
plt.plot(fpr2, tpr2, linewidth=2, color='black')
plt.plot([0,1], [0,1],ls='-', color='red')
plt.text(0.5, 0.4, auc(fpr2, tpr2))
plt.title('SVD的ROC曲線')

6.3 K 鄰近值分類器

plt.figure(figsize=(8,6))
fpr3, tpr3, threshoulds3 = roc_curve(test_y, knn.predict(test_x))
plt.stackplot(fpr3, tpr3, alpha = 0.5)
plt.plot(fpr3, tpr3, linewidth=2, color='black')
plt.plot([0,1], [0,1],ls='-', color='red')
plt.text(0.5, 0.4, auc(fpr3, tpr3))
plt.title('K鄰近值的ROC曲線')

6.4 決策樹分類器

plt.figure(figsize=(8,6))
fpr4, tpr4, threshoulds4 = roc_curve(test_y, dtc.predict(test_x))
plt.stackplot(fpr4, tpr4, alpha = 0.5)
plt.plot(fpr4, tpr4, linewidth=2, color='black')
plt.plot([0,1], [0,1],ls='-', color='red')
plt.text(0.5, 0.4, auc(fpr4, tpr4))
plt.title('決策樹的ROC曲線')

來源: https://blog.csdn.net/qq_33333002/article/details/106280462

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/-MyRGC1cO7jfyejxdXXXQg