Advertisement

数据预处理Part1——数据清洗

阅读量:

文章目录

  • 第一部分:数据前期处理

  • 第二部分:数据清理

  • 1、缺失信息管理
    1.1 剔除含有缺失信息的数据样本
    1.2 使用填补方法修复缺失信息
    1.3 将缺失标记转化为有效数值
    1.4 按照既定标准放弃对该字段的处理
    1.5 应用特征筛选机制到后续操作流程中

  • 2、异常数据

    • 2.1 处理异常数据的方法
    • 2.2 在某些特定场景下选择性地保留这些潜在的离群点
      • 2.2.1 这些极端数值往往能够真实反映业务运营的关键指标
  • 2.2.2 异常检测模型

  • 2.2.3 包容这类离群点的数据建模方法

  • 3、重复值

    • 3.1 简单去除法
      • 3.2 考虑保留信息
        • 3.2.1 用于研究数据变化趋势
      • 3.2.2 帮助平衡样本分布

一、数据预处理

数据预处理是数据建模前的关键步骤,在此过程中所得的数据质量直接影响了后续各项数据分析工作的质量输出。从其主要内容来看,则涵盖了包括数据清洗操作、转换操作以及样本抽取方法等基础性工作。

本文作为读者提供了一篇关于《Python数据分析与数据化运营》一书的参考资料,并增添了一些书中未曾涉及的方法和具体代码示例。

二、数据清洗

在数据清洗过程中所涉及的主要问题是缺失值、异常值以及重复值。所谓的清洗过程是通过剔除多余的数据点补充缺失的信息进行数值替换以及去除重复项完成的一系列操作。其最终目标是消除异常数据的影响修复错误记录填补数据空缺。

1、缺失值处理

数据缺失可归为两大类:一类是条目信息未被完整记录的问题(通常被称为数据记录丢失),另一类则是因各种原因导致的数据记录中某些字段(即列)中的数值为空缺的情况。

在不同的数据存储系统或环境中对缺失值的表示方式存在差异,在数据库系统中通常使用Null来表示缺失值,在Python编程语言中常用None来表示缺失值(虽然有时会遇到不兼容的情况),而Pandas库与Numpy库则采用NaN(Not a Number)来表示缺失数值)。

部分数据记录可能无法恢复,在本节中我们主要探讨数据列类型缺失值 的处理方法。常见的处理方法主要包括:如填充法、删除法等。这些方法各有优缺点,在实际应用中需要根据具体情况选择合适的策略。

  • 丢弃
  • 补全
  • 真值转换
  • 不处理
  • 特征选择

1.1 丢弃缺失值

该处理将立即消除所有包含缺失值的数据行或字段(分别进行全行或全列清除),从而降低整体数据集中缺失值对分析结果的影响。然而这种方法可能导致重要特征信息丢失。以下情况不建议采用该方法:

在数据库中存在缺失值的比例达到或超过**10%**的情况下, 去除包含这些缺失值的数据记录会导致大量有价值的信息被丢失。

带有一些缺失值的数据记录往往表现出明显的分布模式特征。例如,在数据集中主要集中在某些特定类别或几个类别标签中。如果删除这些标签,则可能导致模型对这类标签的预测不够准确。

代码实现
1. 导包

复制代码
    [1]:import pandas as pd
    	import numpy as np
    	from sklearn.preprocessing import Imputer

2. 加载数据

复制代码
    [2]:missing_data = pd.read_excel("missing_data.xlsx",index_col = 0)
    	missing_data.head()
在这里插入图片描述

3. 查看数据

复制代码
    [3]:missing_data.shape

(506, 13)

复制代码
    [4]:missing_data.info()
在这里插入图片描述

查看哪些列有缺失

复制代码
    [5]:missing_data.isnull().any()
在这里插入图片描述

丢弃缺失值

复制代码
    [6]:drop_missing_data = missing_data.dropna() # 直接丢失含有缺失值的行记录
    	drop_missing_data.shape

(28, 13)

可以看到,只有28行数据不包含缺失值,其余行数据都被删除。

1.2 补全缺失值

相较于丢弃而言,补全是一种更为普遍采用的缺失值处理方法。采用特定策略将缺失的数据补充完整,并最终构建起更加完整的原始数据集;这对于后续的数据清洗、分析以及模型训练具有至关重要的作用

常用的补全方法如下:

  • 统计法:针对数值型数据集,在缺失数据填充方面主要采用平均值、加权平均值以及中位数等指标进行填补;而对于分类型数据集,则以众数作为填充依据。

  • 模型法:我们通常会利用现有其他字段作为输入特征,在目标变量上建立预测模型以填补缺失值。

  • 如果所处理的数据列属于数值型变量范畴,则采用回归模型来进行填补

  • 特别地,在具体实施时若选择使用随机森林回归算法,则需相应选择随机森林回归模型

  • 对于含有缺失值且为分类型变量的数据列,则应采取分类模型来实现填补任务

  • 专家补全:针对数量有限但意义重大的数据条目,在缺失值填充过程中采用专业人员的专业评估。

    • 其他方法:在缺失值填充过程中采用的其他处理手段包括随机填补法、基于特殊值的替代法以及多重填补技术等。

