本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampfr
EDA价值主要在于熟悉了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接下来的机器学习或者深度学习建模.
了解变量间的相互关系、变量与预测值之间的存在关系。
为特征工程做准备
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #基于matplotlib的图形可视化包
import datetime #处理日期和时间
import warnings
warnings.filterwarnings('ignore')
import warnings warnings.filterwarnings('ignore')
部分代码正常运行,但会提示警告,使用警告过滤器进行控制是否输出警告消息(上述代码表示忽略警告消息)
warnings.filterwarnings(action, message='', #包含正则表达式的字符串,警告消息的开始必须匹配,不区分大小写 category=Warning, #警告类型 module='', #包含模块名称的正则表达式字符串 lineno=0, #警告发生的行号,为 0 则匹配所有行号 append=False) #为真时,在末尾插入
其中action:
值 处理方式 “error” 将匹配警告转换为异常 “ignore” 忽略匹配的警告 “always” 始终输出匹配的警告 “default” 对于同样的警告只输出第一次出现的警告 “module” 在一个模块中只输出第一次出现的警告 “once” 输出第一次出现的警告,而不考虑它们的位置
读取 pd.read_csv()
,查看表格
data_train_sample = pd.read_csv("train.csv",nrows=5) #nrows设置可以读取文件的前几行
data_train_sample.head() #xx.head()是读取前五行,如果nrows<5,则只会显示nrows行
如果相对路径载入报错时,使用os.getcwd() 查看当前工作目录
import os os.getcwd()
分块读取
#设置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
总体了解
查看特征缺失值、唯一值等
df.isnull().any().sum()
isnull()判断缺失值,isnull().any()判断哪些列存在缺失值,sum()计算个数
df[df.isnull().values==True].head()
只显示存在缺失值的行列,确定缺失值的位置
查看缺失率大于50%的特征
have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()#to_dict转化为字典类型
fea_null_moreThanHalf = {
}
for key,value in have_null_fea_dict.items():
if value > 0.5:
fea_null_moreThanHalf[key] = value #存进去
根据缺失特征及缺失率绘图
missing = df.isnull().sum()/len(df) #缺失值占比
missing = missing[missing > 0] #筛选大于0的数,没有缺失值的不显示
missing.sort_values(inplace=True) #排序,True排序后的数据集替换原来的数据
missing.plot.bar() #绘图
唯一值 one_value_fea = [col for col in df.columns if df[col].nunique() <= 1]
unique() 返回列的所有唯一值
nunique() 返回的是唯一值的个数
查看特征的数值类型、对象类型
select_dtypes
数值类型
df.select_dtypes(include=['int32','int64])
df.select_dtypes(include=['object']).columns
#类别为object的列名
df.select_dtypes(exclude=['object']).columns
#除了类别为object的列名
使用代码逻辑进行过滤数值型类别特征
eg.
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)
数值连续性变量分析
pd.melt
将数据转换为对计算机友好的函数
参数 | 含义 |
---|---|
frame | 用于处理的数据集 |
id_vars [元组,列表或ndarray,可选] | 用作标识符变量的列 |
value_vars [元组,列表或ndarray,可选] | 要取消透视的列。如果未指定,则使用未设置为id_vars的所有列 |
var_name [scalar] | 用于“变量”列的名称。如果为None,则使用frame.columns.name或’variable’ |
value_name [标量,默认为’value’] | 用于“ value”列的名称 |
col_level [int或string,可选] | 如果列是MultiIndex,则使用此级别进行融合 |
seaborn.FacetGrid
画图
http://seaborn.pydata.org/generated/seaborn.FacetGrid.html#seaborn.FacetGrid
plt.figure
在plt中绘制一张图片
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
plt.suptitle
添加总标题
plt.subplot
创建单个子图
plt.subplot(221) #分成2x2,占用第一个,即第一行第一列的子图
plt.subplot(222) #分成2x2,占用第二个,即第一行第二列的子图
plt.subplot(212) #分成2x1,占用第二个,即第二行
plt.subplots
创建多个子图(写一次代码即可)
fig,axes=plt.subplots(2,2) #2行2列
ax1=axes[0,0]
ax2=axes[0,1]
ax3=axes[1,0]
ax4=axes[1,1]
#作图1
ax1.plot(x, x) #后面类似
add_subplot
给figure新增子图
add_axes
新增子区域
sns.distplot
#displot参数如下
sns.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
hist: 控制是否显示条形图,默认为True
kde: 控制是否显示核密度估计图,默认为True
rug: 控制是否显示观测的小细条(边际毛毯)默认为false
fit: 设定函数图像,与原图进行比较
axlabel: 设置x轴的label
ax: 图片位置
变量分布可视化
单一变量分布可视化
sns.barplot
柱形图
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()
根绝y值不同可视化x某个特征的分布
时间格式数据处理及查看
将其转换为时间格式,再进行画图
透视图
pivot = pd.pivot_table(df, index=['grade'], columns=['issueDateDT'], values=['loanAmnt'], aggfunc=np.sum)
完成对复杂数据的分析统计功能,常常伴随降维的效果
pd.pivot_table
pandas提供的数据透视表
values : 待聚合的列名
index : 行索引列名
columns : 列索引列名
aggfunc : 聚合统计函数,可以是单个函数,也可以是函数列表,还可以是字典格式,默认聚合函数为均值。
当该参数传入字典格式时,key为列名,value为聚合函数值,此时values参数无效
fill_value : 缺失值填充值,默认为None(透视后可能存在的缺失值,非原表缺失值)
margins : 是否加入汇总列,默认为False(Excel透视表中的行小计和列小计)
margins_name : 汇总列的列名,与上一个参数配套使用,默认为’All’(margins=False时无效)
dropna : 是否丢弃汇总结果中全为NaN的行或列,默认为True
observed : 适用于分类变量,一般无需关注
用pandas_profiling生成数据报告
import pandas_profiling
pfr = pandas_profiling.ProfileReport(data_train)
pfr.to_file("./example.html")
lambda匿名函数
lambda x: x * x
相对于
def f(x):
return x * x
冒号前面的x表示函数的参数
善于使用检索解决问题
以下贴出师兄的原话:
- Q: 数据探索主要干些什么?
A: ①找到object特征,后面要转换这个object变量,因为后面的特征衍生和模型object变量不能用;②然后就是特征的缺失值分析和异常值分析;③连续变量的密度分布分析,离散变量的count统计量看看样本的值均不均衡。以及特征和标签交叉分析利用groupby- 比如 describe函数 对数据的描述,你可以观察 所有特征的max()和min(),你再看看特征的含义 比如年龄,如果年龄的max是几百 是负多少多少的话 肯定是异常了。
比如 value_counts函数 特征的取值如果是0和1 ,0的有几十个,1的有几万个。那么 一个特征几乎全是一个值换句话说方差(也可以叫熵)几乎为0对于我预测是没有用的- ipy文件里的分析不一定都有用。多想想这个分析对后面有什么帮助,对自己理解数据有什么帮助
- Q:想问问怎么学数据挖掘的相关算法的?
A:b站的视频 比如李宏毅和吴恩达的机器学习课程。 西瓜书也可以。 平时可以去看看公众号Datawhale或者博客