ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据挖掘实战:信用卡违约率分析

2020-11-26 03:00:49  阅读:313  来源: 互联网

标签:信用卡 GridSearchCV 分类器 违约 参数 数据挖掘 import 最优 sklearn


在数据挖掘过程中,如何选择分类器,如何优化分类器的参数是核心问题。对于一个新的项目,我们还有其他的问题需要了解,比如掌握数据探索和数据可视化的方式,还需要对数据的完整性和质量做评估。

 

目标:

  1. 创建各种分类器,包括 SVM、决策树、KNN 分类器,以及随机森林分类器;
  2. 掌握 GridSearchCV 工具,优化算法模型的参数;
  3. 使用 Pipeline 管道机制进行流水线作业。

 

构建随机森林分类器

随机森林的英文是 Random Forest,英文简写是 RF。它实际上是一个包含多个决策树的分类器,每一个子分类器都是一棵 CART 分类回归树。所以随机森林既可以做分类,又可以做回归。当它做分类的时候,输出结果是每个子分类器的分类结果中最多的那个。可以理解是每个分类器都做投票,取投票最多的那个结果。当它做回归的时候,输出结果是每棵 CART 树的回归结果的平均值。

 

在 sklearn 中,使用 RandomForestClassifier() 构造随机森林模型,函数里有一些常用的构造参数:

n_estimators 随机森林中决策树的个数,默认是10
criterion 决策树分裂的标准,默认是基尼指数(CART)
max_depth 决策树的最大深度,默认None
n_jobs 拟合和预测的时候,CPU的核数,默认1

 

当我们创建好之后,就可以使用 fit 函数拟合,使用 predict 函数预测。

使用 GridSearchCV 工具对模型参数进行调优

在做分类算法的时候,我们需要经常调节网络参数(对应上面的构造参数),目的是得到更好的分类结果。实际上一个分类算法有很多参数,取值范围也比较广,那么该如何调优呢?

Python 给我们提供了一个很好用的工具 GridSearchCV,它是 Python 的参数自动搜索模块。我们只要告诉它想要调优的参数有哪些以及参数的取值范围,它就会把所有的情况都跑一遍,然后告诉我们哪个参数是最优的,结果如何。

使用 GridSearchCV 模块需要先引用工具包,方法如下:

from sklearn.model_selection import GridSearchCV

 

然后我们使用 GridSearchCV(estimator, param_grid, cv=None, scoring=None) 构造参数的自动搜索模块,这里有一些主要的参数需要说明下:

estimator 代表我们想要采用的分类器,比如随机森林,SVM,kNN等
param_grid 代表我们想要优化的参数及取值,输入字典或列表
cv 交叉验证的折数,默认是None,代表三折交叉验证
scoring 准确度评价标准,默认None,也就是使用score函数

 

构造完 GridSearchCV 之后,我们就可以使用 fit 函数拟合训练,使用 predict 函数预测,这时预测采用的是最优参数情况下的分类器。

 

这里举一个简单的例子,我们用 sklearn 自带的 IRIS 数据集,采用随机森林对 IRIS 数据分类。假设我们想知道 n_estimators 在 1-10 的范围内取哪个值的分类结果最好,可以编写代码:

# 使用 RandomForest 对 IRIS 数据集进行分类
# 利用 GridSearchCV 寻找最优参数
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
rf = RandomForestClassifier()
parameters = {"n_estimators": range(1,11)}
iris = load_iris()
# 使用 GridSearchCV 进行参数调优
clf = GridSearchCV(estimator=rf, param_grid=parameters)
# 对 iris 数据集进行分类
clf.fit(iris.data, iris.target)
print(" 最优分数: %.4lf" %clf.best_score_)
print(" 最优参数:", clf.best_params_)
运行结果如下:
最优分数: 0.9667
最优参数: {'n_estimators': 6}

可以看到当我们采用随机森林作为分类器的时候,最优准确率是 0.9667,当 n_estimators=6 的时候,是最优参数,也就是随机森林一共有 6 个子决策树。

 

使用 Pipeline 管道机制进行流水线作业

做分类的时候往往都是有步骤的,比如先对数据进行规范化处理,你也可以用 PCA 方法(一种常用的降维方法)对数据降维,最后使用分类器分类。

Python 有一种 Pipeline 管道机制。管道机制就是让我们把每一步都按顺序列下来,从而创建 Pipeline 流水线作业。每一步都采用 (‘名称’, 步骤) 的方式来表示。