代码实现:
通过手动计算或取平均值来实现填充, 或借助Imputer类工具来进行填充, 同时利用随机森林算法来处理缺失数据.

使用均值补全

复制代码
    [7]:fill_mean_data_1 = missing_data.fillna(missing_data.mean())
    	fill_mean_data_1.mean()
在这里插入图片描述
复制代码
    [8]:fill_model = Imputer(missing_values='NaN',strategy ="mean",axis=0)
    	fill_mean_data_2 = pd.DataFrame(fill_model.fit_transform(missing_data))
    	fill_mean_data_2.mean()
在这里插入图片描述

可以看出,手动计算均值填充与使用sklearn中方法填充是一致的。

使用模型补全:

复制代码
    [9]:from sklearn.ensemble import RandomForestRegressor
    	from sklearn.impute import SimpleImputer
    [10]:fill_model_data = missing_data.copy() # 在缺失数据集的复制数据上操作
    [11]:sortindex = np.argsort(fill_model_data.isnull().sum(axis=0)).values # 按照每列缺失数据数量由高到低对列名进行排序
    [12]:for i in sortindex: # 每次将一列数据作为标签,其他列数据作为特征来预测缺失部分数据
    	     df = fill_model_data 
    	     fill_target = df.iloc[:,i]  # 标签列
    	     fill_feature = df.iloc[:,df.columns != i] # 特征列
    	     fill_feature = SimpleImputer(missing_values = np.nan,strategy="constant",fill_value=0).fit_transform(fill_feature) # 将特征列中的缺失值用0进行填充
    	     # 划分测试集和训练集 
    	     Ytrain = fill_target[fill_target.notnull()]
    	     Ytest = fill_target[fill_target.isnull()]
    	    
    	     Xtrain = fill_feature[Ytrain.index,:]
    	     Xtest = fill_feature[Ytest.index,:]
    	    
    	     # 用随机森林回归来填补缺失值
    	     rfc = RandomForestRegressor()
    	     rfc = rfc.fit(Xtrain,Ytrain)
    	     predict_value = rfc.predict(Xtest)
    	     # 将预测值替换到缺失值中
    	     fill_model_data.loc[fill_model_data.iloc[:,i].isnull(),i] = predict_value

1.3 真值转换

在特定情况下(即某些特定情况下),我们可能既无法掌握缺失值的分布规律(即数据丢失模式),也无法应用上述所有补全手段进行处理;或者我们倾向于认为缺失是一种特殊的规律(即数据完整性受到破坏的一种表现形式),因此不建议轻易地对缺失值进行随意处理(即不要采取不负责任的态度对待数据完整性问题),而必须采用真实值替代法来进行填补工作(即用真实存在的数据填补缺失位置)

本方法的核心观点在于认识到丢失数据的存在,并将其视为数据分布规律的重要组成部分,在后续的数据处理与模型计算过程中综合考虑变量的实际数值与丢失数值,并将其作为输入维度运用到相关步骤中。然而由于丢失数值无法参与到模型计算过程中会导致错误出现的情况发生。因此要求我们对这些丢失的数据进行真假性转换以确保系统的稳定性和准确性

以用户性别为例,在现有研究中发现许多现有的数据集都无法有效补充会员的性别信息。然而同时我们也不想舍弃这些数据。因此我们需要考虑将这些值具体来说,则是从一个单一变量的各种可能取值(如男性、女性和未知)转变为多个独立变量各自携带单一的信息。

  • 转换前:

    • 特征:性别 值域:(男 女 未知)
  • 转换后:

    • 特征1:性别男 值域(1或0)
    • 特征2:性别女 值域(1或0)
    • 特征1:性别未知 值域(1或0)

然后将这三列新字段替换原来的一个字段参与模型计算。

1.4 不处理

在数据预处理阶段中对包含缺失值的数据记录无需进行任何特殊处理这同样是一种可行的方法该方法取决于后期的数据分析与建模的应用过程许多模型能够容忍或灵活地对缺失值进行处理因此在数据预处理阶段无需进行特殊操作

常见的能够自动处理缺失值的模型包括

  • KNN算法中,在计算邻居时会忽略缺失值。
  • 决策树模型及随机森林方法通过将缺失数据视为概率分布的一部分来进行数据建模。
  • DBSCAN聚类算法在度量阶段排除了样本间直接的距离影响,在单个实例的距离考量上影响被相互抵消。
  • ...

1.5 特征选择

在数据预处理阶段的数据规约过程中, 一种常见的策略就是维度缩减, 在降维过程中通常采用的一种方法就是直接选择特征. 假如我们通过某种方法确定那些包含缺失值的字段对模型性能的影响较小, 那么我们可以完全无需进行缺失值填补操作, 不论其缺失比例是多少. 因此, 在后续建模过程中对字段或特征重要性评估结果将作为判断是否需要处理缺失值的重要依据.

基于泰坦尼克号的生存预测为例,在存活方面

2、异常值

