当前位置:   article > 正文

用Python算法预测客户行为案例_分类器threshold

分类器threshold

这是一份kaggle上的银行的数据集,研究该数据集可以预测客户是否认购定期存款y。这里包含20个特征。

1.分析框架

2.数据读取,数据清洗

  1. # 导入相关包
  2. import numpy as np
  3. import pandas as pd 
  4. # 读取数据
  5. data = pd.read_csv('./1bank-additional-full.csv')
  6. # 查看表的行列数
  7. 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这个年龄段的人数相对其他年龄段多。

  1. import matplotlib.pyplot as plt
  2. import seaborn as sns
  3. plt.rcParams['font.sans-serif'= 'SimHei'
  4. plt.figure(figsize=(208), dpi=256)
  5. sns.countplot(x='age'data=data)
  6. plt.title("各年龄段的人数")

 3.2 其他特征的一些分布

  1. plt.figure(figsize=(1816), dpi=512)
  2. plt.subplot(221)
  3. sns.countplot(x='contact'data=data)
  4. plt.title("contact分布情况")
  5. plt.subplot(222)
  6. sns.countplot(x='day_of_week'data=data)
  7. plt.title("day_of_week分布情况")
  8. plt.subplot(223)
  9. sns.countplot(x='default'data=data)
  10. plt.title("default分布情况")
  11. plt.subplot(224)
  12. sns.countplot(x='education'data=data)
  13. plt.xticks(rotation=70)
  14. plt.title("education分布情况")
  15. plt.savefig('./1.png')

  1. plt.figure(figsize=(1816), dpi=512)
  2. plt.subplot(221)
  3. sns.countplot(x='housing'data=data)
  4. plt.title("housing分布情况")
  5. plt.subplot(222)
  6. sns.countplot(x='job'data=data)
  7. plt.xticks(rotation=70)
  8. plt.title("job分布情况")
  9. plt.subplot(223)
  10. sns.countplot(x='loan'data=data)
  11. plt.title("loan分布情况")
  12. plt.subplot(224)
  13. sns.countplot(x='marital'data=data)
  14. plt.xticks(rotation=70)
  15. plt.title("marital分布情况")
  16. plt.savefig('./2.png')

  1. plt.figure(figsize=(188), dpi=512)
  2. plt.subplot(221)
  3. sns.countplot(x='month'data=data)
  4. plt.xticks(rotation=30)
  5. plt.subplot(222)
  6. sns.countplot(x='poutcome'data=data)
  7. plt.xticks(rotation=30)
  8. plt.savefig('./3.png')

3.3 各特征的相关性

  1. plt.figure(figsize=(108), dpi=256)
  2. plt.rcParams['axes.unicode_minus'= False
  3. sns.heatmap(data.corr(), annot=True)
  4. plt.savefig('./4.png')

4.特征规范化

4.1 将自变量的特征值转换成标签类型

  1. # 特征化数据
  2. from sklearn.preprocessing import LabelEncoder
  3. features = ['contact''day_of_week''default''education''housing',
  4.            'job','loan''marital''month''poutcome']
  5. le_x = LabelEncoder()
  6. for feature in features:
  7.     data[feature] = le_x.fit_transform(data[feature]) 

4.2 将结果y值转换成0、1

  1. def parse_y(x):
  2.     if (x == 'no'):
  3.         return 0
  4.     else:
  5.         return 1
  6. data['y'= data['y'].apply(parse_y)
  7. data['y'= data['y'].astype(int)

4.3 数据规范化

  1. # 数据规范化到正态分布的数据
  2. # 测试数据和训练数据的分割
  3. from sklearn.preprocessing import StandardScaler
  4. from sklearn.model_selection import train_test_split
  5. ss = StandardScaler()
  6. train_x, test_x, train_y, test_y = train_test_split(data.iloc[:,:-1], 
  7.                                                    data['y'], 
  8.                                                    test_size=0.3)
  9. train_x = ss.fit_transform(train_x)
  10. test_x = ss.transform(test_x)

5.模型训练

5.1 AdaBoost分类器

  1. from sklearn.ensemble import AdaBoostClassifier
  2. from sklearn.metrics import accuracy_score
  3. ada = AdaBoostClassifier()
  4. ada.fit(train_x, train_y)
  5. predict_y = ada.predict(test_x)
  6. print("准确率:", accuracy_score(test_y, predict_y))

5.2 SVC分类器

  1. from sklearn.svm import SVC
  2. svc = SVC()
  3. svc.fit(train_x, train_y)
  4. predict_y = svc.predict(test_x)
  5. print("准确率:", accuracy_score(test_y, predict_y))

5.3 K邻近值分类器

  1. from sklearn.neighbors import KNeighborsClassifier
  2. knn = KNeighborsClassifier()
  3. knn.fit(train_x, train_y)
  4. predict_y = knn.predict(test_x)
  5. print("准确率:", accuracy_score(test_y, predict_y))

5.4 决策树分类器

  1. from sklearn.tree import DecisionTreeClassifier
  2. dtc = DecisionTreeClassifier()
  3. dtc.fit(train_x, train_y)
  4. predict_y = dtc.predict(test_x)
  5. print("准确率:", accuracy_score(test_y, predict_y))

6 模型评价

6.1 AdaBoost分类器

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

6.2 SVC分类器

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

 

 6.3 K邻近值分类器

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

6.4 决策树分类器

  1. plt.figure(figsize=(8,6))
  2. fpr4, tpr4, threshoulds4 = roc_curve(test_y, dtc.predict(test_x))
  3. plt.stackplot(fpr4, tpr4, alpha = 0.5)
  4. plt.plot(fpr4, tpr4, linewidth=2, color='black')
  5. plt.plot([0,1], [0,1],ls='-', color='red')
  6. plt.text(0.50.4, auc(fpr4, tpr4))
  7. plt.title('决策树的ROC曲线')

需要文章中的源码了可以找下方 小姐姐哈

 -END-

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/339674?site
推荐阅读
相关标签
  

闽ICP备14008679号