1、 缺失值处理
首先根据df.info( )可查看各列非空值个数;df.isnull( ).sum( )可查看数据框各列缺失值个数
>>>import pandas as pd
>>>df=pd.read_csv("train.csv")
#看各列非空值个数
>>>df.info()
#查看数据框各列缺失值个数
>>>df.isnull().sum()
1.1删除
适合缺失值数量较小(例如占比在5%以下),并且是随机出现的,删除它们对整体数据影响不大
#删除包含缺失值的行
df.dropna()
#删除包含缺失值的列
df.drop(axis=1)
#只删除所有特征值均为缺失值的行
df.dropna(how=‘all‘)
#只删除非缺失值在阈值以下的行
df.dropna(thresh=4)
若某特征值的缺失值占比过大(如超过80%),考虑删除此特征,否则会给模型带入较大噪声,造成不良影响
缺点:以减少历史数据来换取信息的完备,会造成资源的浪费,丢弃了大量隐藏在这些对象中的信息
1.2使用均值或条件均值填充
优点:用现存数据的多数信息来推测缺失值,不会让数据严重失真,避免产生有偏估计
缺点:可能使变量的均值趋近于填充值,方差趋近于0,从而破坏了数据的随机性,使得整个样本的信息量大幅下降
1.3使用众数、中位数、随机值、上下数据、分位数填充
优点:处理简单、快速
缺点:易产生有偏估计,形成人为噪声
1.4 利用其它特征值建立模型预测缺失值
构建回归、K-Means、贝叶斯、决策树、随机森林等模型归纳确定。
优点:利用了数据集中尽量多的信息,预测值可能接近于真实值,一定程度上能提高模型性能
缺点:可能在模型中引入自相关或有偏估计,给分析造成障碍。若其它特征值与预测特征值无关,则预测结果无意义;若预测结果相当准确,则该特征值不应加入模型
1.5把变量映射到高维空间(或引入虚拟变量dummy variable):
比如性别有男、女、缺失三种情况,则映射成3个变量:是否男、是否女、是否缺失。
优点:完整保留了原始数据的全部信息、不用考虑缺失值、不用考虑线性是否可分等问题
缺点:数据维度的大幅上升使得计算量显著上升。而且只有在样本量足够大时才有较好效果,否则会因为过于稀疏导致效果不佳。
1.6 期望值最大化方法(Expectation maximization,EM)
假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计。对于极大似然的参数估计实际中常采用的计算方法是期望值最大化。
优点:利用了数据集中尽量多的信息,预测值可能接近于真实值,一定程度上能提高模型性能
缺点:只适用于大样本,足够数量的有效样本才能保证极大似然估计值是渐近无偏的并服从正态分布。而且这种方法可能会陷入局部极值,同时计算量较大使得收敛速度较慢。
1.7热卡插补
热卡插补法是依照辅助变量的不同条件,将未出现缺失值的观察值分类成若干的“插补单元”,每一个出现缺失值的观察值,依据辅助变量的条件,从相对应的插补单元中找寻一个观察体,以其观测所得的变量数值代替缺失值。
优点:利用数据间的关系来进行缺失值插补,有较高准确率;特征的整体方差与插补前比较接近,避免数据信息量的下降
缺点:难以定义相似标准,主观因素较多;特征数量较多时,难以找到与需要插补样本相似的样本,计算量较大,比较耗时
1.8 人工填写和特殊值填充一般不推荐使用
以上方法各有优缺点,具体情况要根据实际数据分分布情况、倾斜程度、缺失值所占比例等等来选择方法。一般而言,建模法是比较常用的方法,它根据已有的值来预测缺失值,准确率更高。
2、 异常值处理
1.1简单的统计分析
拿到数据后可以对数据进行一个简单的描述性统计分析,譬如最大最小值可以用来判断这个变量的取值是否超过了合理的范围,如客户的年龄为-20岁或200岁,显然为异常值。在python中可以直接用pandas的describe():
1.2 3σ准则
如果数据服从或近似服从正态分布,数值分布在(μ-3σ,μ+3σ)中的概率为99.74%, 可以认为取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的概率为P(|x-μ| > 3σ) <= 0.3%,属于极个别的小概率事件,即为异常值。
这种判别处理原理及方法仅局限于对正态或近似正态分布的样本数据处理,
但实际数据往往并不严格服从正态分布。它们判断异常值的标准是以计算数据的均值和标准差为基础的,而均值和标准差的耐抗性极小,异常值本身会对它们产生较大影响。显然,应用这种方法于非正态分布数据中判断异常值,其有效性是有限的。
1.3箱型图分析
如果一个值在【QL-1.5IQR, QU+1.5IQR】之外,则被称为异常值。QL为下四分位数, QU为上四分位数,IQR为四分位数间距,是QU与QL的差值,包含了全部观察值的一半。
箱型图判断异常值的方法以四分位数和四分位距为基础,四分位数具有鲁棒性:25%的数据可以变得任意远且不会干扰四分位数,所以异常值不能对这个标准施加影响。因此箱型图识别异常值比较客观,在识别异常值时有一定的优越性。
1.4基于模型检测
首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;如果模型是簇的集合,则异常是不显著属于任何簇的对象;在使用回归模型时,异常是相对远离预测值的对象
优点:有坚实的统计学理论基础,当存在充分的数据和所用的检验类型的知识时,这些检验可能非常有效;
缺点:对于多元数据,可用选择少一些,并且对于高维数据,检测的可靠性很差。
1.5基于距离
通常可以在对象之间定义邻近性度量,异常对象是那些远离其他对象的对象
优缺点:1.简单;2.缺点:基于邻近度的方法需要O(m2)时间,大数据集不适用;3.该方法对参数的选择也是敏感的;4.不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化。
1.6基于密度
当一个点的局部密度显著低于它的大部分近邻时才将其分类为离群点。适合非均匀分布的数据。
优缺点:1.给出了对象是离群点的定量度量,并且即使数据具有不同的区域也能够很好的处理;2.与基于距离的方法一样,这些方法必然具有O(m2)的时间复杂度。对于低维数据使用特定的数据结构可以达到O(mlogm);3.参数选择困难。虽然算法通过观察不同的k值,取得最大离群点得分来处理该问题,但是,仍然需要选择这些值的上下界。
1.7基于聚类
基于聚类的离群点:一个对象是基于聚类的离群点,如果该对象不强属于任何簇。离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。为了处理该问题,可以使用如下方法:对象聚类,删除离群点,对象再次聚类(这个不能保证产生最优结果)。
优缺点:1.基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的;2.簇的定义通常是离群点的补,因此可能同时发现簇和离群点;3.产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性;4.聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。
处理方法:
1.删除异常值----明显看出是异常且数量较少可以直接删除
2.不处理---如果算法对异常值不敏感则可以不处理,但如果算法对异常值敏感,则最好不要用,如基于距离计算的一些算法,包括kmeans,knn之类的。
3.平均值替代----损失信息小,简单高效。
4.视为缺失值----可以按照处理缺失值的方法来处理
3、 重复值处理