异常数据显示出了分布在特定区域的常态特征,在超出预期分布范围的数据常被归类为离群值或称为'噪声数据'。造成这种现象的原因多种多样,例如在数据分析过程中出现的问题,以及业务操作中的失误等情况下都可能出现此类情况。在识别这些离群值之前,必须区分哪些属于真正的离群值,其余则被视为正常波动的一部分。基于其状态的不同可分为两类:一类是明显偏离常规的数据点,另一类则是由于系统误差或其他特殊原因产生的偏差。

  • 一种是由业务因素导致的异常:这类异常反映了正常情况下业务状态的变化。
    • 另一种是非由特性驱动的异常:这类情况反映出数据分布出现偏差的具体案例。

2.1 异常值处理

代码实现:

复制代码
    [1]:import pandas as pd
    [2]:df = pd.DataFrame({'身高':[150,160,170,155,180,5000],
    	                   '体重':[50,60,70,75,80,4000]
    	                  })
    	df
在这里插入图片描述

使用箱型图查看异常值:

复制代码
    [3]:df.boxplot()
在这里插入图片描述

使用Z-score查看异常值:

复制代码
    [4]:df_zscore = df.copy()
    	for col in df.columns:
    	    z_score = (df[col]-df[col].mean()) / df[col].std()
    	    print(z_score)
    	    df_zscore[col] = z_score.abs() > 2 # Z-score标准化得分一般大于2.2,就是相对异常的表现值,这里阈值为2
    [5]:df_zscore
在这里插入图片描述

删除异常值

复制代码
    [6]:df[df_zscore["身高"]== False]
在这里插入图片描述

2.2 保留异常数据的情况

通常在数据挖掘的过程中,异常值常被视为噪声而被剔除以避免其影响总体的数据评估和分析挖掘的效果。然而,在某些特定情况下,并不需要将异常值予以排除。

2.2.1 异常值正常反映了业务运营结果

例如:举个例子来说吧,在正常情况下某商品的日销量约为一千个上下波动。然而昨天搞了一次促销活动恰巧刺激了销售热潮结果一天就卖出了一万件产品。但问题是前一天为了满足不了巨大需求已经卖光了库存这就造成了今天只能出售不到一百台的情况。从这些数据可以看出它们表现真实可靠反映了实际情况因此不能简单地予以舍弃而是应该认真分析研究其中的原因采取相应的改进措施

2.2.2 异常检测模型

基于整体样本中存在一些特殊的个体,在这些特殊个体中通过深入分析与挖掘其潜在特征从而识别出其中的特殊案例及其规律性特征。此类数据分析主要聚焦于对这些特殊样本的识别与研究,并因此必须保留这些关键的数据点

2.2.3 包容异常值的数据建模

如果该数据算法与模型具备良好的容错性,则即使无需进行预处理异常数据也不会对模型性能产生负面影响。例如,在决策树中,异常值可以直接作为分裂节点。

3、重复值

数据中的重复值包括以下两种情况:

  • 在字段值一致的情况下存在多个数据记录。这种现象是最常见的数据重复问题。
    • 在对象保持不变的情况下对应到不同的关键属性值时会出现这种情况。这种现象通常存在于数据库中的变化维度表中。

3.1 直接去重

去除重复数据采用的主要方法是解决重复值问题的技术手段;其核心目标在于确保仅保留具有代表性的数据。

代码实现

复制代码
    [1]:import pandas as pd
    [2]:data1,data2,data3,data4 = ['a',3],['b',2],['a',3],['c',2]
    [3]:df = pd.DataFrame([data1,data2,data3,data4],columns=["col1","col2"])
    	df
在这里插入图片描述

查看缺失值:

复制代码
    [4]:isDuplicated = df.duplicated()
    	isDuplicated
在这里插入图片描述

删除缺失值:

复制代码
    [5]:df.drop_duplicates()
在这里插入图片描述

3.2 保留重复值的情况

3.2.1 重复值用于分析演变规律

举个例子来说吧!比如一辆汽车在一段时间之前是畅销车型,在这段时间内变成了滞销车型。那么同样一辆车在不同时间段被归类到不同的标签中。这时我们就可以根据实际情况来判断是否要去重。

  • 如果两条数据需要完成整体处理,则需设置整合字段以结合这两条数据。
    • 如果需要同时保存这两条数据,则需依据具体需求制定相应的处理流程。
3.2.2 重复值用于样本不均衡处理

在构建分类模型时,当样本分布不均衡时会直接影响模型的性能表现.一种常见的解决方法是对少数类别的样本进行简单的过采样处理.通过随机选择并复制少量样本的方法来补充少数类别的数量.这样会导致数据集中出现大量冗余数据记录,在这种情况下进行去重操作就变得必要.

例如,在信用卡模型中

关联文章

数据预处理Part2——数据标准化
数据预处理Part3——真值转换
数据预处理Part4——数据离散化
数据预处理Part5——样本分布不均衡
数据预处理Part6——数据抽样
数据预处理Part7——特征选择
数据预处理Part8——数据共线性
数据预处理Part9——数据降维

全部评论 (0)

还没有任何评论哟~