本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampfr
一、学习知识点概要
读取文件
特征的一些具体信息
特征缺失值,唯一值(可视化)
特征数据类型和对象类型
数值型变量
非数值型变量分析
figure()
变量分布可视化
时间格式化数据处理及查看
用pandas_profiling生成数据报告
二、学习内容
1.读取文件
读取文件的部分内容:
#通过nrows参数,来设置读取文件的前多少行,nrows是一个大于等于0的整数。
data_train_sample = pd.read_csv("train.csv",nrows=5)
#分块读取
chunker = pd.read_csv("train.csv",chunksize=5)
2.特征的一些具体信息
(1)查看数据集的样本个数和原始特征维度
data_test_a.shape
data_train.shape
data_train.columns
data_train.head(3).append(data_train.tail(3))
#将前三行与尾三行拼在一起
(2)查看数据集各个特征的一些基本统计量
data_train.describe()
data_train.head(3).append(data_train.tail(3))
#将前三行与尾三行拼在一起
(3)特征的具体含义
-
id 为贷款清单分配的唯一信用证标识
-
loanAmnt 贷款金额
-
term 贷款期限(year)
-
interestRate 贷款利率
-
installment 分期付款金额
-
grade 贷款等级
-
subGrade 贷款等级之子级
-
employmentTitle 就业职称
-
employmentLength 就业年限(年)
-
homeOwnership 借款人在登记时提供的房屋所有权状况
-
annualIncome 年收入
-
verificationStatus 验证状态
-
issueDate 贷款发放的月份
-
purpose 借款人在贷款申请时的贷款用途类别
-
postCode 借款人在贷款申请中提供的邮政编码的前3位数字
-
regionCode 地区编码
-
dti 债务收入比
-
delinquency_2years 借款人过去2年信用档案中逾期30天以上的违约事件数
-
ficoRangeLow 借款人在贷款发放时的fico所属的下限范围
-
ficoRangeHigh 借款人在贷款发放时的fico所属的上限范围
-
openAcc 借款人信用档案中未结信用额度的数量
-
pubRec 贬损公共记录的数量
-
pubRecBankruptcies 公开记录清除的数量
-
revolBal 信贷周转余额合计
-
revolUtil 循环额度利用率,或借款人使用的相对于所有可用循环信贷的信贷金额
-
totalAcc 借款人信用档案中当前的信用额度总数
-
initialListStatus 贷款的初始列表状态
-
applicationType 表明贷款是个人申请还是与两个共同借款人的联合申请
-
earliesCreditLine 借款人最早报告的信用额度开立的月份
-
title 借款人提供的贷款名称
-
policyCode 公开可用的策略_代码=1新产品不公开可用的策略_代码=2
-
n系列匿名特征 匿名特征n0-n14,为一些贷款人行为计数特征的处理
3.特征数据类型和对象类型
-
特征一般都是由类别型特征和数值型特征组成,而数值型特征又分为连续型和离散型。
-
类别型特征有时具有非数值关系,有时也具有数值关系。比如‘grade’中的等级A,B,C等,是否只是单纯的分类,还是A优于其他要结合业务判断。
-
数值型特征本是可以直接入模的,但往往风控人员要对其做分箱,转化为WOE编码进而做标准评分卡等操作。从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
4.特征缺失值,唯一值(可视化)
(1)查看缺失值,解读print(f' ')
print(f'There are {data_train.isnull().any().sum()} columns in train dataset with missing values.')
#加f后可以在字符串里面使用用花括号括起来的变量和表达式,如果字符串里面没有表达式,那么前面加不加f输出应该都一样
#formatted string literals, 以 f 开头,包含的{}表达式在程序运行时会被表达式的值代替。
(2)缺失特征和缺失率的具体查看
# nan可视化
missing = data_train.isnull().sum()/len(data_train)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
-
纵向了解哪些列存在 “nan”, 并可以把nan的个数打印,主要的目的在于查看某一列nan存在的个数是否真的很大,如果nan存在过多,说明这一列对label的影响几乎不起作用了,可以考虑删除。如果缺失值很小一般可以选择填充。
-
横向比较,如果在数据集中,某些样本数据的大部分列都是缺失的且样本足够的情况下可以考虑删除。
(3)查看训练集测试集中特征属性只有一值的特征
one_value_fea = [col for col in data_train.columns if data_train[col].nunique() <= 1]
one_value_fea_test = [col for col in data_test_a.columns if data_test_a[col].nunique() <= 1]
one_value_fea
one_value_fea_test
print(f'There are {len(one_value_fea)} columns in train dataset with one unique value.')
print(f'There are {len(one_value_fea_test)} columns in test dataset with one unique value.')
5.数值型变量
(1)离散型变量分析
numerical_noserial_fea#寻找离散型变量
data_train['policyCode'].value_counts()#离散型变量,无用,全部一个值
data_train['n11'].value_counts()#离散型变量,相差悬殊,用不用再分析
(2)连续型变量分析
-
查看某一个数值型变量的分布,查看变量是否符合正态分布,如果不符合正太分布的变量可以log化后再观察下是否符合正态分布。
-
如果想统一处理一批数据变标准化 必须把这些之前已经正态化的数据提出
-
正态化的原因:一些情况下正态非正态可以让模型更快的收敛,一些模型要求数据正态(eg. GMM、KNN),保证数据不要过偏态即可,过于偏态可能会影响模型预测结果。
#每个数字特征得分布可视化
f = pd.melt(data_train, value_vars=numerical_serial_fea)
g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False)
g = g.map(sns.distplot, "value")
6.非数值型变量分析
category_fea #寻找非数据型变量
https://blog.csdn.net/chengyu0726/article/details/106151560
7.figure()
figure( num, figsize, dpi, edgecolor, facecolor,frameon=True/false)
分别对应:编号或名称;尺寸;分辨率;边框颜色;背景颜色;是否显示边框
8.变量分布可视化
(1)单一变量分布可视化
(2)根据y值不同可视化x某个特征的分布
-
首先查看类别型变量在不同y值上的分布
train_loan_fr = data_train.loc[data_train['isDefault'] == 1] train_loan_nofr = data_train.loc[data_train['isDefault'] == 0] fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 8)) train_loan_fr.groupby('grade')['grade'].count().plot(kind='barh', ax=ax1, title='Count of grade fraud') train_loan_nofr.groupby('grade')['grade'].count().plot(kind='barh', ax=ax2, title='Count of grade non-fraud') train_loan_fr.groupby('employmentLength')['employmentLength'].count().plot(kind='barh', ax=ax3, title='Count of employmentLength fraud') train_loan_nofr.groupby('employmentLength')['employmentLength'].count().plot(kind='barh', ax=ax4, title='Count of employmentLength non-fraud') plt.show()
groupby():根据一个或多个键拆分pandas对象,计算分组摘要统计,如计数、平均值、标准差或用户自定义函数https://blog.csdn.net/MsSpark/article/details/84192421 (其中详细讲解了函数的用法与代码)
-
其次查看连续型变量在不同y值上的分布
9.时间格式化数据处理及查看
# issueDateDT特征表示数据日期离数据集中日期最早的日期(2007-06-01)的天数
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
#将字符串格式转化为日期格式
10.用pandas_profiling生成数据报告
import pandas_profiling
pfr = pandas_profiling.ProfileReport(data_train)
pfr.to_file("./example.html")
三、学习问题与解决
读取文件的具体方法
with open('data.csv', 'r') as f:
reader = csv.reader(f) #使用reader()创建一个对象,csv.reader()读取结果为列表
#获取每一行
print(type(reader))
for row in reader: #遍历每一行
print(row)
#获取某一行/某一列
c=list(reader)
print(c[k]) #读取第k+1行的内容
for i in reader:
print(i[k])
四、学习思考与总结
这一节更多的是利用代码解决数据数据处理的问题,之前对代码有一些恐惧,所以总是下意识的避开代码,但是逼自己静下来慢慢的理解它,发现还是有挺多有趣的函数与算法,看懂函数的调用方法,不会的要学会自己寻找资源解决,办法总是比问题多的。