项目实训写实记录No.2

一.获取数据分布特点及可视化展现

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)xmin(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=D1D2Dk
  • 建立第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类似,但可以指定测试样本数据所占的比重
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值