精华内容
下载资源
问答
  • 缺失值填充的几种方法

    万次阅读 多人点赞 2018-09-12 22:59:51
    之前的某次面试中,聊到了缺失值填充方法,经面试官指点学到了一些技能,下面简要总结一下。 常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这...

    面试不仅仅是一个找工作的过程,还是一个向面试官交流学习的过程。之前的某次面试中,聊到了缺失值填充方法,经面试官指点学到了一些技能,下面简要总结一下。

    常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。

    1. 数据集介绍

    数据集来源于 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测。该数据集共有1000条数据,特征共83维,加上id和label共85列,每维特征缺失数量范围为0~911。为了简单比较各种填充方法的效果,我们选取最简单的二分类模型(逻辑回归),选取F1 score作为评测指标。

    读取数据集代码如下:

    train_data = pd.read_csv('train_data.csv', encoding='gbk') # 读取数据集
    
    filter_feature = ['id','label'] # 过滤无用的维度
    features = []
    for x in train_data.columns: # 取特征
        if x not in filter_feature:
            features.append(x)
    
    train_data_x = train_data[features] 
    train_data_y = train_data['label']
    X_train, X_test, y_train, y_test = train_test_split(train_data_x, train_data_y, random_state=1) # 划分训练集、测试集
    

    2. 常见的填充方法

    (1)填充固定值

    选取某个固定值/默认值填充缺失值。

    train_data.fillna(0, inplace=True) # 填充 0

    (2)填充均值

    对每一列的缺失值,填充当列的均值。

    train_data.fillna(train_data.mean(),inplace=True) # 填充均值

    (3)填充中位数

    对每一列的缺失值,填充当列的中位数。

    train_data.fillna(train_data.median(),inplace=True) # 填充中位数

    (4)填充众数

    对每一列的缺失值,填充当列的众数。由于存在某列缺失值过多,众数为nan的情况,因此这里取的是每列删除掉nan值后的众数。

    train_data.fillna(train_data.mode(),inplace=True) # 填充众数,该数据缺失太多众数出现为nan的情况
    features_mode = {}
    for f in features:
        print f,':', list(train_data[f].dropna().mode().values)
        features_mode[f] = list(train_data[f].dropna().mode().values)[0]
    train_data.fillna(features_mode,inplace=True)

    (5)填充上下条的数据

    对每一条数据的缺失值,填充其上下条数据的值。

    train_data.fillna(method='pad', inplace=True) # 填充前一条数据的值,但是前一条也不一定有值
    train_data.fillna(0, inplace=True)
    
    train_data.fillna(method='bfill', inplace=True) # 填充后一条数据的值,但是后一条也不一定有值
    train_data.fillna(0, inplace=True)

    (6)填充插值得到的数据

    用插值法拟合出缺失的数据,然后进行填充。

    for f in features: # 插值法填充
        train_data[f] = train_data[f].interpolate()
        
    train_data.dropna(inplace=True)

    (7)填充KNN数据

    填充近邻的数据,先利用knn计算临近的k个数据,然后填充他们的均值。(安装fancyimpute)除了knn填充,fancyimpute还提供了其他填充方法。

    from fancyimpute import KNN
    
    train_data_x = pd.DataFrame(KNN(k=6).fit_transform(train_data_x), columns=features)

    (8)填充模型预测的值

    把缺失值作为新的label,建立模型得到预测值,然后进行填充。这里选择某个缺失值数量适当的特征采用随机森林RF进行拟合,其他缺失特征采用均值进行填充。

    new_label = 'SNP46'
    new_features = []
    for f in features:
        if f != new_label:
            new_features.append(f)
            
    new_train_x = train_data[train_data[new_label].isnull()==False][new_features]
    new_train_x.fillna(new_train_x.mean(), inplace=True) # 其他列填充均值
    new_train_y = train_data[train_data[new_label].isnull()==False][new_label]
    
    new_predict_x = train_data[train_data[new_label].isnull()==True][new_features]
    new_predict_x.fillna(new_predict_x.mean(), inplace=True) # 其他列填充均值
    new_predict_y = train_data[train_data[new_label].isnull()==True][new_label]
    
    rfr = RandomForestRegressor(random_state=666, n_estimators=10, n_jobs=-1)
    rfr.fit(new_train_x, new_train_y)
    new_predict_y = rfr.predict(new_predict_x)
    
    new_predict_y = pd.DataFrame(new_predict_y, columns=[new_label], index=new_predict_x.index)
    new_predict_y = pd.concat([new_predict_x, new_predict_y], axis=1)
    new_train_y = pd.concat([new_train_x, new_train_y], axis=1)
    new_train_data = pd.concat([new_predict_y,new_train_y]) 
    
    train_data_x = new_train_data[features]
    train_data_y = train_data['label']

    3. 实验对比

    (1)评测指标

    选取F1 score进行评测。

    def countF1(train, predict):
        count = 0 # 统计预测的正确的正样本数
        for i in range(len(train)):
            if predict[i] == 1 and train[i] == 1:
                count += 1
        pre =  count * 1.0 / sum(predict) # 准确率
        recall =  count * 1.0 / sum(train) # 召回率
        return 2 * pre * recall / (pre + recall)
        

    (2)对比结果

    填充方式 训练集_F1 测试集_F1
    默认值0 0.70516717 0.59689922
    均值(mean) 0.70186335 0.67768595
    中位数(median) 0.70826833 0.67479675
    众数(mode) 0.70479134 0.68852459
    上一个数据(pad) 0.70409712 0.62711864
    下一个数据(bfill) 0.66981132 0.60169492
    插值 0.69018405 0.61333333
    KNN_3 0.71076923 0.66393443
    KNN_6 0.70897833 0.68852459
    KNN_10 0.70479134 0.68032787
    随机森林_feature3 0.571428571 0.4
    随机森林_feature46 0.585139319 0.41509434

    (3)实验小结

    对于缺失值的处理,除了直接删除缺失严重的特征外,还可以选择各种各样的填充方法。对于每一种填充方式而言,都有其适用的场景,没有绝对的好坏之分,因此在做数据预处理时,要多尝试几种填充方法,选择表现最佳的即可。

     

    本文完整代码已上传至git(https://github.com/AHNU/fill_missing_values)

    参考文献

    1. 训练模型填充空值(fill null)的几种方法

    2. https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python

    展开全文
  • EDA分析-缺失值填充

    2020-03-24 17:37:41
    缺失值填充 转自https://www.cnblogs.com/magle/articles/6110195.html 数据缺失机制 在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量(属性)称为完全变量,数据集中...

    数据挖掘学习路径


    在这里插入图片描述
    在这里插入图片描述

    缺失值填充

    转自https://www.cnblogs.com/magle/articles/6110195.html


    数据缺失机制
    在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量,Little 和 Rubin定义了以下三种不同的数据缺失机制:
    1)完全随机缺失(Missing Completely at Random,MCAR)。数据的缺失与不完全变量以及完全变量都是无关的。
    2)随机缺失(Missing at Random,MAR)。数据的缺失仅仅依赖于完全变量。
    3)非随机、不可忽略缺失(Not Missing at Random,NMAR,or nonignorable)。不完全变量中数据的缺失依赖于不完全变量本身,这种缺失是不可忽略的。
    从缺失值的所属属性上讲,如果所有的缺失值都是同一属性,那么这种缺失成为单值缺失,如果缺失值属于不同的属性,称为任意缺失。另外对于时间序列类的数据,可能存在随着时间的缺失,这种缺失称为单调缺失。
    空值语义
    对于某个对象的属性值未知的情况,我们称它在该属性的取值为空值(null value)。空值的来源有许多种,因此现实世界中的空值语义也比较复杂。总的说来,可以把空值分成以下三类:
    1)不存在型空值。即无法填入的值,或称对象在该属性上无法取值,如一个未婚者的配偶姓名等。
    2)存在型空值。即对象在该属性上取值是存在的,但暂时无法知道。一旦对象在该属性上的实际值被确知以后,人们就可以用相应的实际值来取代原来的空值,使信息趋于完全。存在型空值是不确定性的一种表征,该类空值的实际值在当前是未知的。但它有确定性的一面,诸如它的实际值确实存在,总是落在一个人们可以确定的区间内。一般情况下,空值是指存在型空值。
    3)占位型空值。即无法确定是不存在型空值还是存在型空值,这要随着时间的推移才能够清楚,是最不确定的一类。这种空值除填充空位外,并不代表任何其他信息。
    空值处理的重要性和复杂性
    数据缺失在许多研究领域都是一个复杂的问题。对数据挖掘来说,空值的存在,造成了以下影响:首先,系统丢失了大量的有用信息;第二,系统中所表现出的不确定性更加显著,系统中蕴涵的确定性成分更难把握;第三,包含空值的数据会使挖掘过程陷入混乱,导致不可靠的输出。

    数据挖掘算法本身更致力于避免数据过分适合所建的模型,这一特性使得它难以通过自身的算法去很好地处理不完整数据。因此,空缺的数据需要通过专门的方法进行推导、填充等,以减少数据挖掘算法与实际应用之间的差距。
    空值处理方法的分析比较
    处理不完备数据集的方法主要有以下三大类:
    (一)删除元组
    也就是将存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表。这种方法简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与信息表中的数据量相比非常小的情况下是非常有效的,类标号(假设是分类任务)缺少时通常使用。然而,这种方法却有很大的局限性。它是以减少历史数据来换取信息的完备,会造成资源的大量浪费,丢弃了大量隐藏在这些对象中的信息。在信息表中本来包含的对象很少的情况下,删除少量对象就足以严重影响到信息表信息的客观性和结果的正确性;当每个属性空值的百分比变化很大时,它的性能非常差。因此,当遗漏数据所占比例较大,特别当遗漏数据非随机分布时,这种方法可能导致数据发生偏离,从而引出错误的结论。
    (二)数据补齐
    这类方法是用一定的值去填充空值,从而使信息表完备化。通常基于统计学原理,根据决策表中其余对象取值的分布情况来对一个空值进行填充,譬如用其余属性的平均值来进行补充等。数据挖掘中常用的有以下几种补齐方法:
    (1)人工填写(filling manually)
    由于最了解数据的还是用户自己,因此这个方法产生数据偏离最小,可能是填充效果最好的一种。然而一般来说,该方法很费时,当数据规模很大、空值很多的时候,该方法是不可行的。
    (2)特殊值填充(Treating Missing Attribute values as Special values)
    将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。这样将形成另一个有趣的概念,可能导致严重的数据偏离,一般不推荐使用。
    (3)平均值填充(Mean/Mode Completer)
    将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。另外有一种与其相似的方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,缺失属性值的补齐同样是靠该属性在其他对象中的取值求平均得到,但不同的是用于求平均的值并不是从信息表所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。
    (4)热卡填充(Hot deck imputation,或就近补齐)
    对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。这个方法的缺点在于难以定义相似标准,主观因素较多。
    (5)K最近距离邻法(K-means clustering)
    先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。
    同均值插补的方法都属于单值插补,不同的是,它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。如果在以后统计分析中还需以引入的解释变量和Y做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。
    (6)使用所有可能的值填充(Assigning All Possible values of the Attribute)
    这种方法是用空缺属性值的所有可能的属性取值来填充,能够得到较好的补齐效果。但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大,可能的测试方案很多。另有一种方法,填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试,这样能够在一定程度上减小原方法的代价。
    (7)组合完整化方法(Combinatorial Completer)
    这种方法是用空缺属性值的所有可能的属性取值来试,并从最终属性的约简结果中选择最好的一个作为填补的属性值。这是以约简为目的的数据补齐方法,能够得到好的约简结果;但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大。另一种称为条件组合完整化方法(Conditional Combinatorial Complete),填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试。条件组合完整化方法能够在一定程度上减小组合完整化方法的代价。在信息表包含不完整数据较多的情况下,可能的测试方案将巨增。
    (8)回归(Regression)
    基于完整的数据集,建立回归方程(模型)。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关或预测变量高度相关时会导致有偏差的估计。
    (9)期望值最大化方法(Expectation maximization,EM)
    在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
    EM算法是一种在不完全数据情况下计算极大似然估计或者后验分布的迭代算法。在每一迭代循环过程中交替执行两个步骤:E步(Excepctaion step,期望步),在给定完全数据和前一次迭代所得到的参数估计的情况下计算完全数据对应的对数似然函数的条件期望;M步(Maximzation step,极大化步),用极大化对数似然函数以确定参数的值,并用于下步的迭代。算法在E步和M步之间不断迭代直至收敛,即两次迭代之间的参数变化小于一个预先给定的阈值时结束。该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
    (10)多重填补(Multiple Imputation,MI)
    多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。
    多重填补方法分为三个步骤:;为每个空值产生一套可能的填补值,这些值反映了无响应模型的不确定性;每个值都被用来填补数据集中的缺失值,产生若干个完整数据集合。;每个填补数据集合都用针对完整数据集的统计方法进行统计分析。;对来自各个填补数据集的结果进行综合,产生最终的统计推断,这一推断考虑到了由于数据填补而产生的不确定性。该方法将空缺值视为随机样本,这样计算出来的统计推断可能受到空缺值的不确定性的影响。该方法的计算也很复杂。
    多重插补方法分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。
    假设一组数据,包括三个变量Y1,Y2,Y3,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失Y3,C组缺失Y1和Y2。在多值插补时,对A组将不进行任何处理,对B组产生Y3的一组估计值(作Y3关于Y1,Y2的回归),对C组作产生Y1和Y2的一组成对估计值(作Y1,Y2关于Y3的回归)。
    当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测即,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组Y3的值,对C将利用 Y1,Y2,Y3它们的联合分布为正态分布这一前提,估计出一组(Y1,Y2)。
    上例中假定了Y1,Y2,Y3的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。
    多重插补和贝叶斯估计的思想是一致的,但是多重插补弥补了贝叶斯估计的几个不足。
    (1)贝叶斯估计以极大似然的方法估计,极大似然的方法要求模型的形式必须准确,如果参数形式不正确,将得到错误得结论,即先验分布将影响后验分布的准确性。而多重插补所依据的是大样本渐近完整的数据的理论,在数据挖掘中的数据量都很大,先验分布将极小的影响结果,所以先验分布的对结果的影响不大。
    (2)贝叶斯估计仅要求知道未知参数的先验分布,没有利用与参数的关系。而多重插补对参数的联合分布作出了估计,利用了参数间的相互关系。
    (11)C4.5方法
    通过寻找属性间的关系来对遗失值填充。它寻找之间具有最大相关性的两个属性,其中没有遗失值的一个称为代理属性,另一个称为原始属性,用代理属性决定原始属性中的遗失值。这种基于规则归纳的方法只能处理基数较小的名词型属性。
    就几种基于统计的方法而言,删除元组法和平均值法差于hot deck、EM和MI;回归是比较好的一种方法,但仍比不上hot deck和EM;EM缺少MI包含的不确定成分[46]。值得注意的是,这些方法直接处理的是模型参数的估计而不是空缺值预测本身。它们合适于处理无监督学习的问题,而对有监督学习来说,情况就不尽相同了。譬如,你可以删除包含空值的对象用完整的数据集来进行训练,但预测时你却不能忽略包含空值的对象。另外,C4.5和使用所有可能的值填充方法也有较好的补齐效果,人工填写和特殊值填充则是一般不推荐使用的。
    补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。这就是第三种方法:
    (三)不处理
    直接在包含空值的数据上进行数据挖掘。这类方法包括贝叶斯网络和人工神经网络等。
    贝叶斯网络是用来表示变量间连接概率的图形模式,它提供了一种自然的表示因果信息的方法,用来发现数据间的潜在关系。在这个网络中,用节点表示变量,有向边表示变量间的依赖关系。贝叶斯网络仅适合于对领域知识具有一定了解的情况,至少对变量间的依赖关系较清楚的情况。否则直接从数据中学习贝叶斯网的结构不但复杂性较高(随着变量的增加,指数级增加),网络维护代价昂贵,而且它的估计参数较多,为系统带来了高方差,影响了它的预测精度。当在任何一个对象中的缺失值数量很大时,存在指数爆炸的危险。
    人工神经网络可以有效的对付空值,但人工神经网络在这方面的研究还有待进一步深入展开。人工神经网络方法在数据挖掘应用中的局限性

    总结:大多数数据挖掘系统都是在数据挖掘之前的数据预处理阶段采用第一、第二类方法来对空缺数据进行处理。并不存在一种处理空值的方法可以适合于任何问题。无论哪种方式填充,都无法避免主观因素对原系统的影响,并且在空值过多的情形下将系统完备化是不可行的。从理论上来说,贝叶斯考虑了一切,但是只有当数据集较小或满足某些条件(如多元正态分布)时完全贝叶斯分析才是可行的。而现阶段人工神经网络方法在数据挖掘中的应用仍很有限。值得一提的是,采用不精确信息处理数据的不完备性已得到了广泛的研究。不完备数据的表达方法所依据的理论主要有可信度理论、概率论、模糊集合论、可能性理论,D-S的证据理论等。

    展开全文
  • 特征工程系列:数据清洗1... 缺失值清洗(删除、填充、不处理)7.1 数据填充方法(统计量统计、模型预测、插值法填充)7.1.2统计量统计7.1.3 模型预测填充7.1.4 插值法填充7.2 缺失总结 1.什么是特征工程 特征工程是利用

    1.什么是特征工程

    • 特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程

    • 数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限

    • 特征工程有相当重要的地位,是机器学习成果的关键

    • 特征工程包括:

      • 数据预处理 Data PreProcessing
      • 特征提取 Feature Extraction
      • 特征选择 Feature Selection
      • 特征构造 Feature construction

    2. 数据预处理

    数据预处理是特征工程的最重要的起始步骤,而数据清洗是数据预处理的重要组成部分,会直接影响机器学习的效果。

    3. 数据清洗拓扑图

    对数据进行重新审查和校验的过程,目的在于删除重复信息纠正存在的错误并提供数据一致性

    在这里插入图片描述

    4. 格式内容清洗

    • 格式内容问题产生的原因

      • 数据由人工手机或者用户填写而来
      • 不同版本的程序产生的内容或格式不一致
      • 不同数据源采集来的的数据内容和格式不一致
    • 时间、日期格式不一致清洗

      • 日期格式不一致:’2019-07-20’、’20190720’、’2019/07/20’、’20/07/2019’
      • 时间戳单位不一致
    • 数值格式不一致清洗

      • 小数、科学计数、中午数字
    • 全半角等显示格式不一致清洗

    • 内容中有不该存在的字符清洗

      • 如:身份证号中出现汉字
    • 内容与该字段应有内容不符清洗

      • 如:电话和身份证写错
    • 数据类型不符清洗

      • 如:金额特征是字符串类型,实际上应转为int/float

    5. 逻辑错误清洗

    • 数据重复清洗

      • 存在各个特征值完全相同的两条/多条数据,此时直接删除并只保留其中一条数据。

        df.drop_duplicates()
        
      • 数据不完全相同,但从业务角度看待数据是同一个数据, 如页面埋点时,进入页面和退出页面都会上报一次数据,只有时间不一样,其他字段相同,在统计pv/uv时应该进行去重。

        # 根据某个/多个特征值唯一区分每个样本,则可使用该特征/多个特征进行去重。
        df.drop_duplicates(subset=['ID'], keep='last')
        
    • 不合理值清洗

      • 根据业务常识,也可使用箱型图发现数据中不合理的特征值
    • 矛盾内容修正

      • 身份证号中的数据 和年龄不符

    6. 异常值清洗

    • 异常值是数据分布的常态,处于特定分布区域范围之外的数据通常被定义为异常或噪声

      • 伪异常” 由于特定的业务运营动作产生,是正常反应业务的状态,而不是数据本身的异常
      • 真异常” 不是由于特定的业务运营动作产生,而是数据本身分布异常,即离群点。

    6.1 异常值检查方法(3σ原则、箱线图分析)

    • 6.1.1 基于统计分析

      • 通过数据变异指标来发现数据中的异常点数据。常用的数据变异指标有极差、四分位数间距、均差、标准差、变异系数等等,变异指标的值大表示变异大、散布广;值小表示离差小,较密集。
    • 6.1.2 3σ原则

      • 若数据存在正态分布,在3σ原则下,异常值为一组测定值中与平均值的偏差超过3倍标准差的值。如果数据服从正态分布,距离平均值3σ之外的值出现的概率为P(|x - μ| > 3σ) <= 0.003,属于极个别的小概率事件。(pandas.mod)
      • 如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
        在这里插入图片描述
    • 6.1.3 箱线图分析

      • 箱线图提供了识别异常值的一个标准:如果一个值小于QL-1.5IQR或大于OU+1.5IQR的值,则被称为异常值
        • QL为下四分位数,表示全部观察值中有四分之一的数据取值比它小;
        • QU为上四分位数,表示全部观察值中有四分之一的数据取值比它大;
        • IQR为四分位数间距,是上四分位数QU与下四分位数QL的差值,包含了全部观察值的一半。
      • 箱型图判断异常值的方法以四分位数四分位距为基础,四分位数具有鲁棒性:25%的数据可以变得任意远并且不会干扰四分位数,所以异常值不能对这个标准施加影响。因此箱型图识别异常值比较客观,在识别异常值时有一定的优越性。
        在这里插入图片描述
    • 基于模型检测

      • 首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;
      • 如果模型是簇的集合,则异常是不显著属于任何簇的对象;
      • 在使用回归模型时,异常是相对远离预测值的对象。
      • 优点:有坚实的统计学理论基础
      • 缺点:高维数据,检测性差
    • 基于距离

      • 若一个数据对象和大多数点距离都很远,那这个对象就是异常
      • 距离度量方法:绝对距离(曼哈顿距离)欧式距离和马氏距离
      • 优点:比基于统计类方法简单
      • 缺点:时间复杂度比较高,对参数选择敏感,不能处理具有不同密度区域的数据集
    • 基于密度

      • 考察当前点周围密度,可以发现局部异常点,离群点的局部密度显著低于大部分近邻点,适用于非均匀的数据集
      • 优点:能处理具有不同密度区域的数据集
      • 缺点:时间复杂度比较高,对参数选择敏感

    6.2 数据光滑处理(分箱、回归)

    • 分箱

      • 分箱方法通过考察数据的“近邻”(即周围的值)来光滑有序数据的值,有序值分布到一些“桶”或箱中。由于分箱方法考察近邻的值,因此进行局部光滑。

      • 等高方法:每个bin中的个数相等;

      • 等宽方法:每个bin的取值间距相等;

      • 几种分箱光滑技术:

        • 用箱均值光滑:箱中每一个值被箱中的平均值替换;
        • 用箱中位数平滑:箱中的每一个值被箱中的中位数替换;
        • 箱边界平滑:箱中的最大和最小值同样被视为边界。箱中的每一个值被最近的边界值替换。
    • 回归

      • 用一个函数(如回归函数)拟合数据来光滑数据

    6.3 异常处理方法

    • 删除含有异常值的记录
    • 将异常值视为缺失值,交给缺失值处理方法来处理
    • 使用均值/中位数/众数来修正
    • 不处理

    7. 缺失值清洗(删除、填充、不处理)

    • 删除元组

      • 存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表。

      • 在对象有多个属性缺失值、被删除的含缺失值的对象比例小的情况下非常有效

      • 不足:当缺失数据所占比例较大,特别当遗漏数据非随机分布时,这种方法可能导致数据发生偏离,从而引出错误的结论

    • 数据填充

      • 一定的值去填充空值,从而使信息表完备化,通常基于统计学原理
      • 将未知值补以我们的主观估计值不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。
    • 不处理

      • 不处理,直接在包含空值的数据上进行数据挖掘的方法

    7.1 数据填充方法(统计量统计、模型预测、插值法填充)

    • 人工填充

    • 特殊值填充,将空值作为一种特殊的属性来处理

      • df[‘feature’].fillna(‘unkown’,inplace = True)
    • 7.1.2统计量统计

      • 若缺失率较低(小于95%)且重要性较低,则根据数据分布的情况进行填充
      • 平均值:对于数据符合均匀分布,用该变量的均值填补缺失值。
        • df[‘feature1’].fillna(df[‘feature1’].mean(),inplace = True)
      • 中位数:对于数据存在倾斜分布的情况,采用中位数填补缺失值。
        • df[‘feature2’].fillna(df[‘feature2’].median(),inplace = True)
      • 众数:离散特征可使用众数进行填充缺失值。
        • df[‘feature3’].fillna(df[‘feature3’].mode().iloc[0],inplace = True)
    • 7.1.3 模型预测填充

      • 使用待填充字段作为Label,没有缺失的数据作为训练数据,建立分类/回归模型,对待填充的缺失字段进行预测并进行填充

      • 最近距离近邻 KKN

        • from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
          
          def knn_missing_filled(x_train, y_train, test, k = 3, dispersed = True):
              '''
              @param x_train: 没有缺失值的数据集
              @param y_train: 待填充缺失值字段
              @param test: 待填充缺失值数据集
              '''
              if dispersed:
                  clf = KNeighborsClassifier(n_neighbors = k, weights = "distance")
              else:
                  clf = KNeighborsRegressor(n_neighbors = k, weights = "distance")
          
              clf.fit(x_train, y_train)
              return test.index, clf.predict(test)
          
      • 回归

        • 基于完整的数据集,建立回归方程
        • 将已知属性值代入方程来估计未知属性值,以此估计值来进行填充,常用线性回归
    • 7.1.4 插值法填充

      • 线性插值法

        • df['Feature'] = df['Feature'].interpolate(method='linear',limit_direction='both',axis=0)
          
      • 多重插补

        • 为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合;

        • 每个插补数据集合都用针对完整数据集的统计方法进行统计分析;

        • 对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。

      • 哑变量填充

        • 若变量是离散型,且不同值较少,可转换成哑变量

        • 若某个变量存在十几个不同的值,可根据每个值的频数,将频数较小的值归为一类’other’,降低维度。此做法可最大化保留变量的信息

        • # 原始数据
               SEX
          0    MALE
          1    FEMALE
          2    NaN
          3    FEMALE
          4    FEMALE
          5    NaN
          6    MALE
          
          df.fillna('NA', inplace=True)
          # 拆分维度
          df = pd.get_dummies(df['SEX'],prefix='IS_SEX')
          display(df)
          
          # 填充后
              IS_SEX_FEMALE     IS_SEX_MALE    IS_SEX_NA
          0    0                 1                0
          1    1                 0                0
          2    0                 0                1
          3    1                 0                0
          4    1                 0                0
          5    0                 0                1
          6    0                 1                0
          

    7.2 缺失总结

    在这里插入图片描述

    展开全文
  • 分段的原则有基于等距离、等频率或优化的方法。数据离散化的原因主要有以下几点: 1、算法需要  比如决策树、朴素贝叶斯等算法,都是基于离散型的数据展开的。如果要使用该类算法,必须将离散型的数据进行。有效的...

    **

    一、离散化原因

    **
      数据离散化是指将连续的数据进行分段,使其变为一段段离散化的区间。分段的原则有基于等距离、等频率或优化的方法。数据离散化的原因主要有以下几点:
    1、算法需要
      比如决策树、朴素贝叶斯等算法,都是基于离散型的数据展开的。如果要使用该类算法,必须将离散型的数据进行。有效的离散化能减小算法的时间和空间开销,提高系统对样本的分类聚类能力和抗噪声能力。
    2、离散化的特征相对于连续型特征更易理解,更接近知识层面的表达
      比如工资收入,月薪2000和月薪20000,从连续型特征来看高低薪的差异还要通过数值层面才能理解,但将其转换为离散型数据(底薪、高薪),则可以更加直观的表达出了我们心中所想的高薪和底薪。
    3、可以有效的克服数据中隐藏的缺陷,使模型结果更加稳定

    二、离散化的优势

    在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:
      1.离散特征的增加和减少都很容易,易于模型的快速迭代;
      2.稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
      3.离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
      4.逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
      5.离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
      6.特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
      7.特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。
    **

    三、离散化的方法

    **
    1、无监督学习方法
      等宽法
      等宽法即是将属性值分为具有相同宽度的区间,区间的个数k根据实际情况来决定。比如属性值在[0,60]之间,最小值为0,最大值为60,我们要将其分为3等分,则区间被划分为[0,20] 、[21,40] 、[41,60],每个属性值对应属于它的那个区间
      等频法
      等宽法即是将属性值分为具有相同宽度的区间,区间的个数k根据实际情况来决定。比如有60个样本,我们要将其分为k=3部分,则每部分的长度为20个样本。
      基于聚类的方法
      基于聚类的方法分为两个步骤,即:
    选定聚类算法将其进行聚类
    将在同一个簇内的属性值做为统一标记。
    注:基于聚类的方法,簇的个数要根据聚类算法的实际情况来决定,比如对于k-means算法,簇的个数可以自己决定,但对于DBSCAN,则是算法找寻簇的个数。
    2、有监督学习方法:
    1R方法、基于信息熵的方法、基于卡方的方法

    下面介绍一种常用便于理解的缺失值填充方案

    均值填充(Mean/Mode Completer)

    将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。另外有一种与其相似的方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,缺失属性值的补齐同样是靠该属性在其他对象中的取值求平均得到,但不同的是用于求平均的值并不是从信息表所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。

    ☆数据归一化就是把数据变成0-1之间的数,数据离散化就是把数据划分成几个区间,把连续数用区间123表示

    展开全文
  • ## 缺失值填充法 建模填充 用机器学习的方法 用不缺失的值来预测缺失的位置的数据 ### 以revol_util(信用账户的使用率)特征为例,导入sklearn的随机森林算法预测缺失值 from sklearn.ensemble import ...
  • 假如我们的数据集里面有一个缺失值,那么我们应该如何填充这个缺失值。假如我们先填充数据集然后再把数据分为训练集和测试集,那么这个时候出现一个违反原则的事情:我们用的训练集的数据竟然有一部分来自测试集,...
  • 评分模型的缺失值

    2019-06-24 09:21:16
    公式模型必须处理缺失值 构建评分模型过程中,建模属于...缺失值填充的合理性直接决定了评分模型的成败。模型按照形式可划分为公式模型与算法模型,不同形式的模型对缺失值的宽容程度不同。 公式模型必须处理缺...
  • 处理缺失值,过滤缺失值,补全缺失值,删除重复值
  • 缺失值和异常值处理

    千次阅读 2019-07-31 23:47:08
    填充、替换缺失值:fillna(method=‘pad’,inplace=True) method参数:pad/ffill 用之前的数据填充,backfill/bfill 用之后的数据填充 import pandas as pd import numpy as np from scipy import sta...
  • 但是在现实情况下,数据往往是存在一些缺失值的,怎么取处理这些缺失值,使数据表现更完美也是一个特别重要的步骤。 缺失值处理方法综述 缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或...
  • 缺失值处理——删除,填充(均值,众数,中位数,前后相邻值),插值(拉格朗日插值,牛顿插值) 异常值处理——describe进行描述性分析+散点图+箱型图定位异常值,处理方法:删除,视为缺失值 一、重复值处理 ① 先...
  • 机器学习缺失值处理方法汇总

    万次阅读 多人点赞 2017-11-26 19:44:48
    缺失值处理方法综述缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。缺失值的产生的原因多种多样,主要分为机械原因和人为原因。 机械...
  • 数据预处理_缺失值处理

    千次阅读 2019-07-01 23:05:55
    缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。缺失值的产生的原因多种多样,主要分为机械原因和人为原因。 机械原因是由于机械原因...
  • 机器学习模型支持缺失值的那些事儿机器学习模型如何支持缺失值支持缺失值的一些模型基于树类的模型随机森林XGBoost神经网络模型 之前读过一些别人的文章,对于有些模型可以支持缺失数据这件事有点印象,最近开始做一...
  • 缺失值处理方法

    2018-12-11 20:05:53
    缺失值处理方法综述 原文:https://blog.csdn.net/w352986331qq/article/details/78639233  缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不...
  • 缺失值的处理

    2020-04-20 15:03:40
    这种方法简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与信息表中的数据量相比非常小的情况下是非常有效的,类标号(假设是分类任务)缺少时通常使用。然而,这种方法却有很大的局限性。它是以减少历史...
  • 数据缺失机制以及缺失值处理方式

    万次阅读 2019-04-03 09:13:26
    将数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量,Little和Rubin定义了以下三种不同的数据缺失机制: 1.完全随机缺失(Missing Completely at Random, MCAR)。数据的缺失与...
  • 缺失值的处理方法

    千次阅读 2019-08-22 13:27:34
    本文针对缺失值和特殊值这种数据质量问题,进行了初步介绍并推荐了一些处理方法。 值得注意的是,这里所说的缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表...
  • 缺失值处理方法综述

    千次阅读 2018-07-09 15:48:30
    缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。缺失值的产生的原因多种多样,主要分为机械原因和人为原因。 机械原因是由于机械原因...
  • Python数据分析基础: 数据缺失值处理

    千次阅读 2020-10-31 21:56:01
    作者:东哥起飞 公众号:Python数据科学 圣人曾说过:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。 再好的模型,如果没有好...本篇我们来说说面对数据的缺失值,我们该如何处理。文末有.
  • 处理缺失值 实践中数值计算不可或缺,好在有很多方法可用,这个主题将介绍其中一些。不过,这些方法未必能解决你的问题。 scikit-learn有一些常见的计算方法,它可以对现有数据进行变换填补NA值。但是,如果...
  • 首先,缺失值的处理依据的大原则参考“重要性缺失率矩阵准则” 数据清洗的一些梳理 在本次的某旅游O2O网站酒店订单数据分析项目中,80%的字段有不同程度的数据缺失,缺失最多的字段缺失率达到了87% 采用的缺失...
  • 数据挖掘之缺失值处理

    千次阅读 2018-12-18 16:13:22
    本文针对缺失值和特殊值这种数据质量问题,进行了初步介绍并推荐了一些处理方法。 值得注意的是,这里所说的缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表...
  • 什么是缺失值 异常值(outlier):异常值是指数据集中存在不合理的值,又称离群点。一组测定值中与平均值的偏差超过两倍标准差的测定值,与平均值的偏差超过三倍标准差的测定值,称为高度异常的异常值。【百度...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,347
精华内容 1,338
关键字:

缺失值填充原则