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

数据清洗&预处理入门完全指南

时间:2023-03-18 17:02:24 科技观察

数据预处理是构建机器学习模型的第一步(也可能是最重要的一步),它对最终结果有着决定性的影响:如果你的数据集做没有完整的数据清理和预处理,那么你的模型可能不会有效——就这么简单。人们常常认为数据预处理是一个很无聊的部分。但这是“准备好”和“完全没有准备好”之间的区别,也是专业表演和业余表演之间的区别。就像提前为假期做准备一样,如果您提前制定好行程的细节,就可以避免旅行变成一场噩梦。那么,我们应该怎么做呢?本文将向您展示如何在任何数据集上完成任何机器学习模型的数据预处理。第一步,导入让我们从导入数据预处理所需的库开始。库是很好用的工具:您将输入传递给库,它会完成工作。你可以接触到很多库,但在PYTHON中,有3个库是最基本的。无论如何,您很可能最终会使用它们。使用PYTHON时最好的三个库是Numpy、Matplotlib和Pandas。Numpy是所有数学运算所需的库,并且由于代码对数学公式进行运算,因此使用了它。Maplotlib(特别是Matplotlib.pyplot)是绘图所需的库。Pandas是导入和处理数据集的最佳库。数据预处理,基本都需要Pandas和Numpy。最合适的方式是在导入这些库的时候给它们取一个简称,这样可以在以后的使用中节省一定的时间和成本。这一步非常简单,可以按如下方式实现:.在本文中,我还附上了数据集的前几行。我们有数据集,但需要创建一个矩阵来保存自变量,以及一个向量来保存因变量。为了创建一个包含自变量的矩阵,输入语句:X=dataset.iloc[:,:-1].values***冒号表示提取数据集的所有行,“:-1"表示提取除***Allbutacolumn之外的所有行。***的“.values”表示要提取所有的值。接下来,我们要创建包含因变量的向量,获取数据的最后一列。输入语句:y=dataset.iloc[:,3].values记住看数据集的时候,索引(index)是从0开始的。所以,如果要统计列数,就从0开始算,而不是1."[:,:3]"将返回animal、age和worth三列。其中0表示动物,1表示年龄,2表示价值。对于这种计数方法,即使没见过,过不了多久就会习惯了。如果缺少数据会怎样?事实上,我们时时刻刻都会遇到数据丢失的情况。对此,我们可以直接删除缺失的行,但这不是一个好办法,而且容易出问题。所以需要更好的解决方案。最常见的方法是用其列的平均值填充缺失值。通过使用scikit-learn预处理模型中的输入类,您可以非常轻松地做到这一点。(如果您还不知道,我强烈建议您知道:scikit-learn包含很棒的机器学习模型)。在机器学习中,“方法”、“类”和“对象”等术语可能会让您感到不舒服。这没什么大不了的!一个类是我们想要为一个目的建模的东西。如果我们要建造一个棚子,建造计划就是一个类。对象是类的实例。在此示例中,根据计划建造的棚屋是一个对象。同一个类可以有很多对象,就像可以按计划建造很多棚子一样。方法是我们可以在对象上使用的工具,或者是在对象上实现的函数:向它传递一些输入,它返回一个输出。这就像我们的棚子有点闷时打开窗户。图:RomanKraft在Unsplash上发布要使用输入器,请键入如下内容。fromsklearn.preprocessingimportImputerimputer=Imputer(missing_values=np.nan,strategy='mean',axis=0)表示填充是默认的填充策略,所以不需要指定,这里加上是为了方便理解是什么可以包含信息。missing_values的默认值是nan。如果你的数据集中有“NaN”形式的缺失值,那么你要注意np.nan,你可以在这里查看官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html为了拟合这个imputer,输入:imputerimputer=imputer.fit(X[:,1:3])我们只想在有缺失数据的列上拟合imputer。这里的第一个冒号表示包括所有行,“1:3”表示我们取索引为1和2的列。别担心,您很快就会习惯PTYHON的计数方法。现在,我们要调用实际替换缺失数据的方法。通过输入以下语句完成:X[:,1:3]=imputer.transform(X[:,1:3])尝试几种不同的填充策略。或许在某些项目中,你会发现使用缺失值所在列的中位数或众数来填充缺失值更为合理。填充策略等决策可能看起来很小,但它们很重要。因为流行的方法不一定是正确的选择,均值不一定是模型最好的缺失填充选择。毕竟,几乎所有阅读本文的人都拥有高于平均水平的手臂计数。图片:MatthewHenry发表于Unsplash如果包含属性数据会怎样?这是个好问题。没有办法明确计算猫、狗、麋鹿等事物的平均值。那么如何做到这一点呢?您可以将属性数据编码为数值!您可能希望使用sklearn.preprocessing提供的LabelEncoder类。从您希望编码的一列数据开始,调用标签编码器并将其适合您的数据。fromsklearn.preprocessingimportLabelEncoderlabelencoder_X=LabelEncoder()X[:,0]=labelencoder_X.fit_transform(X[:,0])(还记得括号里数字的意思吗?":"表示要提取数据ofallrows,0表示要提取***列)只需将***列中的属性变量替换为数值即可。例如,麋鹿用0表示,狗用2表示,猫用3表示。你看到任何潜在的问题吗?标签系统意味着使用的数字层次可能会影响模型结果:3大于0,但猫不一定比麋鹿大。图片:CelLisboa发表于Unsplash我们需要创建虚拟变量。我们可以为猫创建一个列,为麋鹿创建另一个列,等等。然后,分别用0/1填充每一列(认为1=是,0=否)。这意味着,如果原始列的值为cat,您将在elk列中获得0,在dog列中获得0,在cat列中获得1。看起来很复杂。输入OneHotEncoder!导入编码器并指定对应列的索引。fromsklearn.preprocessingimportOneHotEncoderonehotencoder=OneHotEncoder(categorical_features=[0])然后进行一些拟合和转换。X=onehotencoder.fit_transform(X).toarray()现在,你的数据列已经被替换为这种形式:数据集中的每个属性数据对应一列,属性变量被替换为1和0。很贴心,正确的?如果我们的Y列也是属性变量,如“Y”和“N”,那么我们也可以在其上使用此编码器。labelencoder_y=LabelEncoder()y=labelencoder_y.fit_transform(y)这将直接拟合并将y表示为编码变量:1表示“Y”,0表示“N”。拆分训练集和测试集现在,您可以开始将数据集拆分为训练集和测试集。这在之前的图像分类教程文章中已经介绍过了。但请记住,您必须将数据分为训练集和测试集,切勿使用测试集进行训练!你需要避免过度拟合(你可以认为过度拟合是在考试前记住了很多细节,但没有理解这些信息。当你在家自己复习抽认卡时,记住细节是可以的,但你会通过任何检查新内容的真实测试信息。)现在,我们有了模型。模型需要在数据上进行训练并在其他数据上进行测试。记住训练集不等于学习。模型在训练集上学得越好,它在测试集上的预测就应该越好。过拟合从来都不是你想要的,学习才是!JankoFerli?发表于Unsplash首先,导入:fromsklearn.model_selectionimporttrain_test_split现在,您可以创建X_train、X_test、y_train和y_test集。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)一种常见的做法是将数据集80/20分割,其中80%的数据用于训练,20%的数据用于测试。这就是将test_size指定为0.2的原因。也可以根据需要任意划分。你不需要设置random_state,这里设置它的原因是为了完全重现结果。特征缩放什么是特征缩放?为什么需要特征缩放?看看我们的数据。我们有一个4-17岁的动物年龄栏和一个48,000到83,000的动物价值栏。Value列不仅比Age列大很多,而且涵盖的数据范围也更广。这表明欧几里得距离将完全由值特征支配,忽略了年龄数据的主导作用。如果欧氏距离在特定机器学习模型中不起作用怎么办?缩放特征仍会加速模型,因此您可以在数据预处理中包括特征缩放。特征缩放的方法有很多种。但它们都意味着我们把所有的特征都放在同一个维度上,这样就没有一个被另一个支配了。导入相关库开始:fromsklearn.preprocessingimportStandardScaler创建一个需要缩放的对象调用StandardScalersc_X=StandardScaler()直接在数据集上进行拟合和变换。获取对象并应用方法。X_train=sc_X.fit_transform(X_train)X_test=sc_X.transform(X_test)不需要在测试集上拟合,只需要transform。sc_y=StandardScaler()y_train=sc_y.fit_transform(y_train)对于虚拟变量,是否需要缩放?对于这个问题,有人认为有必要,也有人认为没有必要。这取决于您对模型可解释性的重视程度。将所有数据缩放到同一维度有其优点,缺点是失去了解释每个观察样本属于哪个变量的便利性。Y呢?如果因变量是0和1,则不需要特征缩放。这是一个具有明确定义的关联值的分类问题。但是如果它的取值范围非常大,那么答案就是你需要做缩放。恭喜,你已经完成了数据预处理!通过几行代码,您已经掌握了数据清理和预处理的基础知识。毫无疑问,在数据预处理步骤中,你可以加入很多自己的想法:你可能想要填充缺失值。想想是否对特征进行缩放,如何缩放?你引入虚拟变量吗?你对数据进行编码吗?你对虚拟变量进行编码吗……有很多细节需要考虑。既然你已经完全了解了这些,那么你就可以自己尝试一下,准备好数据了!原文链接:https://towardsdatascience.com/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d【本文为专栏组织《机器之心》原译,微信公众号《机器之心(id:almosthuman2014)》】点此查看作者更多好文