数据来源:https://www.kaggle.com/ethon0426/lending-club-20072020q1
kaggle相关文章:https://www.kaggle.com/ethon0426/lending-club-20072020q1/code
为了聚焦,每个阶段拆开展示。让大家了解全过程。本文是自己对分类、预测精确理解后,进行组件化、自动化形成的最终结果。
在kaggle上我将LC相关的文章,全部阅读了一遍。并仔细读了每篇文章的过程。作者的思路大多雷同,但做得很精细。很多都没有最终结果。我上次做LC分析,模型精确度也就60%左右,本文章的精细程度到每句代码。内含特征分析、值分布、决策树、k-means聚类、分箱、平滑、样本均衡等点,并附带具体可视化分析,最终形成A卡评分模型。使用逻辑回归、随机森林、Xgboost、ANN、LightGBM等模型。首次模型计算精准度98.3%以上。
按章节提供,代码中保护最全的标准。每阶段代码不做删除。 全文实现按年提取。相对配置固化、分阶段输出隔离,支持按阶段进行重复进行。
前提:
本文python3.9.5 兼容M1。conda+pip3管理依赖
# -*- encoding: utf-8 -*-
"""
@File : s_lc.py(通过逻辑回归、随机森林、LightGBM、XGBoost、ANNs进行A卡分析,输出模型以及评分表)
@Contact : lousugang@126.com
@License : (C)Copyright 2018-2021
@Modify Time @Author @Version @Desciption
------------ ------- -------- -----------
2021/11/19 22:31 sugang.lou 1.0 Lending Club Data Model
"""
# lib库参考ReadMe.md,按基本库、第三库、自有库三部分引入
import time
import warnings
from datetime import datetime
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import hvplot.pandas # https://hvplot.holoviz.org/
import pydotplus # 依赖Graphviz,用于dot解析树文件
import statsmodels.api as sm
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression # 逻辑回归
from sklearn.metrics import roc_auc_score, roc_curve, accuracy_score
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split # 测试集与训练集划分
from sklearn.pipeline import Pipeline # 详解Pipline(内含):https://blog.csdn.net/SanyHo/article/details/105472795
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder, \
StandardScaler # MinMaxScaler归一化:https://blog.csdn.net/GentleCP/article/details/109333753
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import xgboost as xgb
from lightgbm import LGBMClassifier # image not found报错解决:https://blog.51cto.com/mapengfei/2476367
import o_lc
import ofun.o_ml as o_ml
import ofun.o_utils as o_utils
warnings.filterwarnings('ignore')
np, plt, pd = o_ml.init(np, plt, pd) # 初始化numpy matplotlib panda设置
base_dir = o_utils.get_base_dir("lc") # 根目录
'''Credit_Risk_Analysis(Lending Club Data)-分阶
loadFile:数据装载
dataAudit:数据画像
dataClrAndPre:数据预处理,需要重建索引rest_index,并排序sort_values
modelPrepare: 建模准备
genModel: 建模
genModelExt: 建模扩展
ps:pycharm测试时,为降低flask的影响,可临时关闭flaskConsole启动窗口,去除环境变量的初始化报错。
'''
print("课题分析:构造传统信贷申请评分卡(A卡)")
# 阶段控制 stage = ['loadFile','dataAudit','dataClrAndPre','modelPrepare','genModel','genModelExt'] dataClrAndPre支持重复处理
stage = ['genModel'] # 支持按步进行,也支持连续执行
disk_file = base_dir + 'LCDataDictionary.xlsx' # 装载列名字典
data_disc = o_ml.get_dic_excel(disk_file, 'LoanStats', 'LoanStatNew', 'LoanStatNew_trans')
loan_excel = base_dir + 'Loan_status_2007-2020Q3.gzip'
start_point, end_point = 2019, 2020 # 数据使用范围-时间过滤
file_tag = str(start_point) + "-" + str(end_point)
file = base_dir + "lc_%s.pkl" % file_tag
file_lcs = base_dir + "lc_filter_%s.pkl" % file_tag
file_sample_x = base_dir + "x_%s.pkl" % file_tag
file_sample_y = base_dir + "y_%s.pkl" % file_tag
df, df_lcs, sample_x, sample_y = o_lc.get_df_list(file, file_lcs, file_sample_x, file_sample_y)
if 'loadFile' in stage:
print("一、数据筛选")
start_time = time.time() # ps:关于dataframe用法(https://pandas.pydata.org/docs/reference/frame.html)
data = pd.read_csv(loan_excel, low_memory=False, error_bad_lines=False) # error_bad_lines删除行列不对齐的数据,usecols可过滤指定列
print("装载:")
print(data.info()) # 数据整体情况(行列及数据类型、内存)
# o_ml.see_detail(data,'issue_d') # 检查列的值分布及具体值例子
data = data[data['issue_d'].str.contains('-20', na=False)] # issue_d含有非标准日期格式,去除数字干扰
dt_series = pd.to_datetime(data['issue_d'], format="%b-%Y") # 将 ‘issue_d’ str形式的时间日期转换iso8601
data['year'] = dt_series.dt.year
df = data[(data[u'year'] >= start_point) & (data[u'year'] <= end_point)] # 时间过滤df.issue_d.isin([2020, 2019, 2018])
print("过滤结果:{}".format(file_tag))
# o_utils.see_detail(data,'loan_status')
# loan_condition为数据分析/画像等报表使用,更容易理解;loan_condition_int为后续建模和数据计算使用
df.loc[:, 'loan_condition'] = df['loan_status'].apply(o_lc.loan_condition) # apply/map/lambda/df转数组方式 三种替换列值的方式
df.loc[:, 'loan_condition_int'] = df['loan_condition'].map(o_lc.loan_condition_map).astype(int) # map替换方式
o_ml.see_detail(df, 'loan_condition_int') # 检查列的值分布及具体值例子
df.reset_index(drop=True) # 刷新索引
# print(df.head(2)) # tail为后几行数据
# print(df.describe().T) #追加各列类型、首行值、空值/空值率、同值率、值分组 pd.concat索引匹配
print(df.info())
df.to_pickle(file)
end_time = time.time()
print("loadFile 耗时: {:.2f}秒".format(end_time - start_time))