我们需要先采用 StandardScaler 方法对数据规范化,即采用数据规范化为均值为 0,方差为 1 的正态分布,然后采用 PCA 方法对数据进行降维,最后采用随机森林进行分类。

 

from sklearn.model_selection import GridSearchCV
pipeline = Pipeline([
        ('scaler', StandardScaler()),
        ('pca', PCA()),
        ('randomforestclassifier', RandomForestClassifier())
])

我们现在采用 Pipeline 管道机制,用随机森林对 IRIS 数据集做一下分类。先用 StandardScaler 方法对数据规范化,然后再用随机森林分类,编写代码如下:

# 使用 RandomForest 对 IRIS 数据集进行分类
# 利用 GridSearchCV 寻找最优参数, 使用 Pipeline 进行流水作业
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
rf = RandomForestClassifier()
parameters = {"randomforestclassifier__n_estimators": range(1,11)}
iris = load_iris()
pipeline = Pipeline([
        ('scaler', StandardScaler()),
        ('randomforestclassifier', rf)
])
# 使用 GridSearchCV 进行参数调优
clf = GridSearchCV(estimator=pipeline, param_grid=parameters)
# 对 iris 数据集进行分类
clf.fit(iris.data, iris.target)
print(" 最优分数: %.4lf" %clf.best_score_)
print(" 最优参数:", clf.best_params_)
运行结果:
最优分数: 0.9667
最优参数: {'randomforestclassifier__n_estimators': 9}

 

可以看到是否采用数据规范化对结果还是有一些影响的,有了 GridSearchCV 和 Pipeline 这两个工具之后,我们在使用分类器的时候就会方便很多。

 

对信用卡违约率进行分析

我们现在来做一个信用卡违约率的项目,这个数据集你可以从 GitHub 上下载:https://github.com/cystanford/credit_default

这个数据集是台湾某银行 2005 年 4 月到 9 月的信用卡数据,数据集一共包括 25 个字段,具体含义如下:

 

字段 含义
ID 客户ID
LIMIT_BAL 可透支金额
SEX 性别
EDUCATION 教育程度
MARRIAGE 婚姻状况
AGE 年龄
PAY_0 2005年9月份还款情况
PAY_2 2005年8月份还款情况
PAY_3 2005年7月份还款情况
PAY_4 2005年6月份还款情况
PAY_5 2005年5月份还款情况
PAY_6 2005年4月份还款情况
BILL_AMT1 2005年9月客户每月账单金额
BILL_AMT2 2005年8月客户每月账单金额
BILL_AMT3 2005年7月客户每月账单金额
BILL_AMT4 2005年6月客户每月账单金额
BILL_AMT5 2005年5月客户每月账单金额
BILL_AMT6 2005年4月客户每月账单金额
PAY_AMT1 2005年9月客户每月还款金额
PAY_AMT2 2005年8月客户每月还款金额
PAY_AMT3 2005年7月客户每月还款金额
PAY_AMT4 2005年6月客户每月还款金额
PAY_AMT5 2005年5月客户每月还款金额
PAY_AMT6 2005年4月客户每月还款金额
default.payment.next.month 下个月是否违约

 现在我们的目标是要针对这个数据集构建一个分析信用卡违约率的分类器。具体选择哪个分类器,以及分类器的参数如何优化,我们可以用 GridSearchCV 这个工具跑一遍。

 

项目流程:

  1. 数据获取
  2. 数据探索、数据规范化、数据集划分
  3. 模型创建、模型训练、模型评估

 

基于上面的流程,具体代码如下:

# 信用卡违约率分析
import pandas as pd
from sklearn.model_selection import learning_curve, train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from matplotlib import pyplot as plt
import seaborn as sns
# 数据加载
data = data = pd.read_csv('./UCI_Credit_Card.csv')
# 数据探索
print(data.shape) # 查看数据集大小
print(data.describe()) # 数据集概览
# 查看下一个月违约率的情况
next_month = data['default.payment.next.month'].value_counts()
print(next_month)
df = pd.DataFrame({'default.payment.next.month': next_month.index,'values': next_month.values})
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.figure(figsize = (6,6))
plt.title('信用卡违约率客户\n (违约:1,守约:0)')
sns.set_color_codes("pastel")
sns.barplot(x = 'default.payment.next.month', y="values", data=df)
locs, labels = plt.xticks()
plt.show()
# 特征选择,去掉 ID 字段、最后一个结果字段即可
data.drop(['ID'], inplace=True, axis =1) #ID 这个字段没有用
target = data['default.payment.next.month'].values
columns = data.columns.tolist()
columns.remove('default.payment.next.month')
features = data[columns].values
# 30% 作为测试集,其余作为训练集
train_x, test_x, train_y, test_y = train_test_split(features, target, test_size=0.30, stratify = target, random_state = 1)
    
