金融风控训练营-Task02学习笔记

金融风控训练营-Task02

    • 一、学习知识点概要
    • 二、学习内容
      • 1. 学习目标
      • 2. 导入
      • 3. 读取
      • 4. 查看
        • 总体了解
        • 缺失值
        • 特征的数值类型、对象类型
        • 过滤数值型类别特征
        • 离散型变量
        • 变量分布可视化
        • 生成数据报告
    • 三、学习问题与解答
    • 四、学习思考与总结

本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampfr

一、学习知识点概要

  • 学习目标
  • 导入
  • 读取
  • 查看

二、学习内容

1. 学习目标

  • 总体了解数据
  • 读取数据集并了解数据集大小,原始特征维度;
  • 通过info熟悉数据类型;
  • 粗略查看数据集中各特征基本统计量;
  • 查看数据缺失值和唯一值特征情况
  • 查看数据类型
  • 特征和特征、特征和目标变量之间关系
  • 用pandas_profiling生成数据报告

2. 导入

导入相应的库

	import pandas as pd
	import numpy as np
	import matplotlib.pyplot as plt
	import seaborn as sns
	import datetime
	import warnings
	warnings.filterwarnings('ignore')

3. 读取

  • .read_csv(‘xx.csv’)
  • TSV与CSV的区别
    TSV是用制表符(Tab,’\t’)作为字段值的分隔符;
    CSV是用半角逗号(’,’)作为字段值的分隔符;
  • delimiter参数值默认为半角逗号,即默认将被处理文件视为CSV。当delimiter=’\t’时,被处理文件就是TSV。
  • 通过nrows参数,来设置读取文件的前多少行,nrows是一个大于等于0的整数。
  • chunksize参数(分块读取)
    data_train = pd.read_csv('train.csv')
    data_test_a = pd.read_csv('testA.csv')
    data_train_sample = pd.read_csv("train.csv",nrows=5)
    
    
    #设置chunksize参数,来控制每次迭代数据的大小
    i = 0  # 控制输出
    chunker = pd.read_csv("train.csv",chunksize=5)
    for item in chunker:
        print(type(item))
        #
        print(len(item))
        i+=1
        if i >= 4:   # 由于数据量过大,限制输出4条就跳出循环
            break
        #5
    


    5

    5

    5

    5

4. 查看

总体了解

查看数据集的样本个数和原始特征维度
data_test_a.shape  #返回(样本个数,原始特征维度)
data_train.shape   #返回(样本个数,原始特征维度)
data_train.columns  #返回所有列名

####总体粗略的查看数据集各个特征的一些基本统计量####

#通过info()来熟悉数据类型
data_train.info()   #返回所有信息

data_train.describe()   #返回一系列参数:count,mean,std,min,25%,50%,75%,max

#head()返回数据帧或序列的前n行(默认值为5)
#append()在列表末尾添加新的对象
#tail()与head()函数类似,默认是取最后五行
data_train.head(3).append(data_train.tail(3))

(200000, 46)
(800000, 47)
Index([‘id’, ‘loanAmnt’, ‘term’, ‘interestRate’, ‘installment’, ‘grade’,
‘subGrade’, ‘employmentTitle’, ‘employmentLength’, ‘homeOwnership’,
‘annualIncome’, ‘verificationStatus’, ‘issueDate’, ‘isDefault’,
‘purpose’, ‘postCode’, ‘regionCode’, ‘dti’, ‘delinquency_2years’,
‘ficoRangeLow’, ‘ficoRangeHigh’, ‘openAcc’, ‘pubRec’,
‘pubRecBankruptcies’, ‘revolBal’, ‘revolUtil’, ‘totalAcc’,
‘initialListStatus’, ‘applicationType’, ‘earliesCreditLine’, ‘title’,
‘policyCode’, ‘n0’, ‘n1’, ‘n2’, ‘n3’, ‘n4’, ‘n5’, ‘n6’, ‘n7’, ‘n8’,
‘n9’, ‘n10’, ‘n11’, ‘n12’, ‘n13’, ‘n14’],
dtype=‘object’)
金融风控训练营-Task02学习笔记_第1张图片
金融风控训练营-Task02学习笔记_第2张图片
金融风控训练营-Task02学习笔记_第3张图片

缺失值

#查看缺失值
print(f'There are {data_train.isnull().any().sum()} columns in train dataset with missing values.')

#查看缺失特征中缺失率大于50%的特征
have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()
fea_null_moreThanHalf = {
     }
for key,value in have_null_fea_dict.items():
    if value > 0.5:
        fea_null_moreThanHalf[key] = value

fea_null_moreThanHalf   #{}

#具体的查看缺失特征及缺失率

# nan可视化
#纵向比较:如果nan存在的过多,说明这一列对label的影响几乎不起作用了,可以考虑删掉。如果缺失值很小一般可以选择填充
#横向比较:如果在数据集中,某些样本数据的大部分列都是缺失的且样本足够的情况下可以考虑删除
missing = data_train.isnull().sum()/len(data_train)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()

#查看训练集测试集中特征属性只有一值的特征
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		#['policyCode']
one_value_fea_test  #['policyCode']
#‘policyCode’具有一个唯一值(或全部缺失)。有很多连续变量和一些分类变量
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.')

There are 22 columns in train dataset with missing values.

