0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python数据清洗和预处理入门完整指南

数据分析与开发 来源:关于数据分析与可视化 作者:关于数据分析与可 2022-12-21 13:50 次阅读

凡事预则立,不预则废,训练机器学习模型也是如此。数据清洗和预处理是模型训练之前的必要过程,否则模型可能就「废」了。本文是一个初学者指南,将带你领略如何在任意的数据集上,针对任意一个机器学习模型,完成数据预处理工作。

数据预处理是建立机器学习模型的第一步(也很可能是最重要的一步),对最终结果有决定性的作用:如果你的数据集没有完成数据清洗和预处理,那么你的模型很可能也不会有效——就是这么简单。

人们通常认为,数据预处理是一个非常枯燥的部分。但它就是「做好准备」和「完全没有准备」之间的差别,也是表现专业和业余之间的差别。就像为度假做好事先准备一样,如果你提前将行程细节确定好,就能够预防旅途变成一场噩梦。

那么,应该怎么做呢?

本文将带你领略,如何在任意的数据集上,针对任意一个机器学习模型,完成数据预处理工作。

导入数据

让我们从导入数据预处理所需要的库开始吧。库是非常棒的使用工具:将输入传递给库,它则完成相应的工作。你可以接触到非常多的库,但在Python中,有三个是最基础的库。任何时候,你都很可能最终还是使用到它们。这三个在使用Python时最流行的库就是Numpy、Matplotlib和Pandas。Numpy是满足所有数学运算所需要的库,由于代码是基于数学公式运行的,因此就会使用到它。Maplotlib(具体而言,Matplotlib.pyplot)则是满足绘图所需要的库。Pandas则是最好的导入并处理数据集的一个库。对于数据预处理而言,Pandas和Numpy基本是必需的。

最适当的方式是,在导入这些库的时候,赋予其缩写的称呼形式,在之后的使用中,这可以节省一定的时间成本。这一步非常简单,可以用如下方式实现:


importnumpyasnp importmatplotlib.pyplotasplt importpandasaspd

现在,可以通过输入如下语句读入数据集

dataset=pd.read_csv('my_data.csv')

这个语句告诉Pandas(pd)来读入数据集。在本文中,我也附上数据集的前几行数据。

1e27d75a-80e6-11ed-8abf-dac502259ad0.png

我们有了数据集,但需要创建一个矩阵来保存自变量,以及一个向量来保存因变量。为了创建保存自变量的矩阵,输入语句:

X=dataset.iloc[:,:-1].values

第一个冒号表示提取数据集的全部行,「:-1」则表示提取除最后一列以外的所有列。最后的「.values」表示希望提取所有的值。接下来,我们希望创建保存因变量的向量,取数据的最后一列。输入语句:

y=dataset.iloc[:,3].values

记住,在查看数据集的时候,索引(index)是从 0 开始的。所以,如果希望统计列数,从 0 开始计数而不是 1。「[:, :3]」会返回animal、age和worth三列。其中0表示animal,1表示age,2表示worth。对于这种计数方法,即使你没见过,也会在很短的时间内适应。

如果有缺失数据会怎么样?

事实上,我们总会遇到数据缺失。对此,我们可以将存在缺失的行直接删除,但这不是一个好办法,还很容易引发问题。因此需要一个更好的解决方案。最常用的方法是,用其所在列的均值来填充缺失。为此,你可以利用scikit-learn预处理模型中的inputer类来很轻松地实现。(如果你还不知道,那么我强烈建议你搞明白它:scikit-learn包含非常棒的机器学习模型)。在机器学习中,你可能并不适应诸如「方法」、「类」和「对象」这些术语。这不是什么大问题!

类就是我们希望为某目的所建立的模型。如果我们希望搭建一个棚子,那么搭建规划就是一个类。

对象是类的一个实例。在这个例子中,根据规划所搭建出来的一个棚子就是一个对象。同一个类可以有很多对象,就像可以根据规划搭建出很多个棚子一样。

方法是我们可以在对象上使用的工具,或在对象上实现的函数:传递给它某些输入,它返回一个输出。这就像,当我们的棚子变得有点不通气的时候,可以使用「打开窗户」这个方法。

为了使用imputer,输入类似如下语句。


fromsklearn.preprocessingimportImputer imputer=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,输入:

imputer=imputer.fit(X[:,1:3])

我们只希望在数据存在缺失的列上拟合imputer。这里的第一个冒号表示包含所有行,而「1:3」则表示我们取索引为 1 和 2 的列。不要担心,你很快就会习惯 Python的计数方法的。

现在,我们希望调用实际上可以替换填充缺失数据的方法。通过输入以下语句完成:

X[:,1:3]=imputer.transform(X[:,1:3])

