数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17208 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

39丨数据挖掘实战(1):信用卡违约率分析

陈旸 2019-03-13
今天我来带你做一个数据挖掘的项目。在数据挖掘的过程中,我们经常会遇到一些问题,比如:如何选择各种分类器,到底选择哪个分类算法,是 SVM,决策树,还是 KNN?如何优化分类器的参数,以便得到更好的分类准确率?
这两个问题,是数据挖掘核心的问题。当然对于一个新的项目,我们还有其他的问题需要了解,比如掌握数据探索和数据可视化的方式,还需要对数据的完整性和质量做评估。这些内容我在之前的课程中都有讲到过。
今天的学习主要围绕下面的三个目标,并通过它们完成信用卡违约率项目的实战,这三个目标分别是:
创建各种分类器,包括已经掌握的 SVM、决策树、KNN 分类器,以及随机森林分类器;
掌握 GridSearchCV 工具,优化算法模型的参数;
使用 Pipeline 管道机制进行流水线作业。因为在做分类之前,我们还需要一些准备过程,比如数据规范化,或者数据降维等。

构建随机森林分类器

在算法篇中,我主要讲了数据挖掘十大经典算法。实际工作中,你也可能会用到随机森林。
随机森林的英文是 Random Forest,英文简写是 RF。它实际上是一个包含多个决策树的分类器,每一个子分类器都是一棵 CART 分类回归树。所以随机森林既可以做分类,又可以做回归。当它做分类的时候,输出结果是每个子分类器的分类结果中最多的那个。你可以理解是每个分类器都做投票,取投票最多的那个结果。当它做回归的时候,输出结果是每棵 CART 树的回归结果的平均值。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • 柚子
    老师, 使用GridSearchCV 工具多次执行每次结果都不一样,是怎么判定最优分数就是0.9667,最优参数就是6呢?
    2019-03-13
    17
  • vortual
    老师,实际工作中数据量大的话跑个模型应该要不少时间,应该不允许这么去试所有参数和那么多算法吧?还有一个疑问是数据量超过一定量是不是要用深度学习了?希望老师能解惑下
    2019-03-13
    9
  • 西湖晨曦
    我是银行信用卡部的从业人员,也很喜欢数据分析。

    但是看了这个案例,感觉这个案例能够给信用卡的数据分析带来什么呢?我的意思是,能够分析出什么问题吗?银行信用卡部应该在持卡人用卡的什么阶段开始开始要采取措施防止诈骗?什么类型的客户容易诈骗?---感觉这个案例就是从数字到数字,没有能够给真实业务带来什么帮助。

    -----也想对从事数据分析的人员提个醒,数据分析不是从纯数字到纯数字的纯学术研究,应该是联系实际工作,能够给实际工作带来帮助的啊!联系到此案例,应该是能够给银行信用卡部的防欺诈工作带来提升的啊~分析了什么出来?银行的哪个环节应该提升以防止欺诈?

    作者回复: 用数据分析做分类预测,也就是遇到了其他的用户数据,通过模型进行分类预测,我们有多少准确率可以预测出来他是否是欺诈用户。

    2019-09-03
    1
    6
  • 跳跳
    1.对GridSearchCV的理解:就是在之前的经验的基础上选择了一些较好的取值备选,然后分别去试,得到一个好的性能。比直接选择参数多了一些保障,但是也增加一些计算负担。
    2.在老师代码的基础上添加了adaboost分类,使用adaboost默认的分类器,结果是在n_estimators=10的时候取得最优性能,准确率是0.8187
    GridSearch 最优参数: {'AdaBoostClassifier__n_estimators': 10}
    GridSearch 最优分数: 0.8187
     准确率 0.8129
    2019-03-13
    4
  • third
    提问:老是出现futureWarning,是什么情况

    GridSearch最优参数: {'n_estimators': 10}
    GridSearch最优分数: 0.8187
    准确率 0.8129
    2019-03-20
    1
    3
  • 王彬成
    GridSearch最优参数: {'n_estimators': 10}
    GridSearch最优分数: 0.8187
    准确率 0.8129
    -----代码------

    # -*- coding: utf-8 -*-
    # 信用卡违约率分析
    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.ensemble import AdaBoostClassifier

    from matplotlib import pyplot as plt
    import seaborn as sns
    # 数据加载
    data=data=pd.read_csv('./credit_default-master/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)


    #分类器
    ada=AdaBoostClassifier( random_state=1)
    #需要调整的参数
    parameters={'n_estimators':[10,50,100]}

    # 使用 GridSearchCV 进行参数调优
    clf=GridSearchCV(estimator=ada,param_grid=parameters,scoring = 'accuracy')

    clf.fit(train_x,train_y)
    print("GridSearch最优参数:", clf.best_params_)
    print("GridSearch最优分数: %0.4lf" %clf.best_score_)
    predict_y=clf.predict(test_x)
    print("准确率 %0.4lf" %accuracy_score(test_y, predict_y))
     


    2019-03-13
    3
  • 王彬成
    使用 Pipeline 管道机制的优势,参考资料:
    https://www.jianshu.com/p/9c2c8c8ef42d
    https://blog.csdn.net/qq_41598851/article/details/80957893

    个人理解:
    Pipeline是将数据处理流程的共同部分提取出来,简化代码。
    以本文最后的编程案例为例,共同部分是“数据规范化”和“使用数据分类算法”,将俩部分封装。
    在每一次循环“算法”时,pipeline里头完成算法更新。GridSearchCV引用固定的pipeline,实则算法已经更新了。这样减少了多余代码的书写。
    2019-03-13
    2
  • 王彬成
    ‘GridSearch最优分数’和‘预测数据准确率’是怎么理解的。以下我的理解对吗

    我理解是‘GridSearch最优分数’是从【训练数据】中得到的最优准确率。
    而‘预测数据准确率’是利用最优模型,分析【测试数据】得到的准确率。
    2019-03-13
    1
  • 白夜
    三万条,25个字段就要运算几分钟了,数据上亿。。。
    '''
    GridSearch最优参数: {'svc__C': 1, 'svc__gamma': 0.01}
    GridSearch最优分数: 0.8174
    准确率 0.8172
    68.59484457969666 s
    GridSearch最优参数: {'decisiontreeclassifier__max_depth': 6}
    GridSearch最优分数: 0.8186
    准确率 0.8113
    1.8460278511047363 s
    GridSearch最优参数: {'randomforestclassifier__n_estimators': 6}
    GridSearch最优分数: 0.7998
    准确率 0.7994
    2.297856330871582 s
    GridSearch最优参数: {'kneighborsclassifier__n_neighbors': 8}
    GridSearch最优分数: 0.8040
    准确率 0.8036
    154.36387968063354 s
    GridSearch最优参数: {'adaboostclassifier__n_estimators': 10}
    GridSearch最优分数: 0.8187
    准确率 0.8129
    13.483576774597168 s
    '''
    2019-03-13
    1
  • JingZ
    # 信用卡违约率分析
    KNN相比较而言,跑得最慢了点

    from sklearn.ensemble import AdaBoostClassifier

    # 构造各种分类器
    AdaBoostClassifier(random_state=1)

    # 分类器名称
    'adaboostclassifier'

    # 分类器参数
    {'adaboostclassifier__n_estimators': [10, 50, 100]}

    结果:

    GridSearch 最优分数:0.8187
    GridSearch 最优参数: {'adaboostclassifier__n_estimators': 10}
    准确率 0.8129
    2019-03-13
    1
  • Ronnyz
    # -*- coding:utf-8 -*-

    import pandas as pd

    from sklearn.model_selection import GridSearchCV,train_test_split

    from sklearn.preprocessing import StandardScaler

    from sklearn.pipeline import Pipeline

    from sklearn.datasets import load_iris

    from sklearn.metrics import accuracy_score

    from sklearn.ensemble import AdaBoostClassifier

    from matplotlib import pyplot as plt

    import seaborn as sns

    from warnings import simplefilter

    simplefilter(action='ignore',category=FutureWarning)



    #数据加载

    credits=pd.read_csv('CreditCard_data/UCI_Credit_Card.csv')

    #数据探索

    print(credits.shape)

    print(credits.describe()) #查看数据概览



    #特征选择,去掉ID字段

    credits.drop(['ID'],inplace=True,axis=1)

    target=credits['default.payment.next.month'].values

    columns=credits.columns.tolist()

    columns.remove('default.payment.next.month')

    features=credits[columns].values



    #分割数据,将30%作为测试集

    X_train,X_test,y_train,y_test=train_test_split(features,target,test_size=0.3,random_state=666)



    #构建分类器

    ada=AdaBoostClassifier()

    #使用网格搜索调整参数

    #参数设置

    parameters={

        'n_estimators':[10,50,100]

    }

    gscv=GridSearchCV(estimator=ada,param_grid=parameters,scoring='accuracy',n_jobs=-1)

    gscv.fit(X_train,y_train)

    print('GridSearch最优参数:',gscv.best_params_)

    print('GridSearch最优分数:%0.4lf' % gscv.best_score_)

    y_pred=gscv.predict(X_test)

    print('准确率:',accuracy_score(y_test,y_pred))



    GridSearch最优参数: {'n_estimators': 50}

    GridSearch最优分数:0.8197

    准确率: 0.8121111111111111
    2019-11-30
  • 一纸书
    勉勉强强看懂,但心知若让我在一片空白的python文件中,完全独立完成这个项目;我做不到;
    2019-11-22
  • 孟君
    老师,这个数据集是明显的unbalanced dedataset。 需要先进行balance处理吗?我以前处理lending club的dataset,发现经过convert to balance dataset之后,random forest的准确率高了不少
    2019-11-07
  • 许智鸿
    老师,参赛的范围划分有什么依据吗?还是说我下次遇到类似的题目,例如预测用户点击广告的概率,也可以直接套用您这套代码和参数氛围,然后得出最优的分类方案和参数取值?

    另外,如果字段过多,需要进行降纬处理吗?怎么处理?

    作者回复: 每个比赛除了算法模型,特征工程还是很重要的。是否进行降维,这个还是看业务场景,在比赛中有的时候不需要降维,有时候反而需要构造出来一些新的特征,目的是为了让结果更好。在工程中,可以采用降维方式,毕竟更少的维度可以让计算效率更高

    2019-11-04
  • 滨滨
    GridSearchCV本质是一种穷举法
    2019-04-28
    1
  • 旸老师,想请教几个问题:1.为何执行多次 最优分数是一定的 0.9667 但是最优参数,n_estimators 每次都不一样,这是什么原因?2.随机森林是不是正好与AdaBoost相反,都数据集成模式,一个是集成里的投票模式,一个是学习模式。这样理解正确吗?
    2019-04-24
  • Geek_dancer
    我发现:classifier_param_grid的keys必须严格按照'classifier_names'+'__'+'classifier_param_name'的格式来写
    2019-03-30
  • Destroy、
    ada = AdaBoostClassifier()
    parameters = {'adaboostclassifier__n_estimators': [10, 50, 100]}
    pipeline = Pipeline([
        ('scaler', StandardScaler()),
        ('adaboostclassifier', ada)
    ])
    clf = GridSearchCV(estimator=pipeline, param_grid=parameters)
    clf.fit(train_x, train_y)
    print('GridSearch最优参数:', clf.best_params_)
    print('GridSearch最优分数:%0.4lf' % clf.best_score_)
    predict_y = clf.predict(test_x)
    print('准确率%0.4lf' % accuracy_score(test_y, predict_y))

    GridSearch最优参数: {'adaboostclassifier__n_estimators': 10}
    GridSearch最优分数:0.8187
    准确率0.8129
    2019-03-18
  • Geek_2a6093
    这次get到了pipeline 和gridsearch真好,谢谢老师!老师下次能不能详细地介绍一下集成方法如Stacking,或者XgBoost这个库的特点呀?
    2019-03-13
  • 晨曦后浪
    使用GridSearchCV调参的时候,为什么设置了RandomForestClassifier的n_jobs=-1,运行多次,n_estimators的最优值为什么不一样?
    2019-03-13
收起评论
20
返回
顶部