# 构造各种分类器
classifiers = [
    SVC(random_state = 1, kernel = 'rbf'),    
    DecisionTreeClassifier(random_state = 1, criterion = 'gini'),
    RandomForestClassifier(random_state = 1, criterion = 'gini'),
    KNeighborsClassifier(metric = 'minkowski'),
]
# 分类器名称
classifier_names = [
            'svc', 
            'decisiontreeclassifier',
            'randomforestclassifier',
            'kneighborsclassifier',
]
# 分类器参数
classifier_param_grid = [
            {'svc__C':[1], 'svc__gamma':[0.01]},
            {'decisiontreeclassifier__max_depth':[6,9,11]},
            {'randomforestclassifier__n_estimators':[3,5,6]} ,
            {'kneighborsclassifier__n_neighbors':[4,6,8]},
]
 
# 对具体的分类器进行 GridSearchCV 参数调优
def GridSearchCV_work(pipeline, train_x, train_y, test_x, test_y, param_grid, score = 'accuracy'):
    response = {}
    gridsearch = GridSearchCV(estimator = pipeline, param_grid = param_grid, scoring = score)
    # 寻找最优的参数 和最优的准确率分数
    search = gridsearch.fit(train_x, train_y)
    print("GridSearch 最优参数:", search.best_params_)
    print("GridSearch 最优分数: %0.4lf" %search.best_score_)
    predict_y = gridsearch.predict(test_x)
    print(" 准确率 %0.4lf" %accuracy_score(test_y, predict_y))
    response['predict_y'] = predict_y
    response['accuracy_score'] = accuracy_score(test_y,predict_y)
    return response
 
for model, model_name, model_param_grid in zip(classifiers, classifier_names, classifier_param_grid):
    pipeline = Pipeline([
            ('scaler', StandardScaler()),
            (model_name, model)
    ])
    result = GridSearchCV_work(pipeline, train_x, train_y, test_x, test_y, model_param_grid , score = 'accuracy')

 

运行结果:
(30000, 25)
                 ID             ...              default.payment.next.month
count  30000.000000             ...                            30000.000000
mean   15000.500000             ...                                0.221200
std     8660.398374             ...                                0.415062
min        1.000000             ...                                0.000000
25%     7500.750000             ...                                0.000000
50%    15000.500000             ...                                0.000000
75%    22500.250000             ...                                0.000000
max    30000.000000             ...                                1.000000
 
[8 rows x 25 columns]
 
GridSearch 最优参数: {'svc__C': 1, 'svc__gamma': 0.01}
GridSearch 最优分数: 0.8174
准确率 0.8172
GridSearch 最优参数: {'decisiontreeclassifier__max_depth': 6}
GridSearch 最优分数: 0.8186
准确率 0.8113
GridSearch 最优参数: {'randomforestclassifier__n_estimators': 6}
GridSearch 最优分数: 0.7998
准确率 0.7994
GridSearch 最优参数: {'kneighborsclassifier__n_neighbors': 8}
GridSearch 最优分数: 0.8040
准确率 0.8036

 

从结果中,我们能看到 SVM 分类器的准确率最高,测试准确率为 0.8172。

在决策树分类中,我设置了 3 种最大深度,当最大深度 =6 时结果最优,测试准确率为 0.8113;在随机森林分类中,我设置了 3 个决策树个数的取值,取值为 6 时结果最优,测试准确率为 0.7994;在 KNN 分类中,我设置了 3 个 n 的取值,取值为 8 时结果最优,测试准确率为 0.8036。

 

总结

很多时候,我们不知道该采用哪种分类算法更适合。即便是对于一种分类算法,也有很多参数可以调优,每个参数都有一定的取值范围。我们可以把想要采用的分类器,以及这些参数的取值范围都设置到数组里,然后使用 GridSearchCV 工具进行调优。

标签:信用卡,GridSearchCV,分类器,违约,参数,数据挖掘,import,最优,sklearn
来源: https://www.cnblogs.com/waterr/p/14040180.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有