1e35cb3a-80e6-11ed-8abf-dac502259ad0.jpg

多尝试一些不同的填充策略。也许在某些项目中,你会发现,使用缺失值所在列的中位数或众数来填充缺失值会更加合理。填充策略之类的决策看似细微,但其实意义重大。因为流行通用的方法并不一定就是正确的选择,对于模型而言,均值也不一定是最优的缺失填充选择。

毕竟,几乎所有正阅读本文的人,都有高于平均水平的手臂数。

如果包含属性数据,会怎么样呢?

这是一个好问题。没有办法明确地计算诸如猫、狗、麋鹿的均值。那么可以怎么做呢?可以将属性数据编码为数值!你可能希望使用sklearn.preprocessing所提供的LabelEncoder类。从你希望进行编码的某列数据入手,调用label encoder并拟合在你的数据上。


fromsklearn.preprocessingimportLabelEncoder labelencoder_X=LabelEncoder() X[:,0]=labelencoder_X.fit_transform(X[:,0])

(还记得括号里的数字所表示的含义吗?「:」表示希望提取所有行的数据,0表示希望提取第一列)

这就是将第一列中的属性变量替换为数值所需的全部工作了。例如,麋鹿将用0表示,狗将用2表示,猫将用3表示。

你发现什么潜在问题了吗?

标注体系暗含以下信息:所使用的数值层级关系可能会影响模型结果:3 比 0 的数值大,但猫并不一定比麋鹿大。

我们需要创建哑变量。

我们可以为猫创建一列数据,为麋鹿创建一列数据,……以此类推。然后,将每一列分别以 0/1 填充(认为 1=Yes,0 = No)。这表明,如果原始列的值为猫,那么就会在麋鹿一列得到 0,狗一列得到 0,猫一列得到 1。

看上去非常复杂。输入 OneHotEncoder 吧!

导入编码器,并制定对应列的索引。


fromsklearn.preprocessingimportOneHotEncoder onehotencoder=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」。

1e4e0e7a-80e6-11ed-8abf-dac502259ad0.jpg

训练集与测试集的划分

现在,你可以开始将数据集划分为训练集和测试集了。这已经在之前的图像分类教程一文中论述过了。不过记得,一定要将你的数据分为训练集和测试集,永远不要用测试集来训练!需要避免过拟合(可以认为,过拟合就像在一次测验前,记忆了许多细节,但没有理解其中的信息。如果只是记忆细节,那么当你自己在家复习知识卡片时,效果会很好,但在所有会考察新信息的真实测验中,都会不及格。)

现在,我们有了需要学习的模型。模型需要在数据上训练,并在另外的数据上完成测试。对训练集的记忆并不等于学习。模型在训练集上学习得越好,就应该在测试集给出更好的预测结果。过拟合永远都不是你想要的结果,学习才是!

首先,导入:

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,还有一列动物价值,范围是83,000。价值一栏的数值不仅远大于年龄一栏,而且它还包含更加广阔的数据范围。这表明,欧式距离将完全由价值这一特征所主导,而忽视年龄数据的主导效果。如果欧式距离在特定机器学习模型中并没有具体作用会怎么样?缩放特征将仍能够加速模型,因此,你可以在数据预处理中,加入特征缩放这一步。

特征缩放的方法有很多。但它们都意味着我们将所有的特征放在同一量纲上,进而没有一个会被另一个所主导。

导入相关库开始:

fromsklearn.preprocessingimportStandardScaler

创建一个需要缩放对象并调用Standard Scaler。

sc_X=StandardScaler()

直接在数据集上进行拟合以及变换。获取对象并应用方法。


X_train=sc_X.fit_transform(X_train) X_test=sc_X.transform(X_test)

不需要在测试集上进行拟合,只进行变换。


sc_y=StandardScaler() y_train=sc_y.fit_transform(y_train)

对于哑变量而言,是否需要进行缩放?

对于这个问题,有些人认为需要,有些则认为不需要。这取决于你对模型可解释性的看重诚度。将所有数据缩放至同一量纲固然有好处,但缺点是,这丢失了解释每个观测样本归属于哪个变量的便捷性。

对于Y呢?如果因变量是0和1,那么并不需要进行特征缩放。这是一个具有明确相关值的分类问题。但如果其取值范围非常大,那么答案是你需要做缩放。

恭喜你,你已经完成了数据预处理的工作!

通过少量的几行代码,你已经领略了数据清洗和预处理的基础。毫无疑问,在数据预处理这一步中,你可以加入很多自己的想法:你可能会想如何填充缺失值。思考是否缩放特征以及如何缩放特征?是否引入哑变量?是否要对数据做编码?是否编码哑变量……有非常多需要考虑的细节。现在,你已经完全了解了这些,可以亲自动手试试了,准备数据吧!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8124

    浏览量

    130567
  • python
    +关注

    关注

    51

    文章

    4676

    浏览量

    83467
  • 预处理
    +关注

    关注

    0

    文章

    32

    浏览量

    10411

