心电图Task02
EDA-数据探索性分析。
比赛地址:https://tianchi.aliyun.com/competition/entrance/531883/introduction
1. EDA 目标
- 了解数据集,熟悉数据类型、数据分布等。
- 了解变量间的相互关系、变量与预测值之间的关系。
- 为数据处理和特征工程做准备。
2. EDA 主要内容
- 数据观察:
- 观察数据集首尾概况
- 观察数据集shape
- 数据总览:
- 通过describe()来熟悉数据的相关统计量
- 通过info()来熟悉数据类型
- 判断数据缺失和异常
- 查看每列的存在nan情况
- 异常值检测(箱线图等)
- 了解预测值的分布
- 总体分布概况
- 查看skewness and kurtosis
3. 代码示例
Github开源地址:https://github.com/datawhalechina/team-learning-data-mining/tree/master/HeartbeatClassification
导入数据集
#coding:utf-8
#导入warnings包,利用过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')
import missingno as msno
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt
import seaborn as sns
Train_data = pd.read_csv('./train.csv')
Test_data = pd.read_csv('./testA.csv')
观察首尾数据和行列信息
Train_data.head().append(Train_data.tail())
Train_data.shape
Test_data.head().append(Test_data.tail())
Test_data.shape
获取数据的相关统计量
Train_data.describe()
Train_data.info
Test_data.describe()
Test_data.info()
判断数据缺失
Train_data.isnull().sum()
Test_data.isnull().sum()
# 也可以使用msno查看数据分布概况
msno.matrix(Train_data,figsize=(3, 2))
msno.matrix(Test_data,figsize=(3, 2))
msno.bar(Train_data,figsize=(3, 2))
msno.bar(Test_data,figsize=(3, 2))
了解预测值标签的分布
Train_data['label']
Train_data['label'].value_counts()
## 1) 总体分布概况(无界约翰逊分布等)
import scipy.stats as st
y = Train_data['label']
plt.figure(1); plt.title('Default')
sns.distplot(y, rug=True, bins=20)
plt.figure(2); plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)
plt.figure(3); plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)
# 2)查看skewness and kurtosis
sns.distplot(Train_data['label']);
print("Skewness: %f" % Train_data['label'].skew())
print("Kurtosis: %f" % Train_data['label'].kurt())
Skewness: 0.917596
Kurtosis: -0.825276
Train_data.skew(), Train_data.kurt()
(id 0.000000
label 0.917596
dtype: float64, id -1.200000
label -0.825276
dtype: float64)
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')
## 3) 查看预测值的具体频数
plt.hist(Train_data['label'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
用pandas_profiling生成数据报告
import pandas_profiling
pfr = pandas_profiling.ProfileReport(data_train)
pfr.to_file("./example.html")
pandas_profiling是一个内容较多,输出比较漂亮的EDA工具库。少量几行代码即可对整个数据集有个overall的了解。
4. 总结思考
关于预测值分布
用直方图可以比较直观地看出数据的分布状态。直方图横坐标为分箱,纵坐标为落入每个分箱的观测次数。
可以通过sns.distplot画出直方图,并用各种概率密度函数图去fit。此处使用了johnsonsu,normal,log normal三种概率密度函数,用以直观了解数据的分布状态。
sns.distplot绘图参考:https://www.cntofu.com/book/172/docs/24.md
偏度和峰度
- 偏度(skewness)是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。偏度定义中包括正态分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫负偏分布,其偏度<0)。
- 峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。随机变量的峰度计算方法为:随机变量的四阶中心矩与方差平方的比值。峰度包括正态分布(峰度值=3),厚尾(峰度值>3),瘦尾(峰度值<3)
可参考:https://blog.csdn.net/xbmatrix/article/details/69360167
样本分类不均衡
- 危害:样本分类不均衡易导致模型很难从样本少的分类中提取到特征,因为目标函数需要照顾到大多数的样本,对样本少的分类就不够敏感。这样训练得到的模型作用到新的数据集上,若新数据集中训练样本少的分类占比较高,模型的准确度就会很差。
- 解决办法:
- 扩充数据集。通过更多渠道获取小类样本数据。
- 重采样。对小类样本进行过采样来增加小类样本个数,或对大类数据样本进行欠采样来减少大类样本个数以达到不同类别数据平衡。
- 造数据。例如:SMOTE算法,思想是合成新的少数类样本,合成的策略是对每个少数类样本a,从它的最近邻中随机选一个样本b,然后在a、b之间的连线上随机选一点作为新合成的少数类样本。
- 改变分类算法。使用代价函数时,可以增加小类样本的权值,降低大类样本的权值,或把小类样本作为异常点,把问题转化为异常点检测问题。此时分类器需要学习到大类的决策分界面,即分类器是一个单个类分类器。
- 改变评估指标。当正负样本数量差距不大的情况下,ROC和PR的趋势是差不多的,但是在正负样本分布极不均衡的情况下,PRC比ROC更能真实的反映出实际情况。
参考:https://blog.csdn.net/heyongluoyao8/article/details/49408131
https://www.jianshu.com/p/5831b1b921ee
对此任务,不同类别间样本个数有量级的差距,应考虑样本分布不均匀问题。