精华内容
下载资源
问答
  • 缺失值处理

    2021-01-28 06:31:00
    importpandas as pdimportnumpy as npfrom sklearn.preprocessing importImputer#生成缺失数据df = pd.DataFrame(np.random.randn(6,4),columns=['col1','col2','col3','col4'])df.iloc[1:2,1] =np.nandf.iloc[4,3] ...

    importpandas as pdimportnumpy as npfrom sklearn.preprocessing importImputer#生成缺失数据

    df = pd.DataFrame(np.random.randn(6,4),columns=['col1','col2','col3','col4'])

    df.iloc[1:2,1] =np.nan

    df.iloc[4,3] =np.nanprint(df)#查看哪些数据缺失

    nan_all = df.isnull()#获得数据框中的NA值

    print(nan_all)#查看哪些列缺失

    nan_col1 = df.isnull().any()#获得含有NA的列

    nan_col2 = df.isnull().all()#获得全部为NA的列

    print(nan_col1)print(nan_col2)#丢弃缺失值

    df2 =df.dropna()print(df2)#使用sklearn将缺失值换成特定值

    nan_model = Imputer(missing_value='NaN',strategy='mean',axis=0)#建立替换规则:将值为Nan的缺失值用均值做替换

    nan_result = nan_model.fit_transform(df)#应用模型规则

    print(nan_result)#使用pandas将缺失值换为特定值

    nan_result_pd1 = df.fillna(method='backfill')#用后面的值替换缺失值

    nan_result_pd2 = df.fillna(method='bfill',limit=1)#用后面的值替换缺失值,限制每列只能替换一个缺失值

    nan_result_pd3 = df.fillna(method='pad')#用前面的值替换缺失值

    nan_result_pd4 = df.fillna(0)#用0替换缺失值

    nan_result_pd5 = df.fillna({'col2':1.1,'col4':1.2})#用不同值替换不同列的缺失值

    nan_result_pd6 = df.fillna(df.mean()['col2':'col4'])#用平均值代替,选择各自列的均值替换缺失值#打印输出

    print(nan_result_pd1)print(nan_result_pd2)print(nan_result_pd3)print(nan_result_pd4)print(nan_result_pd5)print(nan_result_pd6)

    import pandas as pd

    import numpy as np

    from sklearn.preprocessing import Imputer

    #生成缺失数据

    df = pd.DataFrame(np.random.randn(6,4),columns=['col1','col2','col3','col4'])

    df.iloc[1:2,1] = np.nan

    df.iloc[4,3] = np.nan

    print(df)

    #查看哪些数据缺失

    nan_all = df.isnull()#获得数据框中的NA值

    print(nan_all)

    #查看哪些列缺失

    nan_col1 = df.isnull().any()#获得含有NA的列

    nan_col2 = df.isnull().all()#获得全部为NA的列

    print(nan_col1)

    print(nan_col2)

    #丢弃缺失值

    df2 = df.dropna()

    print(df2)

    #使用sklearn将缺失值换成特定值

    nan_model = Imputer(missing_value='NaN',strategy='mean',axis=0)#建立替换规则:将值为Nan的缺失值用均值做替换

    nan_result = nan_model.fit_transform(df)#应用模型规则

    print(nan_result)

    #使用pandas将缺失值换为特定值

    nan_result_pd1 = df.fillna(method='backfill')#用后面的值替换缺失值

    nan_result_pd2 = df.fillna(method='bfill',limit=1)#用后面的值替换缺失值,限制每列只能替换一个缺失值

    nan_result_pd3 = df.fillna(method='pad')#用前面的值替换缺失值

    nan_result_pd4 = df.fillna(0)#用0替换缺失值

    nan_result_pd5 = df.fillna({'col2':1.1,'col4':1.2})#用不同值替换不同列的缺失值

    nan_result_pd6 = df.fillna(df.mean()['col2':'col4'])#用平均值代替,选择各自列的均值替换缺失值

    #打印输出

    print(nan_result_pd1)

    print(nan_result_pd2)

    print(nan_result_pd3)

    print(nan_result_pd4)

    print(nan_result_pd5)

    print(nan_result_pd6)

    展开全文
  • 缺失值处理 数据缺失的原因 缺失值的产生的原因多种多样,主要分为机械原因和人为原因。机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间...

    缺失值处理

    数据缺失的原因

    缺失值的产生的原因多种多样,主要分为机械原因和人为原因。机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据


    数据缺失的类型

    将数据集中不含缺失值的变量称为 完全变量 ,数据集中含有缺失值的变量称为 不完全变量

    完全随机缺失(MCAR)

    指的是数据的缺失是随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失

    随机缺失(MAR)

    指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关

    非完全随机缺失(MNAR)

    指的是数据的缺失依赖于不完全变量自身,如高收入人群不愿意提供家庭收入


    数据缺失的处理方法

    一、不处理

    有一些模型自身能够处理数据缺失的情况(如随机森林、xgboost),在这种情况下不需要对缺失数据做任何的处理,这种做法的缺点是在模型的选择上有局限

    二、删除

    import pandas as pd
    import numpy as np
    from sklearn.impute import KNNImputer
    from sklearn.ensemble import RandomForestClassifier
    
    df = pd.read_csv('person.csv')
    df
    

    在这里插入图片描述

    删除有缺失数据的样本

    df = pd.read_csv('person.csv')
    df = df.dropna(how='any')
    df
    

    在这里插入图片描述

    删除有过多缺失数据的特征

    df = pd.read_csv('person.csv')
    df = df.drop(['height','weight'], axis=1)
    df
    

    在这里插入图片描述

    三、填充

    固定值填充

    df = pd.read_csv('person.csv')
    df['sex'] = df['sex'].fillna('female')
    df
    

    在这里插入图片描述

    均值填充

    df = pd.read_csv('person.csv')
    df['height'] = df['height'].fillna(df['height'].mean())
    df
    

    在这里插入图片描述

    中位数填充

    df = pd.read_csv('person.csv')
    df['height'] = df['height'].fillna(df['height'].median())
    df
    

    在这里插入图片描述

    众数填充

    df = pd.read_csv('person.csv')
    df['age'] = df['age'].fillna(df['age'].mode()[0]) # The mode is the value that appears most often
    df
    

    在这里插入图片描述

    用上一个值填充

    df = pd.read_csv('person.csv')
    df['height'] = df['height'].ffill()
    df
    

    在这里插入图片描述

    用下一个值填充

    df = pd.read_csv('person.csv')
    df['weight'] = df['weight'].bfill()
    df
    

    在这里插入图片描述

    随机数填充

    df = pd.read_csv('person.csv')
    r = np.random.randint(2) % 2 # [0,2)
    df['sex'] = df['sex'].fillna('female' if r == 1  else 'male')
    df
    

    在这里插入图片描述

    插值法填充

    使用插值法可以计算缺失值的估计值,所谓的插值法就是通过两点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 估计中间点的值,假设 y = f ( x ) y=f(x) y=f(x) 是一条直线,通过已知的两点来计算函数 f ( x ) f(x) f(x) ,然后只要知道 x x x 就能求出 y y y ,以此方法来估计缺失值。当然我们也可以假设 f ( x ) f(x) f(x) 不是直线,而是其他函数

    df = pd.read_csv('person.csv')
    # 默认为线性插值,即在两个数据点之间连接直线,计算给定的插值点在直线上的值作为插值结果
    df['age'] = df['age'].interpolate() # nan=(24+26)/2=25
    df
    

    在这里插入图片描述

    KNN 填充

    df = pd.read_csv('person.csv')
    # 标签编码
    df['sex'] = df['sex'].map({'female': 1
                               ,'male': 0})
    df
    

    在这里插入图片描述

    # 可以使用交叉验证来选择k值
    imputer = KNNImputer(n_neighbors=1) # 默认每个邻域中的所有点的权重均相等
    df.iloc[:,1:] = imputer.fit_transform(df.iloc[:,1:])
    df
    

    在这里插入图片描述

    建模预测

    将缺失的属性作为预测目标来预测,将数据集按照是否含有特定属性的缺失值分为两类,利用现有的机器学习算法对预测数据集的缺失值进行预测。该方法的根本的缺陷是如果其他属性和缺失属性无关,则预测的结果毫无意义;但是若预测结果相当准确,则说明这个缺失属性是没必要纳入数据集中的;一般的情况是介于两者之间

    下面的案例中将选择 sex 特征作为预测目标,采用随机森林进行拟合得到预测值,其他缺失特征采用均值进行填充

    # 读入数据
    df = pd.read_csv('person.csv')
    
    # 标签编码
    df['sex'] = df['sex'].map({'female': 1
                               ,'male': 0})
    
    # 分离特征和标签
    feature = df.iloc[:,2:]
    df.iloc[:,2:] = feature.fillna(feature.mean()) # 其他缺失特征采用均值进行填充
    feature = df.iloc[:,2:] # age height weight
    label = df.iloc[:,1] # sex
    
    print(feature)
    print(label)
    

    在这里插入图片描述

    # 将sex非空划分为训练集
    sex_is_null = df['sex'].isnull()
    train_indices = sex_is_null == False
    X_train = feature[train_indices]
    y_train = label[train_indices]
    # 将sex为空划分为测试集
    X_test = feature[sex_is_null]
    
    print(X_train)
    print(y_train)
    print(X_test)
    

    在这里插入图片描述

    # 构建模型,训练并预测
    rf = RandomForestClassifier(n_estimators=10, class_weight='balanced', random_state=1)
    rf.fit(X_train, y_train)
    predictions = rf.predict(X_test)
    df.loc[sex_is_null,'sex'] = predictions
    df
    

    在这里插入图片描述

    高维映射

    将属性映射到高维空间,采用独热编码(one-hot)技术对属性进行编码。将包含 K 个离散取值范围的属性值扩展为 K+1 个属性值,若该属性值缺失,则扩展后的第 K+1 个属性值置为1。这种做法是最精确的做法,保留了所有的信息,也未添加任何额外信息,若预处理时把所有的变量都这样处理,会大大增加数据的维度。这样做的好处是完整保留了原始数据的全部信息,不用考虑缺失值;缺点是计算量大大提升,且只有在样本量非常大的时候效果才好

    df = pd.read_csv('person.csv')
    dummy_sex = pd.get_dummies(df['sex'], prefix='sex', dummy_na=True)
    df = pd.concat([df, dummy_sex], axis=1)
    df = df.drop('sex', axis=1)
    df
    

    在这里插入图片描述

    热卡填充

    对于一个包含空值的对象,热卡填充法(Hot deck imputation)在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计,但缺点在于难以定义相似标准,主观因素较多

    极大似然估计

    在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证极大似然估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂

    多重插补

    多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值


    总结

    当我们决定采用何种缺失值处理方式时,要综合考虑数据缺失的原因、数据缺失的类型、数据缺失的处理方法的特点、样本量等因素


    本文到此结束,后续将会不断更新,如果发现上述有误,请各位大佬及时指正!如果觉得写得还可以,欢迎点赞收藏加关注,谢谢!

    展开全文
  • 数据处理之缺失值处理

    千次阅读 2021-03-10 17:44:03
    缺失值是指粗糙数据中由于缺少信息而造成的数据的删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。 值得注意的是,这里所说的缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值...

    在数据分析工作中,数据准备(Data Preparation,包括数据的获取、清洗、转换和集成)常常占据了70%左右的工作量。没有高质量的数据,就没有高质量的数据挖掘结果,数据缺失是数据分析中经常遇到的问题之一。

    缺失值是指粗糙数据中由于缺少信息而造成的数据的删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。
    值得注意的是,这里所说的缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表示数值不存在)。如果在数据库中缺乏相关的数据说明,常常需要花费更多的精力来发现这些数值的特殊含义。而如果我们漠视这些数值的特殊性,直接拿来进行数据分析,那么很可能会得到错误的结论。
    还有一种缺失值的情况,是因为我们要求统计的时间窗口并非对所有数据都适合。例如,我们希望计算出“客户在以前六个月内的最大存款余额”,对于那些建立账户尚不满六个月的客户来说,统计出来的数值与我们想要得到的就可能存在差距。

    当数据缺失比例很小时,可直接将缺失记录删除或进行手工处理。但在实际业务数据中,往往缺失数据占有相当的比重,这种情况下如果手工处理非常低效,如果直接删除缺失记录,则会丢失大量信息,使不完全观测数据与完全观测数据间产生系统差异,这样的数据得出的分析结论也会存在较大偏差。

    造成数据缺失的原因

    实际业务中的数据异常杂乱,数据缺失的情况经常发生甚至是不可避免的。造成数据缺失的原因是多方面的:

    • 信息暂时无法获取。例如在医疗数据库中,并非所有病人的所有临床检验结果都能在给定的时间内得到,就会致使一部分数据值空缺。
    • 信息被遗漏。可能是因为输入时认为不重要、忘记填写了或对数据理解错误而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人为因素等原因而丢失。
    • 有些对象的某个或某些属性是不可用的。如一个未婚者的配偶姓名、一个儿童的固定收入状况等。
    • 有些信息(被认为)是不重要的。如一个属性的取值与给定语境是无关的,或训练数据库的设计者并不在乎某个属性的取值(称为dont-care value)。
    • 获取这些信息的代价太大。
    • 系统实时性能要求较高,即要求得到这些信息前迅速做出判断或决策。

    数据缺失机制

    在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量。从缺失值的分布可以分为完全随机缺失,随机缺失和完全非随机缺失 。

    完全随机缺失(missing completely at random,MCAR)

    数据的缺失不依赖于自身或者其他变量,完全是随机的,与不完全变量以及完全变量都是无关的,所以它对整个数据的影响没有任何的偏好性,呈现均一分布。如家庭地址的缺失。

    随机缺失(Missing at Random,MAR)

    数据的缺失不是完全随机的,该类数据的缺失依赖于其他完全变量。例如财务数据缺失情况与企业的大小有关。

    非随机缺失(missing not at random,MNAR)

    数据的缺失与不完全变量自身的取值有关。如高收入人群的不原意提供家庭收入。

    对于随机缺失和非随机缺失,直接删除缺失记录是不合适的。随机缺失可以通过已知变量对缺失值进行估计;而非随机缺失还没有很好的解决办法。

    空值的含义

    对于某个对象的属性值缺失或未知的情况,该属性的取值存储为空值(null value)。空值可以分成以下三类:

    • 不存在型空值。即无法填充的值,或称对象在该属性上无法取值,如一个未婚者的配偶姓名等。

    • 存在型空值。即对象在该属性上取值是存在的,但暂时无法知道。一旦对象在该属性上的实际值被确知以后,就可以用实际值来取代原来的空值,使信息趋于完全。

    • 占位型空值。即无法确定是不存在型空值还是存在型空值,这要随着时间的推移才能够清楚,是最不确定的一类。这种空值的填充只表示填充,并不代表任何其他信息。

    缺失值处理的必要性

    数据缺失在许多研究领域都是一个复杂的问题。对数据挖掘来说,缺失值的存在造成了以下影响:

    • 丢失了大量的有用信息;
    • 数据模型中所表现出的不确定性更加显著,蕴涵的确定性成分更难把握;
    • 包含空值的数据会使挖掘过程陷入混乱,导致不可靠的输出结果。

    数据挖掘算法本身更致力于避免数据过分拟合所建的模型,这一特性使得它难以通过自身的算法去很好地处理不完整数据。因此,缺失值需要通过一些的方法进行推导、填充等,以减少数据挖掘算法与实际应用之间的差距。

    缺失值统计

    SQL统计缺失值:

    select sum(comm is null) from emp;
    

    Python统计缺失值:

    missing_value_formats = ["NA"]
    df = pd.read_csv("employee.csv", na_values = missing_value_formats)
    df.isna().sum()
    

    缺失值处理方法

    处理缺失数据的方法主要有以下三种:删除、填充、不处理。

    删除

    也就是将存在缺失值的样本(行)或特征(列)删除,从而得到一个完整的数据集 。

    优点:这种方法简单易行, 在对象有多个属性缺失值、被删除的含缺失值的对象与初始数据集的数据量相比非常小的情况下非常有效。
    缺点:当缺失数据所占比例较大,特别当缺失数据非随机分布时,这种方法可能导致数据发生偏离、模型性能下降。

    SQL删除缺失记录:

    delete from emp where mgr is null;
    

    Python删除缺失记录:

    df.dropna(axis=0,subset=['mgr'],inplace=True)
    

    填充

    这类方法是用一定的值去填充空值,从而使数据集完整化。通常基于统计学原理, 根据初始数据集中其余对象取值的分布情况来对一个缺失值进行填充 。数据挖掘中常用的有以下几种补齐方法:

    人工填写(filling manually)

    由于最了解数据的还是用户自己,因此用户自己填补缺失数据产生偏离的可能性最小,可能是填充效果最好的一种方法。然而当数据规模很大、空值很多的时候,该方法费时费力,是不可行的。

    特殊值填充(Treating Missing Attribute values as Special values)

    将空值作为一种特殊值来处理,它不同于其他的任何属性值 。如所有的空值都用“unknown”填充,或是对于全是正数的数组填充为“-1”,或者极大数、极小数等。这样也可能导致严重的数据偏离,一般不推荐使用 。

    均值填充(Mean/Mode Completer)

    将数据集中的属性分为数值属性和非数值属性来分别进行处理 。
    如果空值是数值型的,就根据该属性其他非空取值的平均值来填充该缺失值;如果空值是非数值型的,就用该属性其他非空取值的众数(即出现频率最高的值)来补齐该缺失值。
    与其相似的另一种方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,用于求平均的值并不是从数据集的所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。

    这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。
    SQL均值填充:

    select ifnull(comm,(select avg(comm) from emp)) from emp;
    

    Python均值填充:

    df['comm'].fillna(df['comm'].mean())
    

    热卡填充(Hot deck imputation,或就近补齐)

    对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。这个方法的缺点在于难以定义相似标准,主观因素较多。如收入取值为空的记录,可以找出与该用户信息相似度最高的用户的收入来填充,那么城市、职业、工作年限等应占更大权重。

    K近邻填充(KNN)

    先根据欧式距离来确定距离具有缺失值的样本最近的K个样本,将这K个样本的属性值加权平均来估计该样本的缺失值。
    该方法主要是通过预先设定的K个邻居,根据这些邻居的信息推算出缺失值的大小。一般的处理流程是先计算含有缺失值的目标对象与其他对象之间的距离(一般计算的是欧氏距离),计算完成后,选择K个(K值是我们预先设定的)距离最近的对象,然后将对应位置的数值进行平均或者加权,这样计算出的数值用来填充该缺失值。

    使用所有可能的值填充(Assigning All Possible values of the Attribute)

    用缺失值的所有可能的属性取值来填充,能够得到较好的填充效果。但是,当数据量很大或者缺失值较多时,可能的测试方案很多,其计算代价也很大。

    组合完整化填充(Combinatorial Completer)

    用缺失值的所有可能的属性取值来试,并从最终属性的约简结果中选择最好的一个作为填补的属性值。这是以约简为目的的数据补齐方法,能够得到好的约简结果;但是,当数据量很大或缺失值较多时,其计算代价也很大。

    回归(Regression)

    基于完整的数据集,建立回归模型。对于包含缺失值的记录,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。但是当变量不是线性相关或预测变量高度相关时会导致有偏差的估计。

    期望值最大化(Expectation maximization,EM)

    在缺失类型为随机缺失的情况下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。
    该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。
    EM算法是一种在不完整数据情况下计算极大似然估计或者后验分布的迭代算法。在每一迭代循环过程中交替执行两个步骤:E步(Excepctaion step,期望步),在给定完整数据和前一次迭代所得到的参数估计的情况下计算完整数据对应的对数似然函数的条件期望;M步(Maximzation step,极大化步),用极大化对数似然函数以确定参数的值,并用于下步的迭代。算法在E步和M步之间不断迭代直至收敛,即两次迭代之间的参数变化小于一个预先给定的阈值时结束。该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。

    多重插补(Multiple Imputation,MI)

    多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。
    多重插补方法分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。
    该方法将缺失值视为随机样本,这样计算出来的统计推断可能受到缺失值的不确定性的影响。该方法的计算也很复杂。

    C4.5方法

    通过寻找属性间的关系来对缺失值进行填充。它寻找具有最大相关性的两个属性,其中没有缺失值的一个称为代理属性,另一个称为原始属性,用代理属性决定原始属性中的缺失值。这种基于规则归纳的方法只能处理基数较小的名义型属性。

    以上多种处理方法中,基于统计学原理而言,删除和均值填充法差于热卡填充法、期望值最大化方法和多重填充法;回归是比较好的一种方法,但仍比不上热卡填充法、期望值最大化方法;期望值最大化方法缺少多重填充法所包含的不确定成分。值得注意的是,这些方法直接处理的是模型参数的估计而不是缺失值本身。它们合适于处理无监督学习的问题,而对有监督学习来说,情况就不尽相同了。譬如,你可以删除包含空值的记录用完整的数据集来进行训练,但预测时你却不能忽略包含空值的记录。另外,C4.5和使用所有可能的值填充方法也有较好的补齐效果,人工填写和特殊值填充一般是不推荐使用的。

    不处理

    填补处理只是将未知值以我们的主观估计值来填充补齐,不一定完全符合客观事实,在对不完整信息进行填补的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使数据挖掘产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对数据信息进行处理。

    不处理缺失值,直接在包含空值的数据上进行数据挖掘的方法包括贝叶斯网络和人工神经网络等算法。
    贝叶斯网络提供了一种自然的表示变量间因果信息的方法,用来发现数据间的潜在关系。在这个网络中,用节点表示变量,有向边表示变量间的依赖关系。贝叶斯网络仅适合于对领域知识具有一定了解的情况,至少对变量间的依赖关系较清楚的情况。否则直接从数据中学习贝叶斯网的结构不但复杂性较高(随着变量的增加,指数级增加),网络维护代价昂贵,而且它的估计参数较多,为系统带来了高方差,影响了它的预测精度。
    人工神经网络可以有效的对付缺失值,但人工神经网络在这方面的研究还有待进一步深入展开。

    另一种方法是引入哑变量,将变量映射到高维空间。比如性别,有男、女、NULL三种情况,则映射成三个变量:是否男、是否女、是否缺失。连续型变量也可以这样处理。比如Google、百度的CTR预估模型,预处理时会把所有变量都这样处理,最后数据达到几亿维。
    这样做的好处是完整保留了原始数据的全部信息、不用考虑缺失值、不用考虑线性不可分之类的问题。缺点是计算量过大,而且只有在样本量非常大的时候效果才好,否则可能会因为过于稀疏,导致效果很差。

    总结

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

    展开全文
  • 数据清洗_缺失值处理

    2021-09-08 17:22:45
    原文链接:风一带你一起学习数据清洗_缺失值处理 碎碎念念:大家好!我是风一、有人调侃做数据的、80%的时间都是花在数据清洗上、虽然有时很想反驳一下、但现实确实经常是如此,那么何为数据清洗?需要处理的数据...

    原文链接:风一带你一起学习:数据清洗_缺失值处理

    碎碎念念:大家好!我是风一、有人调侃做数据的、80%的时间都是花在数据清洗上、虽然有时很想反驳一下、但现实确实经常是如此,那么何为数据清洗?需要处理的数据主要又有哪些?那么就让我们开始吧!

    所谓的清洗,是对数据集通过丢弃、填充、替换、去重等操作,达到去除异常、纠正错误、补足缺失的目的;在数据清洗的过程中、主要需要处理的有缺失值、异常值和重复值,以下篇幅为数据缺失值处理。

    一、数据缺失的两种情况:

    一种是行记录的缺失,这种情况又称为数据记录的丢失;另一种是数据列值的缺失,即由于各种原因导致的数据记录中某些列的值空缺 。

    二、数据缺失的常用处理思路

    缺失的数据记录通常都是无法找回的、那么针对数据列类型的缺失值数据、需如何处理?

    • 直接丢弃:也就是删除带有缺失值的行记录(整行删除)或者列字段 (整列删除),通过直接删除这种方法非常简单明了、处理起来也特别的方便,但删除就意味着会消减数据的维度、特征;尤其是存在大量的缺失值 或者 带有缺失值的数据记录存在着明显的数据分布规律或特征,这些场景下都不宜直接丢弃缺失值。

    • 补全缺失值:相比直接删除而言、补全是更常用的缺失值处理方法。通过统计值(均值、中位数等)、预测值、专家补全等方法将缺失的数据补全、使数据达成一个完整的数据结构、对于后续的数据处理、分析和建模至关重要。

    • 真值转化法:在很多场景中、是无法得知缺失值的分布规律,并且无法直接对缺失值做补全删除等处理;那么我们认为数据缺失也是一种规律,去承认缺失值的存在,比如用户性别字段、部分数据的性别是不全的,但又不能直接丢弃或者补全、那么就可以将其中的值分布状态转换为多个变量的真值状态(转换前:一个字段(值为 男、女、未知); 转换后:多个字段 、男 (1 或 0)、 女 (1 或 0)、 未知 (1 或 0) )。

    • 不做任何处理:一般而言、这类缺失值不涉及到业务所比较关键的字段 或者不影响到后期的数据分析和建模应用,很多模型对于缺失值有容忍度或灵活的处理方法,比如:KNN、决策树等等。

    三、代码实练

    在缺失值的处理上、主要配合使用 sklearn.preprocessing 中 的 Imputer 类、Pandas 和 Numpy。

    3.1.导入所需库并生成缺失数据

    import pandas as pd
    import numpy as np
    # from sklearn.preprocessing import Imputer # 老版本
    
    # Sklearn 专门处理缺失值的模块、官网地址:https://www.jianshu.com/p/2c59147e1df1
    from sklearn.impute import SimpleImputer as Imputer
    
    df = pd.DataFrame(np.random.randn(6, 4), columns = ['col1', 'col2', 'col3', 'col4'])
    df.iloc[1:2, 1] = np.nan
    df.iloc[4, 3] = np.nan
    
    df
    

    图片

    3.2.判断缺失值

    nan_all = df.isnull()  # 获取所有数据框中的 N 值(N值为 Trure)
    print(nan_all)
    print('*'*30)
    
    col_all = df.isnull().sum()  # 统计每列缺失值的数量
    print(col_all)
    print('*'*30)
    
    nan_col1 = df.isnull().all() # 获得全部为 NA 的列
    print(nan_col1)
    print('*'*30)
    
    nan_col2 = df.isnull().any() # 获得含有 NA 的列
    print(nan_col2)
    
        col1   col2   col3   col4
    0  False  False  False  False
    1  False   True  False  False
    2  False  False  False  False
    3  False  False  False  False
    4  False  False  False   True
    5  False  False  False  False
    ******************************
    col1    0
    col2    1
    col3    0
    col4    1
    dtype: int64
    ******************************
    col1    False
    col2    False
    col3    False
    col4    False
    dtype: bool
    ******************************
    col1    False
    col2     True
    col3    False
    col4     True
    dtype: bool
    

    3.3.丢弃缺失值

    df2 = df.dropna(how = "any")   # 直接删除含有 NA 的行记录
    print(df2)
    print('*'*30)
    
    df3 = df.copy()
    df3.iloc[1:2,:] = np.nan  # 将第二行都设置为 NA
    df3 = df3.dropna(how = "all")  # 删除全部为 NA 值的行记录
    print(df3)
    
           col1      col2      col3      col4
    0 -0.530849 -0.587055  0.754068  0.597813
    2  0.146497  0.625747 -1.663007 -1.356476
    3 -0.699932  0.390106  1.342162 -2.133165
    5 -0.549286 -0.300173  1.889540  1.178008
    ******************************
           col1      col2      col3      col4
    0 -0.530849 -0.587055  0.754068  0.597813
    2  0.146497  0.625747 -1.663007 -1.356476
    3 -0.699932  0.390106  1.342162 -2.133165
    4 -0.395517 -0.172803  0.233490       NaN
    5 -0.549286 -0.300173  1.889540  1.178008
    
    df
    

    3.4.通过 sklearn 的数据预处理方法对缺失值进行处理

    # 官网地址:https://scikit-learn.org/stable/modules/impute.html
    nan_model = Imputer(missing_values = np.nan, strategy = 'mean') # 建立替换规则:将值为 NaN 的缺失值以均值做替换
    nan_result = nan_model.fit_transform(df) 
    print(nan_result)
    
    [[-0.53084907 -0.58705498  0.75406835  0.59781252]
     [ 0.33872081 -0.00883559  2.19513579  1.79174735]
     [ 0.14649702  0.62574696 -1.66300695 -1.35647607]
     [-0.69993206  0.39010577  1.34216247 -2.13316465]
     [-0.39551654 -0.17280315  0.23349011  0.01558536]
     [-0.54928642 -0.30017256  1.88954049  1.17800765]]
    

    注意事项:missing_values 默认空值 np.nan, 指定空值需 np.nan、直接写 ‘NaN’ 是不一样的、会报错。

    strategy参数:

    图片:

    3.5.使用 Pandas 做缺失值处理

    Pandas 对缺失值的处理方法是 df.fillna(),该方法中最主要的两个参数是 value 和 method。前者通过固定(或手动指定)的值替换缺失值,后者使用 pandas 提供默认方法替换缺失值。

    ''' DataFrame
    def fillna(
            self,
            value=None, # 指定填充的值,可以是一个标量,或者字典等
            method=None, # 指定填充的方法; [pad/ffill、 backfill/bfill、 None]
            axis=None, # 指定轴
            inplace=False, # 是否将结果赋值给原变量
            limit=None,  # 限制每列替换缺失值的个数
    ):
    
    '''
    
    nan_result_pd1 = df.fillna(method = 'backfill')  # 使用后面的值替换缺失值
    nan_result_pd1
    
           col1      col2      col3      col4
    0 -0.530849 -0.587055  0.754068  0.597813
    1  0.338721  0.625747  2.195136  1.791747
    2  0.146497  0.625747 -1.663007 -1.356476
    3 -0.699932  0.390106  1.342162 -2.133165
    4 -0.395517 -0.172803  0.233490  1.178008
    5 -0.549286 -0.300173  1.889540  1.178008
    

    四、总结

    在现实数据中、很容易出现缺失数据,尤其是数据维度特别大的情况下;那么针对不同类型、不同的业务数据当然会有不同的方法;有些可以确认无效数据可以直接删除、但往往大部分都是无法直接这样简单明了处理、需结合实际业务以及数据结构进行处理、这里风一就不一一展开详解。

    说明:文章大部分篇幅来源于宋老师(宋天龙)所著书籍《Python数据分析与数据化运营》的读书笔记以及相应的学习扩展补充。

    作者:在成长的风一
    文章首发:公众号【在成长的风一】
    未经允许禁止转载,需要转载请微信联系授权(微信号:Fy180920)
    
    展开全文
  • 处理缺失值的意义 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一。当缺失比例很小时,可直接对缺失记录进行舍弃或进行手工处理。但在实际数据中,往往缺失数据占有相当...
  • 数据分析中缺失值处理方法1、缺失值的分类按照数据缺失机制可分为:(1)完全随机缺失(missing completely at random, MCAR)所缺失的数据发生的概率既与已观察到的数据无关,也与未观察到的数据无关.(2)随机缺失...
  • 在机器学习、深度学习中, 训练模型之前必须有足够的数据, 但遗憾的是数据可能存在缺失值缺失值可能是数值,也可能是字符串,对于这些缺失值该如何处理呢,是经常困惑我的问题,故将学习的内容总结到该博客中。...
  • pandas-缺失值处理

    2020-12-31 10:39:42
    缺失值是指数据集中的某些观测存在遗漏的指标值,缺失值的存在同样会影响到数据分析和挖掘的结果。一般而言,当遇到缺失值是可以采三种方法处置:删除法,替换法和插补法。1.删除法使用情况:当确实的观测比例非常低...
  • 在数据采集准备阶段,往往由于人为或数据本身的因素导致最终的数据集含有缺失值,此时我们就面临一个问题,缺失数据如何去处理?其实无非就两种选择, 一是删除缺失值所在的样本数据或列列数据; 二是填充缺失数据...
  • SPSS缺失值处理

    千次阅读 2021-02-22 18:43:47
    均值替换法: 适用于连续数据(定量数据),缺失数据占比不超过10%。 可直接生成新的数据列 ...最优的缺失值处理法。(是先求期望,然后再求极大似然估计值) 在缺失数据较多的情形,收敛的速度..
  • 数据分析之缺失值填充(方法+代码)数据缺失的原因数据缺失的类型缺失处理方式1:删除方式2:常量填充方式3:插值填充方式4:KNN填充方式5:随机森林填充效果预览 圣人曾说过:数据和特征决定了机器学习的上限,而...
  • python缺失值处理的方法

    千次阅读 2021-11-14 19:52:15
    其他数据文件由于缺失值比较少甚至没有缺失值,我就人为的制造缺失值,建议用代码实现这一过程。 目录 1、删除元组 (1)删除存在缺失值的个案 (2)删除含特殊值的特征 2、不处理 3、缺失值插补 (1)人工补...
  • DataFrame(7):缺失值处理 1、替换字符 例如把字符‘A’ 替换为字符‘B’ data.replace(to_replace="A", value='B') to_replace:替换前的值, value:替换后的值 2、判断缺失值是否存在 (1)pd.notnull(dataframe)...
  • SQL: 缺失值处理

    2021-08-23 21:28:32
    直接把缺失值过滤掉。 对缺失值进行填充。 缺失值的三种表现形式: 空格 null 空值 三种缺失值的区别: 空格 和 null: 在对应的单元格里是有值的 空值: 表示这个单元格什么都没有。 ...
  • 写在前面上周我们读取完了数据(Python数据分析实战:获取数据),下面就要对数据进行清洗了,首先是对缺失值处理缺失值也就是空值,先找出来再处理。查看缺失值可以使用isnull方法来查看空值,得到的结果是布尔值...
  • spss缺失值处理

    2021-03-16 15:55:28
    分析----缺失值分析 期望最大化法(EM): 1.用期望填充 2.极大似然估计,对其迭代进行估计,使得误差一步步减小 其他有诸如回归分析法、期望替代法等 转换—替换缺失值
  • 缺失值处理: 造成数据缺失的原因是多方面的,主要可能有以下几种: 有些信息暂时无法获取,致使一部分属性值空缺出来。 有些信息因为一些人为因素而丢失了。 有些对象的某个或某些属性是不可用的。如一个未婚者的...
  • 机器学习22_决策树的连续值、缺失值处理(2021.09.03) 一. 决策树连续值处理 - - - 引言: 昨天讨论过的所生成的决策树,都是基于一些离散性的数据而生成的(例如上图蓝色圈圈内部有关色泽的属性);但是现实任务...
  • 数据处理——缺失值处理

    千次阅读 2020-12-19 00:38:09
    importpandas as pddf = pd.DataFrame({'一班':[90,80,66,75,99,55,76,78,98,None,90],'二班':[75,98,100,None,77,45,None,66,56,80,57],'三班':[45,89,77,67,65,100,None,75,64,88,99]})1缺失值处理#如何判断缺失值...
  • 1.部分替换 直接指定方式 :to_replace 与 value 配套使用,表示 old -> new 单独:to_replace = old, value = new 相同长度list:to_replace = [old1, old2],value = [new1, new2] list->单: to_...
  • 无论是机器学习、数据挖掘、数据分析,对数据的处理都是至关重要的一步,数据预处理做的好,往往让我们的数据分析有事半功倍的效果,其中正确处理缺失值更是重中之重。 造成数据缺失的原因 信息暂时无法获取。网购...
  • 公众号后台回复“图书“,了解更多号主新书内容作者:严小样儿来源:统计与数据分析实战前言数据缺失值处理,在数据分析前期,即数据处理过程中占着重要的地位,在数据分析面试中被问到的概率也是极...
  • Pandas知识点-缺失值处理

    千次阅读 2021-05-06 22:22:16
    Pandas知识点-缺失值处理
  • 缺失值处理 异常值处理 一.1、缺失值处理 1、缺失的原因: 人为疏忽、机器故障 人为刻意隐瞒部分数据 数据本身不存在 系统实时性高 历史局限性导致数据收集不完整 2、数据缺失类型: 完全随机缺失 随机缺失 非随机...
  • 完全去重指的是消除完全重复的数据,这里提到的完全重复数据指的是数据表记录字段完全一样的数据。例如,现在有两个表格分别记录的不同年份的用户信息,现要求合并统计所有用户信息,发现合并后的表格存在完全重复...
  • 缺失值处理1.1 导入数据1.2 观察数据1.3 缺失值处理方法2. 异常值处理2.1 异常值---强异常值的处理2.2 特征筛选(Filter过滤法)2.3 共线性2.4 logistics、对数、指数、逆、幂、曲线的绘制3.编码3.1 异常值---多变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,010
精华内容 42,804
关键字:

缺失值处理