EDA (Exploratory Data Analysis),也就是对数据进行探索性的分析,从而为之后的数据预处理和特征工程提供必要的结论。
针对数据集导入和数据的读取不再赘述,是数据集格式而定。
格式:.csv / .json / .txt .e.t.c
我想就以下几个问题谈谈我认识的和学到的 EDA。
数据总览
为了熟悉数据的相关统计量,此前我一直使用的是 describe( )。
优点: 其统计结果中有每列的统计量【个数 count、平均值 mean、方差 std、最小值 min、中位数25% 50% 75% 、以及最大值】
方便瞬间掌握数据的大概的范围以及每个值的异常值的判断
e.g. 999 9999 -1 等值这些其实都是 nan 的另外一种表达方式
我想说的是还有另外一种数据总览的方法 info( )。
优点: 了解数据每列的type,有助于了解是否存在除了 nan 以外的特殊符号异常。
describe() 的结果就不展示了,比较直观,针对 info() 的结果展示一个范例。
判断数据缺失和异常
说白了还是针对 nan 类型的
如果 nan 的数量很小一般选择填充,如果使用 lgb 等树模型可以直接空缺,让树自己去优化,但如果 nan 存在的过多、可以考虑删掉
补充:
nan,即非数值,不等于任何数,也不等于 nan 本身
是否为 nan 类型的判断方式:isnan( ) or isnull( )
面对缺省值的三类处理方法:
- 用平均值、中值、分位数、众数、随机值等替代。
效果一般,因为等于人为增加了噪声。
- 用其他变量做预测模型来算出缺失变量。
效果比方法1略好,
但有一个根本缺陷如果其他变量和缺失变量无关,则预测的结果无意义。
如果预测结果相当准确,则又说明这个变量是没必要加入建模的。一般情况下,介于两者之间。
- 最精确的做法,把变量映射到高维空间。
For Example: 性别,有男、女、缺失三种情况,则映射成3个变量:是否男、是否女、是否缺失。
连续型变量也可以这样处理。比如Google、百度的CTR预估模型,预处理时会把所有变量都这样处理,达到几亿维。
这样做的好处是完整保留了原始数据的全部信息、不用考虑缺失值、不用考虑线性不可分之类的问题。缺点是计算量大大提升。
而且只有在样本量非常大的时候效果才好,否则会因为过于稀疏,效果很差。
了解预测值的分布
- 总体分布概况(无界约翰逊分布等)
针对预测值的特征寻找最佳拟合曲线,对数 / 正态 / 无界 Johnson SU
- 查看 skewness and kurtosis
分别对应数据的偏度 .skew( ) && 峰度 .kurt( )
参见:偏度峰度简介及实现
- 查看预测值的具体频数
通过直方图可视化预测数据,可以得到频数
处理方法: 把值较少的部分填充或者删掉
处理过后的数据比较集中,可以在预测之前先进行变换,一般进行 log 变换,使得数据均匀化分布
特征分析
- 特征 nunique 分布
- 数据可视化
数字特征分析
1 | numeric_features = Train_data.select_dtypes(include=[np.number]) |
类型特征分析
1 | categorical_features = Train_data.select_dtypes(include=[np.object]) |
nunique 分布
针对 object 类型字段特征
1 | for feature in categorical_feas: |
根据结果找到分类结果的分布特征情况
数据可视化
作为一种工具,旨在展现数据或者特征之间的关系
参见:数据可视化参数调整
数据关系可以分为四种类型:
比较: 比较数据间各类别的关系,或者是它们随着时间的变化趋势,比如折线图;
联系: 查看两个或两个以上变量之间的关系,比如散点图;
构成: 每个部分占整体的百分比,或者是随着时间的百分比变化,比如饼图;
分布: 关注单个变量,或者多个变量的分布情况,比如直方图。
参见:数据可视化是一种技能