金融风控训练营-Task02学习笔记_第4张图片
There are 1 columns in train dataset with one unique value.
There are 1 columns in test dataset with one unique value.

特征的数值类型、对象类型

  • 特征一般都是由类别型特征和数值型特征组成,而数值型特征又分为连续型和离散型。
  • 类别型特征有时具有非数值关系,有时也具有数值关系。
  • 数值型特征本是可以直接入模的,从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
#DataFrame.select_dtypes(include=None, exclude=None)[source] 根据列dtypes返回DataFrame的列的子集。
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
numerical_fea

#filter函数配合匿名函数Lambda使用 
#filter(function, iterable)
#function – 函数名;
#iterable – 序列或者可迭代对象;
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))
category_fea

data_train.grade

[‘id’,
‘loanAmnt’,
‘term’,
‘interestRate’,
‘installment’,
‘employmentTitle’,
‘homeOwnership’,
‘annualIncome’,
‘verificationStatus’,
‘isDefault’,
‘purpose’,
‘postCode’,
‘regionCode’,
‘dti’,
‘delinquency_2years’,
‘ficoRangeLow’,
‘ficoRangeHigh’,
‘openAcc’,
‘pubRec’,
‘pubRecBankruptcies’,
‘revolBal’,
‘revolUtil’,
‘totalAcc’,
‘initialListStatus’,
‘applicationType’,
‘title’,
‘policyCode’,
‘n0’,
‘n1’,
‘n2’,
‘n3’,
‘n4’,
‘n5’,
‘n6’,
‘n7’,
‘n8’,
‘n9’,
‘n10’,
‘n11’,
‘n12’,
‘n13’,
‘n14’]

[‘grade’, ‘subGrade’, ‘employmentLength’, ‘issueDate’, ‘earliesCreditLine’]

0 | E
1 | D
2 | D
3 | A
4 | C

799995 | C
799996 | A
799997 | C
799998 | A
799999 |B
Name: grade, Length: 800000, dtype: object

过滤数值型类别特征

#过滤数值型类别特征
def get_numerical_serial_fea(data,feas):
    numerical_serial_fea = []
    numerical_noserial_fea = []
    for fea in feas:
        temp = data[fea].nunique()
        if temp <= 10:
            numerical_noserial_fea.append(fea)
            continue
        numerical_serial_fea.append(fea)
    return numerical_serial_fea,numerical_noserial_fea
numerical_serial_fea,numerical_noserial_fea = get_numerical_serial_fea(data_train,numerical_fea)
numerical_serial_fea

numerical_noserial_fea

[‘id’,
‘loanAmnt’,
‘interestRate’,
‘installment’,
‘employmentTitle’,
‘annualIncome’,
‘purpose’,
‘postCode’,
‘regionCode’,
‘dti’,
‘delinquency_2years’,
‘ficoRangeLow’,
‘ficoRangeHigh’,
‘openAcc’,
‘pubRec’,
‘pubRecBankruptcies’,
‘revolBal’,
‘revolUtil’,
‘totalAcc’,
‘title’,
‘n0’,
‘n1’,
‘n2’,
‘n3’,
‘n4’,
‘n5’,
‘n6’,
‘n7’,
‘n8’,
‘n9’,
‘n10’,
‘n13’,
‘n14’]

[‘term’,
‘homeOwnership’,
‘verificationStatus’,
‘isDefault’,
‘initialListStatus’,
‘applicationType’,
‘policyCode’,
‘n11’,
‘n12’]

离散型变量

data_train['term'].value_counts()
#3    606902
#5    193098
#Name: term, dtype: int64

data_train['policyCode'].value_counts()#离散型变量,无用,全部一个值
#1.0    800000
#Name: policyCode, dtype: int64

data_train['n11'].value_counts()#离散型变量,相差悬殊,用不用再分析
#0.0    729682
#1.0       540
#2.0        24
#4.0         1
#3.0         1
#Name: n11, dtype: int64

#每个数字特征得分布可视化
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")

金融风控训练营-Task02学习笔记_第5张图片

变量分布可视化

plt.figure(figsize=(8, 8))
sns.barplot(data_train["employmentLength"].value_counts(dropna=False)[:20],
            data_train["employmentLength"].value_counts(dropna=False).keys()[:20])
plt.show()

金融风控训练营-Task02学习笔记_第6张图片

生成数据报告

import pandas_profiling
pfr = pandas_profiling.ProfileReport(data_train)
pfr.to_file("./example.html")

……

三、学习问题与解答

  • 疑:下面代码是如何将数据转化成图?
#每个数字特征得分布可视化
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")
  • 答:主要是FacetGrid()的作用
    melt()参考:Pandas_规整数据_转换数据_melt()
    FacetGrid()参考:Python 数据分析之seaborn.FacetGrid
    map()参考:Python map() 函数
  • ……

四、学习思考与总结

Task02主要是了解和熟悉数据,为后续的特征工程做准备。EDA价值主要在于熟悉了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接下来的机器学习或者深度学习建模。将数据可视化这个真的很好用,虽然时间有点长,但最后得到的图对分析也有帮助。接下来,还需要多练习,多实践,争取一个好成绩!

部分引用:https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.20850282.J_3678908510.4.17b44d57jNsj4J&postId=170949

你可能感兴趣的:(python)