kaggle原案例
目标:为了确保贷款的安全性,需要对客户的信用或者还款能力进行评估

数据导入并预览

import pandas as pd
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/1363/HomeCredit.csv")
df.head()df.describe()
df.shape
df.columns

数据可视化分析

查看贷款金额的分布情况

import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
%matplotlib inlineplt.figure(figsize=(12, 5))
plt.title("Distribution of AMT_CREDIT")
ax = sns.distplot(df["AMT_CREDIT"])  # 画出数据分布图#同样的,查看收入情况的分布情况
plt.figure(figsize=(12, 5))
plt.title("Distribution of AMT_INCOME_TOTAL")
# 画出数据分布图
ax = sns.distplot(df["AMT_INCOME_TOTAL"].dropna())#如果贷款的对象是货物的话,看一下这些货物的价格分布。
plt.figure(figsize=(12,5))
plt.title('Distribution of AMT_GOODS_PRICE')
ax = sns.distplot(df['AMT_GOODS_PRICE'].dropna())
import plotly.offline as offline
import plotly.graph_objs as go
import plotly.offline as py
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
offline.init_notebook_mode()

查看陪同人员情况

temp = df["NAME_TYPE_SUITE"].value_counts()
# 画出柱状图
trace = [go.Bar(x=temp.index, y=(temp / temp.sum())*100,)]
# 设置图的字体颜色等
layout = go.Layout(title="Who accompanied client when applying for the  application in % ",xaxis=dict(title='Name of type of the Suite',tickfont=dict(size=14, color='rgb(107, 107, 107)')),yaxis=dict(title='Count of Name of type of the Suite in %',titlefont=dict(size=16, color='rgb(107, 107, 107)'),tickfont=dict(size=14, color='rgb(107, 107, 107)'))
)fig = go.Figure(data=trace, layout=layout)
iplot(fig, filename='schoolStateNames')
#结论:几乎 80% 的人都没有人陪同。而只有少部分人有家人或合伙人陪同

申请人的还款能力

