社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python算法预测客户行为案例!

CDA数据分析师 • 2 年前 • 584 次点击  

来源丨网络

作者吴达科


这是一份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=(208), dpi=256)
sns.countplot(x='age', data=data)
plt.title("各年龄段的人数")

3.2 其他特征的一些分布

plt.figure(figsize=(1816), 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=(1816), 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=(188), 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=(108), 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.50.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.50.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.50.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.50.4, auc(fpr4, tpr4))
plt.title('决策树的ROC曲线')
来源:
https://blog.csdn.net/qq_33333002/article/details/106280462


 

 

点这里👇关注我,记得标星哦~



推荐阅读



 

CDA课程咨询

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/148376
 
584 次点击