原文标题:Python数据清洗 & 预处理入门完整指南

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请教大家一下关于数据预处理

    一般将获得的加速度数据得进行数据预处理,常见的预处理方法有去掉趋势相、还得将离散的数值积分获得振幅。请问有做过的没,请教一下。
    发表于 06-07 11:16

    E2441B VME/VXI总线预处理器接口用户指南

    E2441B VME/VXI总线预处理器接口用户指南
    发表于 01-14 16:22

    Python数据预处理方法

    机器学习-Python实践Day3(特征工程--数据预处理2)
    发表于 06-03 15:55

    关于《Python编程入门系列教程》说明及教程汇总

    3.6.5的开发环境),结合Python的基础语法以及相应的功能库,实现游戏/项目的开发设计。内容上选取了Python 中Turtle绘图、Gui图形界面设计以及数据处理三个方向,由浅入深,有助于初学者了解
    发表于 06-23 10:10

    数据探索与数据预处理

    目录1数据探索与数据预处理21.1 赛题回顾21.2 数据探索性分析与异常值处理21.3 相关性分析52特征工程82.1 光伏发电领域特征8
    发表于 07-12 08:37

    使用Bionconductor完成基因芯片预处理的流程

    的整体框架,自行学习其他厂商或种类(例如SNP芯片或CHIP-chip芯片)的芯片处理方法5.1快速入门例5-1 从数据包CLL中载入芯片数据,完成
    发表于 07-23 07:38

    数字信号处理入门指南

    数字信号处理入门指南什么是DSP? 数字信号处理器(DSP)采集已被数字化的现实世界的声音、音频、视频、温度、压力或位置等信号,并从数学的角度对其进
    发表于 09-15 08:55 1270次阅读
    数字信号<b class='flag-5'>处理入门</b><b class='flag-5'>指南</b>

    [Python入门指南].(Python.Tutorial).G

    介绍python的一篇较好的入门资料
    发表于 09-05 08:38 0次下载

    Python的Anaconda入门指南

    Python入门学习并不是一件简单的事情,也不是轻轻松松简简单单就可以快速入门的,尤其是环境问题,让不少的Python初学者头痛不已,本篇文章小编就带大家看一下
    的头像 发表于 01-22 17:32 2344次阅读

    机器学习的特征预处理问题讨论

    本文我们来讨论特征预处理的相关问题。主要包括特征的归一化和标准化,异常特征样本清洗与样本数据不平衡问题的处理
    的头像 发表于 03-15 17:14 726次阅读

    从Excel到Python数据分析进阶指南资源下载

    中pandas库用于数据处理,我们从1787页的pandas官网文档中总结出最常用的36个函数,通过这些函数介绍如何通过Python完成数据生成和导入、数据
    发表于 04-06 09:44 0次下载
    从Excel到<b class='flag-5'>Python</b><b class='flag-5'>数据</b>分析进阶<b class='flag-5'>指南</b>资源下载

    硅晶片的蚀刻预处理方法包括哪些

    硅晶片的蚀刻预处理方法包括:对角度聚合的硅晶片进行最终聚合处理,对上述最终聚合的硅晶片进行超声波清洗后用去离子水冲洗,对上述清洗和冲洗的硅晶片进行SC-1
    发表于 04-13 13:35 878次阅读
    硅晶片的蚀刻<b class='flag-5'>预处理</b>方法包括哪些

    PyTorch教程之数据预处理

    电子发烧友网站提供《PyTorch教程之数据预处理.pdf》资料免费下载
    发表于 06-02 14:11 0次下载
    PyTorch教程之<b class='flag-5'>数据</b><b class='flag-5'>预处理</b>

    每日一课 | 智慧灯杆之大数据预处理技术介绍

    2.大数据预处理技术大数据预处理技术主要完成对已接收数据的辨析、抽取、清洗等操作。(1)抽取:因
    的头像 发表于 04-07 14:38 426次阅读
    每日一课 | 智慧灯杆之大<b class='flag-5'>数据</b><b class='flag-5'>预处理</b>技术介绍

    python怎么做数据清洗

    指南使用的数据集是 Kaggle 竞赛 Sberbank 俄罗斯房地产价值预测竞赛数据(该项目的目标是预测俄罗斯的房价波动)。本文并未使用全部数据,仅选取了其中的一部分样本。
    发表于 08-21 12:33 282次阅读
    <b class='flag-5'>python</b>怎么做<b class='flag-5'>数据</b><b class='flag-5'>清洗</b>?