temp = df["TARGET"].value_counts()
# 画出饼状图
trace = [go.Pie(labels=temp.index, values=temp.values)]
# 设置图题
layout = go.Layout(title='Loan Repayed or not',
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#有超过 90% 的人没有还款能力

查看还款类型,做环形图
查看贷款类型

temp = df["NAME_CONTRACT_TYPE"].value_counts()
# 画出饼状图
trace = [go.Pie(labels=temp.index, values=temp.values, hole=0.6)]
# 设置图题
layout = go.Layout(title='Types of loan',
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#Revolving loan 表示周期性贷款,类似于分期贷款。 Cash loans 贷款表示现金贷款。
#由上图可知,有超过 90% 的人申请的贷款为现金贷款。

查看申请人贷款的目的

temp1 = df["FLAG_OWN_CAR"].value_counts()
temp2 = df["FLAG_OWN_REALTY"].value_counts()
# 画出饼状图
trace = [go.Pie(labels=temp1.index, values=temp1.values, domain={"x": [0, .48]}, hole=0.6),go.Pie(labels=temp2.index, values=temp2.values, domain={"x": [0.5, 1]}, hole=0.6)]
# 设置图中的字体,图题等
layout = go.Layout(title='Purpose of loan',annotations=[{"font": {"size": 20},"showarrow": False,"text": "Own Car","x": 0.15,"y": 0.5},{"font": {"size": 20},"showarrow": False,"text": "Own Realty","x": 0.85,"y": 0.5}])
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#有接近 34% 的人贷款的钱要花在车上, 30% 的人要花在物业上。

查看申请人的收入来源。

temp = df["NAME_INCOME_TYPE"].value_counts()
# 画出饼状图
trace = [go.Pie(labels=temp.index, values=temp.values, hole=0.4)]
# 设置图题
layout = go.Layout(title='Income sources of Applicant',
)
# 画出图题
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#52.1% 的人收入来源于工作,有 23.5% 的人收入来源于商业合作,有 18% 的申请者的收入主要来自于养老金。

查看申请人的婚姻状况

temp = df["NAME_FAMILY_STATUS"].value_counts()
# 画出饼状图
trace = [go.Pie(labels=temp.index, values=temp.values)]
# 设置图题
layout = go.Layout(title='Family Status of Applicant',
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#结论:有 63.7% 的申请都是已婚的,有 14.7% 为单身或未婚

查看申请者的职业

temp = df["OCCUPATION_TYPE"].value_counts()
# 画出柱状图
trace = [go.Bar(x=temp.index, y=temp.values)]
# 设置图题
layout = go.Layout(title='Occupation of Applicant',
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#结论:从图可以看到,人数最多的职业为工人,其次是销售员等

查看一下申请人的受教育情况

temp = df["NAME_EDUCATION_TYPE"].value_counts()
# 画出饼状图
trace = [go.Pie(labels=temp.index, values=temp.values, hole=0.5)]
# 设置图题
layout = go.Layout(title='Education of Applicant',
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#有 71.5% 的人为中等学历,24% 的人为高等学历

看这些申请人的房子类型

temp = df["NAME_HOUSING_TYPE"].value_counts()
# 画出饼状图
trace = [go.Pie(labels=temp.index, values=temp.values)]
# 设置图题
layout = go.Layout(title='Loan Repayed or not',
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#有 88.7% 的申请者有自己的房子或住在公寓,有 4.54% 的人跟父母一起住

上面通过可视化来观察数据集中一些基本的信息

import numpy as np
temp = df["NAME_INCOME_TYPE"].value_counts()temp_y0 = []  # 没有偿还能力
temp_y1 = []  # 有偿还能力
for val in temp.index:temp_y1.append(np.sum(df["TARGET"][df["NAME_INCOME_TYPE"] == val] == 1))temp_y0.append(np.sum(df["TARGET"][df["NAME_INCOME_TYPE"] == val] == 0))
temp_y1 = np.array(temp_y1)
temp_y0 = np.array(temp_y0)
# 画出柱状图
trace = [go.Bar(x=temp.index, y=(temp_y1 / temp.sum()) * 100, name='YES'),go.Bar(x=temp.index, y=(temp_y0 / temp.sum()) * 100, name='NO'),go.Bar(x=temp.index, y=(temp_y1 / (temp_y0+temp_y1)) * 100, name='RATE'),]
# 设置图题,字体等
layout = go.Layout(title="Income sources of Applicant's in terms of loan is repayed or not  in %",xaxis=dict(title='Income source', tickfont=dict(size=14, color='rgb(107, 107, 107)')),yaxis=dict(title='Count in %', titlefont=dict(size=16, color='rgb(107, 107, 107)'),tickfont=dict(size=14, color='rgb(107, 107, 107)'))
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#YES 表示有偿还能力,NO 表示无偿还能力,RATE 表示在该取值中有偿还能力所占的比例,例如,在 Working 中,RATE 的取值越高表示当一个人的收入来源于 Working 时,该人有很大的可能有偿还能力

婚姻状况与是否有偿还能力的关系

temp = df["NAME_FAMILY_STATUS"].value_counts()
temp_y0 = []  # 没有偿还能力
temp_y1 = []  # 有偿还能力
for val in temp.index:temp_y1.append(np.sum(df["TARGET"][df["NAME_FAMILY_STATUS"] == val] == 1))temp_y0.append(np.sum(df["TARGET"][df["NAME_FAMILY_STATUS"] == val] == 0))
temp_y1 = np.array(temp_y1)
temp_y0 = np.array(temp_y0)
# 画出柱状图
trace = [go.Bar(x=temp.index, y=(temp_y1 / temp.sum()) * 100, name='YES'),go.Bar(x=temp.index, y=(temp_y0 / temp.sum()) * 100, name='NO'),go.Bar(x=temp.index, y=(temp_y1 / (temp_y0+temp_y1)) * 100, name='RATE')]
# 设置字体、图题等
layout = go.Layout(title="Family Status of Applicant's in terms of loan is repayed or not in %",xaxis=dict(title='Family Status', tickfont=dict(size=14, color='rgb(107, 107, 107)')),yaxis=dict(title='Count in %', titlefont=dict(size=16, color='rgb(107, 107, 107)'),tickfont=dict(size=14, color='rgb(107, 107, 107)')))
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#偿还能力似乎与婚姻状况无关

同样的,看申请者职业与偿还能力的关系

temp = df["OCCUPATION_TYPE"].value_counts()temp_y0 = []  # 没有偿还能力
temp_y1 = []  # 有偿还能力
for val in temp.index:temp_y1.append(np.sum(df["TARGET"][df["OCCUPATION_TYPE"] == val] == 1))temp_y0.append(np.sum(df["TARGET"][df["OCCUPATION_TYPE"] == val] == 0))
temp_y1 = np.array(temp_y1)
temp_y0 = np.array(temp_y0)
# 画出柱状图
trace = [go.Bar(x=temp.index, y=(temp_y1 / temp.sum()) * 100, name='YES'),go.Bar(x=temp.index, y=(temp_y0 / temp.sum()) * 100, name='NO'),go.Bar(x=temp.index, y=(temp_y1 / (temp_y0+temp_y1)) * 100, name='RATE'),]
# 设置图题、字体等
layout = go.Layout(title="Occupation of Applicant's in terms of loan is repayed or not in %",width=1000,xaxis=dict(title='Occupation of Applicant\'s',tickfont=dict(size=14, color='rgb(107, 107, 107)')),yaxis=dict(title='Count in %', titlefont=dict(size=16, color='rgb(107, 107, 107)'),tickfont=dict(size=14, color='rgb(107, 107, 107)'))
)
# 显示图形
fig = go.Figure(data=trace, layout=layout)
iplot(fig)
#由图可知,像管理员、核心员工等这些职业的偿还能力都较低,而像工人、驾驶司机等职业要高一点。

预测模型

删除掉存在缺失值的特征列

df_drop = df.dropna(axis=1)
df_drop.head()

编码特征

from sklearn import preprocessing
# 取出非数值的列
categorical_feats = [f for f in df_drop.columns if df_drop[f].dtype == 'object'
]
# 对非数值的列进行编码
for col in categorical_feats:lb = preprocessing.LabelEncoder()lb.fit(list(df_drop[col].values.astype('str')))df_drop[col] = lb.transform(list(df_drop[col].values.astype('str')))
#查看编码结果
df_drop.head()

划分数据

#SK_ID_CURR 列为顾客的 ID ,因此要将此列删除掉
df_drop1 = df_drop.drop('SK_ID_CURR',axis=1)#提取训练特征数据和目标值。这里的目标值就是申请者的偿还能力,在数据集中为 TARGET 列。
data_X = df_drop1.drop("TARGET", axis=1)
data_y = df_drop1['TARGET']

划分数据集为训练数据集和测试数据集。因为数据集较大,只取了 20% 的数据来作为训练集。

from sklearn import model_selectiontrain_x, test_x, train_y, test_y = model_selection.train_test_split(data_X.values,data_y.values,test_size=0.8,random_state=0)

随机森林

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()  # 构建模型
model.fit(train_x, train_y)  # 训练模型
#测试一下模型的准确率
from sklearn import metrics
y_pred = model.predict(test_x)  # 预测测试集
metrics.accuracy_score(y_pred, test_y)  # 评价预测结果
#使用 sklaern 提供的分类报告方法来得到一个全面的评估
print(metrics.classification_report(y_pred, test_y))#分析特征的重要性
features = data_X.columns.values  # 取出数据集中的列名,即特征名
# 得到特征与其重要性
x, y = (list(x) for x in zip(*sorted(zip(model.feature_importances_, features),reverse=False)))
# 画出柱状图
trace2 = go.Bar(x=x, y=y, marker=dict(color=x, colorscale='Viridis', reversescale=True),name='Random Forest Feature importance', orientation='h',)
# 设置图题、字体等
layout = dict(title='Barplot of Feature importances', width=900, height=2000,yaxis=dict(showgrid=False, showline=False, showticklabels=True,), margin=dict(l=300,))
# 显示图形
fig1 = go.Figure(data=[trace2])
fig1['layout'].update(layout)
iplot(fig1, filename='plots')

使用多种方法来预测模型

from sklearn.tree import DecisionTreeClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression# 构建 7 种算法
models = [LogisticRegression(solver='lbfgs'),       # 逻辑回归RandomForestClassifier(n_estimators=100),  # 随机森林DecisionTreeClassifier(),                 # 决策树MLPClassifier(max_iter=100),              # 多层感知机AdaBoostClassifier(),                     # 自适应梯度提升BaggingClassifier(),                      # 装袋算法GradientBoostingClassifier()]             # 梯度提升算法model_name = ['LogisticRegression','RandomForestClassifier',"DecisionTreeClassifier",'MLPClassifier','AdaBoostClassifier','BaggingClassifier','GradientBoostingClassifier']acc = []        # 存放各算法的准确率
f1 = []         # 存放各算法的 f1 值
recall = []     # 存放各算法的召回率for model in models:  # 训练每个算法model.fit(train_x, train_y)acc.append(model.score(test_x, test_y))y_pred = model.predict(test_x)f1.append(metrics.f1_score(y_pred, test_y))recall.append(metrics.recall_score(y_pred, test_y))# 打印每种算法的评估结果
pd.DataFrame({"name": model_name, "acc": acc, "f1": f1, "recall": recall})
#除了决策树分类(DecisionTreeClassifier)和感知机分类(MLPClassifier)之外,大部分算法的准确率均超过了 90% 。

信贷违约风险评估预测-kaggle项目相关推荐

  1. 游戏最终排名预测--kaggle项目笔记

    原项目链接 导入数据 #安装需要的 statsmodels 包. #!pip install statsmodels==0.9.0 import pandas as pddf = pd.read_cs ...

  2. 波士顿房价预测----Kaggle项目python项目

    主要来源 Kaggle 上的一个入门挑战 房价预测 房价预测 https://www.kaggle.com/c/house-prices-advanced-regression-techniques ...

  3. 电影票房预测-kaggle项目Python项目

    研究问题:如何根据电影上映前的一些信息来预测出该电影的票房. 数据来源 数据主要是电影数据库中的 7000 多部过去电影的元数据.提供的数据信息包括演员,工作人员,情节关键词,预算,海报,发布日期,语 ...

  4. 数据挖掘实战:个人信贷违约预测

    大家好,我是东哥.本次分享一个数据挖掘实战项目:个人信贷违约预测,此项目对于想要学习信贷风控模型的同学非常有帮助,本文首发于公众号:Python数据科学,作者云朵君. 一.个人征信预测模型 1.项目背 ...

  5. 数据分享|WEKA用决策树、随机森林、支持向量机SVM、朴素贝叶斯、逻辑回归信贷违约预测报告

    作者:Nuo Liu 数据变得越来越重要,其核心应用"预测"也成为互联网行业以及产业变革的重要力量.近年来网络 P2P借贷发展形势迅猛,一方面普通用户可以更加灵活.便快捷地获得中小 ...

  6. 天池比赛-01-用随机森林进行信贷违约预测-Baseline

      这篇文章构建了信贷违约预测数据挖掘项目的一个baseline,这个项目来源于天池数据科学大赛,是一个二分类问题.   赛题链接:https://tianchi.aliyun.com/competi ...

  7. Kaggle 自行车租赁预测比赛项目实现

    作者:大树 更新时间:01.20 email:59888745@qq.com 数据处理,机器学习 回主目录:2017 年学习记录和总结 In [ ]: Kaggle上有很多有意思的项目,大家得空可以试 ...

  8. Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付

    全文链接:http://tecdat.cn/?p=26184 在此数据集中,我们必须预测信贷的违约支付,并找出哪些变量是违约支付的最强预测因子?以及不同人口统计学变量的类别,拖欠还款的概率如何变化?( ...

  9. 【python】kaggle项目之纽约出租车行程时间预测

    一.项目背景 (1)Kaggle项目,用于预测出租车出行的总时间. (2)根据已有数据,抽提出更多有用特征,提升预测的准确性. (3)依据探索出来的特征数据,探索性的发现纽约出租车的订单数量变化情况以 ...

最新文章

  1. 贴现率 vs 折现率
  2. smc数显压力表设定方法_压力控制器工作原理与设定方法
  3. protobuf简单序列化反序列化示例
  4. 驰骋工作流引擎设计系列10时效考核规则设计
  5. 用汇编的眼光看C++(之class构造、析构)
  6. 使用Chrome快速实现数据的抓取(三)——JQuery
  7. adalm pluto_Apache Pluto和Velocity集成教程示例
  8. 投资银行业务法规汇编----仅供学习
  9. 【信号处理】脉搏信号处理系统含Matlab源码
  10. Xshell和Xftp使用教程
  11. vue 使用 el-table 添加搜索框 实现简单搜索功能 ,同时判断输入是否为空
  12. IT十年人生过客-二十四-转型互联网
  13. MCU_如何通过硬件VID 查找生产厂家
  14. 机器学习——低秩矩阵分解中低秩的意义、矩阵填补、交叉验证
  15. “RTOS:实时应用的操作系统”
  16. 基于微信小程序的电影院购票平台
  17. 自定义控件从入门到轻生之---解锁新姿势
  18. 如何在WordPress侧边栏小部件中显示最新的Pinterest引脚
  19. 蓝桥杯官网python组基础练习-基础1-5
  20. SQL 开发应有的一种思维

热门文章

  1. 6-1 类模板Point的定义与使用 (10 分)
  2. CCS中的IER和IFR寄存器:Symbol ‘IER‘ could not be resolved
  3. DSP2833x_Device.h头文件中关于extern cregister volatile unsigned int IFR的解释
  4. 小波分析:db小波的分解与重构
  5. WubaRN hermes调研-基于混合工程的改造方案
  6. mac系统下.../Users/***Library/为什么进入Finder找不到Library目录?
  7. 怎样知道别人的WiFi密码?
  8. 名人热议新iPhone:5S中规中矩5C莫名其妙
  9. android wi-fi框架,Android Wi-Fi 网络选择
  10. 20分钟搭建个人网站重置版3.0