当前位置: 首页 > 科技观察

机器学习中处理缺失值的9种方法

时间:2023-03-16 17:07:32 科技观察

数据科学就是关于数据的。它是任何数据科学或机器学习项目的关键。在大多数情况下,当我们从不同来源收集数据或从某个地方下载数据时,我们的数据几乎有95%的机会包含缺失值。我们无法对包含缺失值的数据进行分析或训练机器学习模型。这也是我们90%的时间花在数据预处理上的主要原因。我们可以使用多种技术来处理缺失数据。在这篇文章中,我将分享9种处理缺失数据的方法,但首先让我们看看为什么会出现缺失数据以及缺失数据有多少种类型。不同类型的缺失值缺失值主要分为三种类型。完全随机缺失(MCAR):当数据为MCAR时,如果所有观察值都具有相同的缺失概率,则变量完全随机缺失,这意味着数据完全缺失,与任何其他观察值或缺失值无关在数据集中。换句话说,那些缺失的数据点是数据集的随机子集。缺失数据不是随机的(MNAR):顾名思义,缺失数据与数据集中的任何其他值之间存在某种关系。随机缺失(MAR):这意味着数据点缺失的倾向与缺失数据无关,而与数据集中其他观察到的数据有关。数据集中缺失值的原因有很多。例如,在身高和年龄的数据集中,年龄列中会有更多的缺失值,因为女孩通常会隐藏自己的年龄,如果我们准备工资和经验的数据,我们将有更多的缺失值在薪水,因为大多数男人不喜欢分享他们的薪水。在较大的情况下,例如为人口、疾病、事故死亡、纳税人记录准备数据时,人们通常不愿意写下信息并隐藏真实数字。即使您从第三方来源下载数据,下载时仍有可能因文件损坏而丢失价值。不管是什么原因,我们的数据集中都有缺失值,我们需要处理它们。让我们看看处理缺失值的9种方法。这里使用的数据集也是经典的泰坦尼克号让我们开始加载数据集并导入所有库。importpandasaspddf=pd.read_csv("data/titanic.csv",usecols=['Age','Cabin','Survived'])df.isnull().mean()df.dtypes运行上面的代码块后,您会看到Age、Cabin和Mounts包含空值。Age包含所有整数值,而Cabin包含所有分类值。1.均值、中值、众数替换在这项技术中,我们用列中所有值的均值/中值或众数替换空值。mean(均值):所有值的均值defimpute_nan(df,column,mean):df[column+'_mean']=df[column].fillna(mean)##NaN->meanimpute_nan(df,'Age',df.Age.mean())##meanofAge(29.69)中位数(median):所有值的中心值defimpute_nan(df,column,median):df[column+'_mean']=df[column].fillna(median)impute_nan(df,'Age',df.Age.median())##medianofAge(28.0)模式:最常见的值defimpute_nan(df,column,mode):df[column+'_mean']=df[column].fillna(mode)impute_nan(df,'Age',df.Age.mode())##modeofAge(24.0)优点易于实施(对异常值具有鲁棒性)获取完整数据集的更快方法缺点原始变化或失真方差影响相关性对于分类变量,我们需要众数。均值和中位数都不起作用。2.随机样本估计在这项技术中,我们用数据帧中的随机样本替换所有的nan值。它用于输入数字数据。我们使用sample()对数据进行采样。在这里,我们首先取一个数据样本来填充NaN值。然后改变索引,替换成与NaN值相同的索引,最后用随机样本替换所有NaN值。Pros易于实现Variance失真较小Cons我们不能将其应用于所有情况用随机样本注入替换年龄列NaN值df[variable].dropna().sample(df[variable].isnull().sum(),random_state=0)##pandasneedtohavesameindexinordertomergethedatasetrandom_sample.index=df[df[variable].isnull()].index#replacerandom_sampleindexwithNaNvaluesindex#replacewhereNaNaretheredf.loc[df[variable].isnull(),variable+'_random']=random_samplecol=variable+"_random"df=df.drop(col,axis=1)impute_nan(df,"Age")3.使用新特征这种获取NAN值的技术在数据没有完全随机丢失时效果最佳。在这里,我们向数据集添加一个新列,并将所有NaN值替换为1。优点是易于实现获得NaN值的重要性缺点创建额外的特征(维度灾难)importnumpyasnpdf['age_nan']=np.where(df['Age'].isnull(),1,0)##Itwillcreateonenewcolumnthatcontainsvalue1intherowwhereAgevalueisNaN,otherwise0.4,EndofDistribution在这种技术中,我们用第3个标准偏差值替换NaN值。它还用于从数据集中删除所有异常值。首先,我们使用std()计算第三个标准偏差,然后用该值替换NaN。优点易于实施。捕获缺失值的重要性(如果有的话)。缺点扭曲了变量的原始分布。如果NAN的数量很大。它将掩盖分布中真正的异常值。如果NAN的数量较少,则可以将替换的NAN视为异常值,并在后续特征工程中进行预处理。defimpute_nan(df,变量,中位数,极端):df[变量+"_end_distribution"]=df[变量].fillna(极端)极端=df.Age.mean()+3*df.Age.std()##73.27-->3rdstddeviationimpute_nan(df,'Age',df.Age.median(),extreme)5.任意值替换在这个技巧中,我们用任意值替换NaN值。任意值不应该在数据集中出现得更频繁。通常,我们选择最小的异常值或最后的异常值作为任意值。优点易于实施捕获缺失值的重要性,如果有的话缺点必须手动确定值。defimpute_nan(df,var):df[var+'_zero']=df[var].fillna(0)#Fillingwith0(leastoutlier)df[var+'_hundred']=df[var].fillna(100)#Fillingwith100(last)impute_nan(df,'Age')6.频繁类别插补这种技术用于填补分类数据中的缺失值。这里我们用最常见的标签替换NaN值。首先,我们找到最常见的标签并将NaN替换为它。优点易于实施缺点由于我们使用的标签更频繁,如果有很多NaN值,它可能会以过度代表性的方式使用它们。它扭曲了最常见标签之间的关系。defimpute_nan(df,变量):most_frequent_category=df[variable].mode()[0]##MostFrequentdf[variable].fillna(most_frequent_category,inplace=True)forfeaturein['Cabin']:##ListofCategoricalFeaturesimpute_nan(df,feature)7.将nan值视为一个新类别在这个技术中,我们只是简单地将所有NaN值替换为一个新类别,例如Missing。df['Cabin']=df['Cabin'].fillna('Missing')##NaN->Missing8。用KNN填充在这种技术中,我们使用sklearn创建一个KNNimputer模型,然后我们使用模型拟合我们的数据并预测NaN值。它用于计算值。这是一个5步过程。CREATECOLUMNLIST(Integer,Float)输入估计,确定邻居。根据数据拟合估计。转换后的数据使用转换后的数据创建一个新的DataFrame。优点很容易实现结果一般都是最好的缺点只适用于数值型数据我们在上一篇文章中已经详细介绍过,这里不再赘述使用python中的KNN算法处理缺失数据9.删除所有NaN这是最容易使用和实现的技术之一。只有当NaN值小于10%时,我们才应该使用这种技术。优点:容易实现处理速度快缺点:导致大量数据丢失df.dropna(inplace=True)##DropalltherowsthatcontainsNaN总结还有更多其他处理缺失值的技巧。我们的目标是为我们的问题找到最佳技术,然后实施它。处理缺失值总是一个更好的主意,但有时我们必须删除所有值。它基本上取决于数据的类型和数量。最重要的是,所有代码都可以在这里找到:https://github.com/Abhayparashar31/feature-engineering