数据初探
一.获取数据分布特点及可视化展现
1.概念与机理
(1)基本统计量
- 众数 :一组数据中出现次数最多的数值
- 极差 :一组数据中最大值与最小值之间的差距
- 百分位数:将具有
n
n
n个元素的数组升序排列后,处于
x
%
x\%
x%位置的值称为第
x
x
x百分位数
- 中位数实际上是 50 % 50\% 50%分位数
- 统计中经常用到的是 25 % 25\% 25%、 50 % 50\% 50%、 75 % 75\% 75%分位数,分别称为第1、第2和第3四分位数,记为: Q 1 , Q 2 , Q 3 Q1,Q2,Q3 Q1,Q2,Q3
- Q 1 Q1 Q1和 Q 3 Q3 Q3之间距离的一半,称为四分位差,记为 Q Q Q。 Q Q Q越小,说明中间部分的数据越集中;反之则越分散
- 偏差(deviation) :数组中每个元素与数组平均值的差: $ dev(x)=x^{(i)}-\bar{x}, i=1,2,\cdots,n $
- x ( i ) x^{(i)} x(i)表示第 i i i个元素
- x ˉ \bar{x} xˉ表示数组的算数平均值
- 方差(variance) :每个元素的偏差平方和,再除以有效元素个数: $ var(x) = \dfrac{\sum_{i=1}^{n} (x^{(i)} - \bar{x} )^2}{n} $
- n n n为有效元素个数。对于无偏估计方差(unbiased estimator) ,有效元素个数为【数组长度-1】;对于有偏估计方差(biased estimator) ,有效元素个数为【数组长度】
- 方差指示了一个数组中各个元素的离散程度。方差越大,离散程度越大;方差越小,说明各个数据都比较集中在均值附近
- 标准差(standard variance) :又叫均方差 ,也就是方差的平方根: $ std(x)=\sqrt{var(x)} $
- 同样分为有偏估计和无偏估计标准差
- 协方差(covariance) :对于长度相同的两个数组,先求出各自的偏差,然后求出两组偏差的内积和,最后除以有效元素总数: $ cov(x, y)=\dfrac{\sum_i^n(\bar{x} - x^{(i)})(\bar{y} - y^{(i)})}{n} $
- y ˉ \bar{y} yˉ:数组 y y y的平均值, x ˉ \bar{x} xˉ:数组 x x x的平均值, x ( i ) x^{(i)} x(i):数组 x x x中第 i i i个元素, y ( i ) y^{(i)} y(i):数组 y y y中第 i i i个元素
- 两个数组(或向量)的协方差越大,说明二者之间的相互线性影响越明显
- 相关性(correlation) :对于两个数组(元素个数相同),计算出协方差以及两个标准差,然后用协方差除以标准差乘积: $cor(x, y)=\dfrac{cov(x,y)}{std(x) * std(y)} $
- 相关性用于衡量两个数组的关联度:1表示最强的正关联;-1表示最强的负关联;0表示完全没有关联
(2)数据分布
- 标签(结果)的取值分布
- 对于连续型的标签,可以查看其取值范围、均值、标准差等分布情况,或者可以对其进行分箱统计,即:划分若干个数据区间,统计每个区间内的标签数量,从而获取样本的大致分布情况
- 对于离散型标签(分类标签),可以查看其有多少种取值,以及每种取值有多少个样本
- 特征的取值分布
- 与标签的取值分布类似,可以针对每个特征取值,统计其在总样本中的数量占比
- 特征与标签之间的分布
- 对于标签为分类(而不是回归)的情形,可以通过统计单个特征相对分类标签的样本数量来查看数据分布,从而了解每个特征的取值与分类结果之间的大致关系。例如:
- 性别特征与患病与否之间的分布关系。男性患病的样本数量是多少,女性患病的数量是多少等
- 教育程度与收入水平之间的分布关系。高等/中等/初等教育程度对应的高、中、第收入的样本数量分别是多少
- 也可以对某个特征进行初步的处理后再统计相对于标签的分布。例如:
- 将年龄特征划分到多个区间中,然后统计每个区间相对于标签的分布。例如:20~30岁、30~40岁、40~50岁等不年龄段,患病和不患病的样本数
- 还可以将2个或以上的特征联合起来,统计它们与标签结果之间的分布。例如:
- 年龄和性别联合起来,患病和不患病的样本数。例如:20~30岁男性患病数
- 对于标签为分类(而不是回归)的情形,可以通过统计单个特征相对分类标签的样本数量来查看数据分布,从而了解每个特征的取值与分类结果之间的大致关系。例如:
(3)相关性分析
- 特征与标签(结果)之间的相关性分析
- 通过计算单个特征与标签之间的相关性,可以大致了解该特征与结果的线性关系,从而在一定程度上可以看出该特征的重要性(但不完全)
- 一般可以分别计算每个特征与标签之间的相关性
- 特征与特征之间的相关性分析
- 通过计算两个特征之间的相关性,可以大致了解这两个特征之间的线性关系,从而在一定程度上可以看出它们是否冗余(如果高度相关,则可以使用其中一个特征代替另一个特征)
- 一般可以计算所有特征之间的两两相关性
- 相关性矩阵
- 计算所有字段(含特征和标签)之间的两两相关性,从而形成一个相关性矩阵。
- 每一行代表一个特征分别与其它每个特征之间的相关性;每一列也代表一个特征与其它特征之间的相关性(以同样的顺序)
- 矩阵的对角线正好就代表了该特征与自己的相关性(这个值为1.0)
2.流程与方法
(1)探查数据的一般流程
在获得原始数据集后,一般来说,可以通过下列步骤来探查数据:
- 阅读数据文档
- 如果原始数据集提供了描述文档,则首先阅读文档,了解数据的来源、所涉及的业务领域、字段的含义、特征和标签的设定等信息。
- 获得数据的基本描述信息
- 样本数。如果数据集已经划分好了训练和测试样本,则分别获得它们的样本数量
- 字段数量和每个字段类型,尤其是要区分文本型字段和数值型字段
- 获得数据的基本统计信息
- 对于标签字段,理解其是连续型(往往对应回归问题)还是离散型(往往对应分类问题),并获得其取值范围或分类类别
- 对于文本特征字段,查看其取值是否完全随机(例如姓名字段),或者是有限个数的分类取值(例如学历、性别等字段)
- 对于数值特征字段,统计其均值、中位数、最大值、最小值、标准差指标,并初步了解数据取值范围的量纲
- 获得数据的基本质量信息
- 检测缺失值。例如:
- 哪些字段存在缺失值,缺失样本数量
- 哪些样本行存在缺失值
- 检测重复值。例如:
- 完全重复(每个字段都相同)的样本行有哪些
- 在特定的字段上存在相同值的样本行有哪些(它们可能构成重复,也可能是冲突的数据)
- 检测缺失值。例如:
- 检测数据的有效性
- 检测特殊字符。某些样本中的特定文本字段包含一些无意义的特殊字符或字符串
- 检测离群/异常数据。对于某个字段,有极少数样本的取值明显偏离其它样本的取值范围
- 熟悉样本的分布情况
- 标签值的分布情况。例如,检测结果阳性和阴性的样本数量;各个样本的价格的分布情况
- 样本中特定字段值的分布情况。例如,性别是男或女的样本数量;某门考试成绩的分布情况。一般来说,正态分布的样本会更合适
- 将特定字段划定区间后统计分布情况。例如,年龄在20~30岁的样本数
- 计算字段之间的关联
- 计算单个特征与标签之间的相关性
- 计算两两特征之间的相关性
(2)数据可视化的常用方法
- 查看数据分布情况
- 通过样本的散点图(适合连续取值)、柱状图/饼图(适合有限取值)、直方图(适合连续取值)等查看单个字段的样本数统计结果
- 通过箱图、误差图查看样本的数据分布,尤其是聚集或离散状态
- 3D散点图、曲面图:将2个特征分别作为x和y坐标,查看它们相对于标签结果(z)之间的样本分布。
- 查看字段之间的相关性
- 通过热力图查看字段之间的两两相关性
3.技术与实现
数值统计:
- 极值、平均值、中位数、百分位数、众数:min、max、mean、median、percentile、pandas.DataFrame.mode
- 方差、标准差:var、std
- 协方差、相关性:cov、corrcoef
- 字段两两相关性计算:pandas.DataFrame.corr
可视化绘图:
- 柱状图(包括多维、堆叠柱状图、水平柱状图)、饼图、散点图:matplotlib(bar、barh、pie、scatter)、pandas.crosstab、pandas.DataFrame.plot
- 直方图、箱图、误差图:matplotlib(hist、boxplot、errorbar)、pandas.DataFrame.hist
- 热力图:seaborn.heatmap
二.标准化与归一化.
1.归一化
- 对数据的数值范围进行特定缩放,但不改变其数据分布的一种线性特征变换
- 最大最小归一化(又称离差归一化): x ′ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x' = \frac{x-min(x)}{max(x)-min(x)} x′=max(x)−min(x)x−min(x)
- 特点
- 使结果值映射到 [ 0 , 1 ] [0,1] [0,1]之间
- max和min的取值本身可能不合理(例如异常值等),很容易使得归一化效果差。实际使用中可以用经验常量来替代max和min
- 例如三个样本特征值为1,2,10000,归一化会导致1, 2两个特征值“挤”在一起
- 假设1和2的结果(标签)不同,则会给模型训练带来巨大困难:模型会需要更长的时间收敛,因为这两个样本很难分开
- 应用场景:在不涉及距离度量、协方差计算、数据不符合正太分布时
2.标准化
- 对数据的分布的进行转换,使其符合某种分布(比如正态分布)的一种非线性特征变换
- Z-Score标准化(最常见的标准化方法):
x
′
=
x
−
μ
σ
x' = \frac{x -\mu}{\sigma}
x′=σx−μ
- x x x为某个特征序列(含若干个样本)
- μ \mu μ为该特征在所有样本中的平均值
- σ \sigma σ为所有样本数据的标准差
- 特点
- 经过Z-Score标准化处理后,该特征将符合标准正态分布,即均值为0,标准差为1
- Z-Score要求原始数据的分布可以近似为正态分布,否则标准化的效果会很差。而自然界的数值特征很大可能性是服从正态分布的,因此使用标准化更可能符合这个假设
- 标准化更好保持了样本间距,尤其是当样本中有异常点时
- 应用场景:在分类、聚类算法中,需要使用距离来度量相似性时;或者使用PCA技术进行降维时
3.技术与实现
最大最小归一化:
sklearn.preprocessing.MinMaxScaler
标准化:
sklearn.preprocessing.StandardScaler
三.差分数据集
1.数据集的划分
机器学习数据集通常划分为三个部分:
- 训练集: 用于模型拟合的数据样本
- 测试集: 用来评估模最终模型的泛化能力
- 验证集: 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估
一般来说,使用训练集训练多个不同的候选模型;然后使用验证集对每个候选模型的效果进行评估,选出最优模型;最后用测试集来检验最优模型的性能,并将其结果作为该模型的泛化能力。在某些情况下(例如,仅进行一些初步的试验和评估),可以把测试集和验证集合成一个,或者说,只划分训练集和测试集,省略验证集。
样本数量划分比例,在没有验证集的情况下,按照8:2或7:3比例划分训练集和测试集,在有验证集的情况下,常用的比例是训练集:验证集:测试集 = 6:2:2
2.样本的均衡性
- 假设有 N N N个样本,每个样本的标签分类是 L 1 , L 2 , … , L k L_1,L_2,\dots,L_k L1,L2,…,Lk中的一项。对于原始数据集而言,每种标签分类的样本数是一定的,或者说每种样本类别的占比是一定的
- 在将样本划分为训练集和测试集的过程中,有可能造成某些种类的样本绝大部分被划分到训练集,导致测试集中缺少该类别的样本;或者反之。这就导致了样本的不均衡
- 例如,在某种特殊情况下,100个样本,前25个样本类别为1,接下来25个样本类别为2,再下来为3,最后25个样本类别为4
- 如果按照顺序的方式来划分数据集(例如3:1的比例),将正好导致类别4的所有样本都被划入测试集,而训练集中将没有类别4的样本
- 显然,这样的样本训练出来的模型,不可能预测类别4类型的样本。
- 样本不均衡,会对训练结果产生严重的影响,应尽可能避免
- 因此,在划分子集的过程中,要考虑尽量使得样本的分布均匀。常见的方法是将原有样本尽可能随机化分布,或者通过硬性手段来保证各个样本分类的比例
3.流程与方法
(1)留出法
留出法(hold_out)直接将数据集划分为训练集和测试集(不含验证集)
(2)K折交叉验证法
- 先将数据集D划分为 K K K个大小相同的互斥子集,即 D = D 1 ∪ D 2 ∪ ⋯ ∪ D k D=D_{1} ∪ D_{2} ∪ \dots ∪ D_{k} D=D1∪D2∪⋯∪Dk
- 建立第1个划分结果:用第1个子集作为测试集,第2~ K K K个子集作为训练集
- 建立第2个划分结果:用第2个子集作为测试集,其余子集作为训练集
- 这样一共可以得到 K K K组划分,从而可以进行 K K K次模型的训练。每次训练使用该组划分中的训练集,并用测试集评估结果;最后把这 K K K个测试集评估结果的均值作为最终评估结果。
- 关于 K K K的取值,主要是要保证有足量的训练数据。当总体数据量比较小的时候, K K K值可以稍微设置大一些,这样训练集占整体比例就比较大。相反,数据量比较大的时候, K K K值可以设置的小一些。
下图是
K
=
10
K=10
K=10的交叉验证数据划分方法图示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QN1RCoxQ-1625129705873)(./images/1.png)]
(3)留一法
- 在K折交叉验证法中,如果设置 K = 1 K=1 K=1,则始终只保留1个样本作为测试集。这种方法称为留一法
- 它的优点是可以保证训练集尽可能大。这对于有限数据来说比较有意义
(4)自助法
- 针对具有 N N N个样本数据集D,每次从D中有放回地采样,获取一个样本放入D’,直到 D’的样本数达到 N N N
- 由于是有放回的采样,所以D’中存在重复的样本,而且D中有部分样本不会出现在D’中
- 以D’为训练集,没有在D’出现的样本作为测试集
- 何种方法在数据集小、难以有效划分训练集/测试集时很有用,不过它会改变数据集的分布会,引入偏差
上述方法都只实现了划分训练集和测试集。如果希望再划分出验证集,可采用下列办法:
- 使用留出法,将数据集划分成初始训练集和测试集
- 使用K折交叉法,把初始训练集生成 K K K个划分结果,每个结果均包含训练集和验证集(此时验证集就是该划分的测试集)
4.技术与实现
(1)使用自定义方法划分训练集和测试集
- 将数据样本打乱以后,从头部开始取若干个样本作为训练集,剩余的样本作为测试集
- 使用np.random.shuffle、np.random.permutation等函数来打乱数据
(2)调用库函数划分训练集和测试集
- 使用sklearn.model_selection.train_test_split函数,直接指定测试集样本的数量占比
(3)调用库函数实现K折交叉验证法
- sklearn.model_selection.KFold:无放回采样
- sklearn.model_selection.RepeatedKFold:是有放回的采样(本演练不演示)
- sklearn.model_selection.LeaveOneOut:留一法实现(本演练不演示)
- sklearn.model_selection.StratifiedKFold:与KFold类似,但是将保持样本的均衡性。
- sklearn.model_selection.StratifiedShuffleSplit:与StratifiedKFold类似,但可以指定测试样本数据所占的比重