Press "Enter" to skip to content

机器学习模型的数据预处理和可视化

 

数据科学工程的目标是向那些仅对数据内在本质感兴趣的人展示这些数据的含义。要达到这个目标,数据科学家/机器学习工程师要遵循若干个步骤。对于更精确地建立机器学习模型来说,数据预处理(清洗,格式化,缩放,正规化)和多种图表的数据可视化是两个非常重要的步骤。

 

    前言

 

此帖的目的在于解释这些方法以及它们的机器学习建模上的作用,并且讨论它们对于不同商业应用的影响。

 

我们将使用“巧克力糖”数据集(听起来味道不错吧?)。这个数据集包括巧克力等级,产地,可可粉百分比,以及所使用的豆子的种类的多寡和豆子的生产地。

 

数据集信息量巨大,我打赌,你们绝大多数都会想:我们到底要拿这些数据集干嘛?从中能获得什幺样的信息?我们能对数据做很多事,但是针对目前这个练习,我们将用不同的的可视化工具,例如分布图,方框图,KDE,以及小提琴图等,来分析数据,并回答以下问题:

 

 

混合巧克力和纯巧克力的平均评分是多少?

 

哪个国家出产评价最高的巧克力糖?

 

在全部数据集(不同的数据点)中找出可可粉含量的分布规律。

 

 

在回答上述问题之前,我们需要做一些数据预处理工作:清洗,格式化等等,以便更清晰地呈现数据。

 

    数据准备:清洗及格式化数据

 

数据处理流程起始于收集数据,终结于提交结果。整个过程说起来容易,做起来难。在其中的多个步骤里,数据预处理是最重要的步骤之一。

 

数据预处理本身就包含多个步骤,而且很多步骤取决于数据文件的类型,数据的本质,不同的取值类型,等等。

 

学习一下数据预处理

 

维基定义:数据预处理是一种数据挖掘技术,它是指把原始数据转换成可以理解的格式。真实世界      数据往往不完整,不一致,和/或缺乏一定的动态或趋势,并且很可能有错漏。数据预处      理是解决这些问题的一个有效手段。数据预处理整理原始数据,以便进一步处理。数据      预处理用于数据库驱动的应用,比如,客户关系管理和基于规则的应用(如神经网络)。

 

那幺,到底是什幺使得数据预处理在机器学习或其它数据科学领域变得如此重要呢?

 

数据预处理的重要性

 

举个简单的例子:一对夫妇去医院做孕检,夫妻双方都要做检查。检查结果出来后,医院宣布丈夫怀孕了。很奇怪,是吧?

 

我们可以由此想想机器学习的问题:分类。我们有一千多对夫妻的孕检数据,其中的60%,我们知道谁怀孕了,剩下的40%,我们需要从以往的数据里推测结果。我们假设,在这60%的案例里,有1%表明男人怀孕。

 

在机器学习建模时,如果我们没有做预处理,比如修正异常数据,处理缺失数据值,规整化,数据缩放,或者特征工程等,我们也许会把那1%的错误数据当成正常值了。

 

机器学习模型无非是一段代码,工程师或数据科学家用数据进行训练,使之智能化。所以,如果你给模型输入垃圾,你得到的也是垃圾。即,模型会对那些结果未知的40%的人给出错误的判断。

 

这仅仅是错误数据的一个例子。人们也可能采集到不正常的数据值(如,员工工资为负数),有时也会漏采数据值。这些都会导致对结果的预测/回答造成偏差。

 

开始进行数据预处理

 

数据预处理包括清洗、实例选择、归整化、变换、特征抽取和选择等。数据预处理的输出结果是最终的训练集。 Kostsiantis et al. (2006) 提出了一个着名的算法,用于数据预处理的每一个步骤。

 

 

import pandas as pd

 

import numpy as np

 

 

 

#load the chocolate data – Keep the data file in the same folder as #your python code

 

chocolate_data = pd.read_csv(“flavors_of_cacao.csv”)

 

 

 

#have a look at the data

 

chocolate_data.head()

 

我们现在加载巧克力数据,然后看看是不是需要数据预处理。

 

 

巧克力数据

 

 

# Let’s have a look how many values are missing.

 

chocolate_data.isnull().sum()

 

 

列值缺失

 

似乎我们可以忽略bean类型列中缺少的值。所以不需要插补(插入值)。

 

让我们先暂停,看看上面图片中的列名。具体来说,我们正在研究数据集的结构:

 

 

#Lets have a look at the data and see identify Object/Categorical values and Continuous values

 

chocolate_data.dtypes

 

 

数据的结构

 

数据列的名称里包含了“\n”,会让数据分析产生错误。我们先格式化列的名称:

 

 

original_col = chocolate_data.columns

 

new_col = [‘Company’, ‘Species’, ‘REF’, ‘ReviewDate’, ‘CocoaPercent’,’CompanyLocation’, ‘Rating’, ‘BeanType’, ‘Country’]

 

chocolate_data =chocolate_data.rename(columns=dict(zip(original_col,

 

new_col)))

 

chocolate_data.head()

 

 

更改后的列的名称

 

数据列CocoaPercent包含“%”号,这也会导致错误。所以我们也需要将它格式化。

 

 

#Remove % sign from CocoaPercent column

 

chocolate_data[‘CocoaPercent’] = chocolate_data[‘CocoaPercent’].

 

str.replace(‘%’,”).astype(float)/100

 

chocolate_data.head()

 

 

数据格式化

 

我们添加一个新的列BlendNotBlend。这个列将记录巧克力是混合口味还是纯口味。下一节我们将讨论添加这个列的原因。

 

 

chocolate_data[‘BlendNotBlend’] = np.where(np.logical_or( np.logical_or(chocolate_data[‘Species’].str.lower().str.contains(‘,|(blend)|;’),chocolate_data[‘Country’].str.len() == 1), chocolate_data[‘Country’].str.lower().str.contains(‘,’))

 

, 1

 

, 0)

 

 

chocclate_date.head()

 

 

数据中的新列

 

我们已经清洗并格式化了数据。现在我们要通过一些可视化工具看看数据是什幺样子的,并回答前言中所讨论的问题。

 

    数据可视化

 

数据可视化是任何数据科学项目不可或缺的一部分。当数据集增加时,用excel电子表格或者文档来理解内在联系变更加困难。毫无疑问地说,用上下滚动的方式分析数据变得很无趣。让我们一起理解可视化和它对机器学习模型的重要性。我们将会尝试用一些工具来探索巧克力棒的数据集。

 

将数据可视化

 

维基百科的定义:许多学科将数据可视化视为视觉传达的现代等价物。 它涉及创建和研究数据的可视化表示。 为了清晰有效地传递信息,数据可视化使用统计图形,图表,信息图形和其他工具。 可以使用点,线或条来编码数字数据,以在视觉上传达定量消息。

 

在数据可视化中,我们使用不同的图形和曲线来可视化复杂数据,以便于发现数据模式。 这种可视化如何帮助机器学习建模,甚至在我们开始建模之前?

 

可视化的重要性

 

CSV数据(panda dataframes)可能真的难以让您获得一些启发。 这和您的数据是否格式化或格式不正确无关。根据 SaS Data Visualization:人类大脑处理信息的方式,使用图表或图形可视化大量复杂数据比研究电子表格或报告更容易。 数据可视化是一种以通用方式传达概念的快速,简便的方法,因为你可以通过稍作调整来尝试不同的方案。

 

数据可视化还有助于识别需要注意的区域,例如异常值,这些区域可能会影响我们的机器学习模型。 它还有助于我们了解对您的结果产生更大影响的因素:例如,在房价预测中,房屋价格将受房屋大小的影响而不是房屋风格。

 

可视化不仅在建模之前有所帮助,甚至在它之后也是如此。 例如,它可以帮助识别数据集中的不同聚类,这显然很难通过没有适当可视化的简单文件发现。

 

可视化以多种方式影响建模,但在EDA(探索性数据分析)阶段尤其方便,它可以让您理解数据中的模式。 对于这个特定的练习,我们将使用一些流行的技术可视化巧克力棒数据的分布。

 

可视化工具

 

巧克力棒数据集具有不同类型的值 – 分类和连续/数字。 我们只关注可视化连续变量的分布。 让我们看看绘图。

 

1.直方图

 

维基百科定义:直方图是数值数据分布的精确表示。 它是连续变量(定量变量)的概率分布的估计。

 

这里的主要问题是我们应该检索哪些数据并确认分布? 读完上面的定义后,人们可能会说:“哦! 除了对象或分类变量/值之外,我们可以对任何事物绘制直方图。“这是一个有效观点,但我们是否确定所有连续值都能说出有意义的故事?

 

让我们从rating列开始。

 

 

#Let’s see the distribution of continuous variables

 

sb.distplot(chocolate_data[‘Rating’],kde = False)

 

plt.show()

 

 

rating列的直方图

 

给出不同rating列的数量并绘制。 条形图彼此相邻显示,因为被测量的变量是连续的并且在x轴上。 这个图背后的故事是什幺? 我们可以看到约390人为巧克力提供3.5评级。

 

下面时REF列:

 

 

sb.distplot(chocolate_data[‘REF’],kde = False)

 

plt.show()

 

 

REF直方图

 

REF列是收到的评级的参考编号。 较高的参考编号是最新的参考编号。

 

下一个连续变量是CocoaPercent。 很多人喜欢黑巧克力(我不是),所以我们希望看到巧克力中包含的黑暗分布。

 

 

sb.distplot(chocolate_data[‘CocoaPercent’],kde = False)

 

plt.show()

 

 

Cocoal百分分布直方图

 

2.箱型图

 

维基百科定义:在描述性统计中,箱形图是用于通过其四分位数图形描绘数值数据组的方法。 箱形图也可以具有从箱子(胡须)垂直延伸的线,指示上下四分位数之外的可变性。(不完整,建议大家自己去维基或者百度查查)

 

箱形图给出了基础分布的印象。 但这也是直方图所做的。 那为什幺我们需要箱形图? 在直方图中,当您对比许多分布时,它们不能很好地叠加并占用大量空间来并排显示它们。

 

这里,我们将为巧克力生产设施和客户提供的评级创建一个盒子图。

 

 

# Look at boxplot over the countries, even Blends

 

fig, ax = plt.subplots(figsize=[6, 16])

 

sns.boxplot(

 

data=chocolate_data,

 

y=’Country’,

 

x=’Rating’

 

)

 

ax.set_title(‘Boxplot, Rating for countries (+blends)’)

 

 

巧克力地区和评价

 

在上图中,您可以清楚地看到每个国家/地区的巧克力棒的评级。 这种可视化可以帮助我们了解每个国家/地区在整个数据集中的评级分布,并进一步帮助我们找到哪个国家/地区比其他国家更受欢迎。

 

它还解释了哪个国家对卖方和潜在地区更有利可图。 我们可以进一步计算平均评级并在框图绘制之前对数据进行排序。 但对于这篇文章,我们在这里不会涉及太多细节。

 

3.小提琴图

 

最近我偶然发现小提琴图,确实看起来像乐器图。现在我们看看小提琴图能告诉我们哪些数据

 

维基百科定义:小提琴图是一种绘制数字数据的方法。它类似于每边都有旋转的核密度图的盒子图。

 

相当难理解,对吧? 为了简化这个定义,让我们来根据以下步骤来画一下。

 

还记得我们之前新船舰得一列BlendNotBlend。 在这里,我们将使用这个。我们将通过比较收到的评分来了解混合巧克力或纯巧克力的效果。

 

箱型图(不想上文中的箱型图):以下的图反映了混合巧克力的效果比纯巧克力的效果要好。因此从数据中,我们可以得知人们更倾向于不同口味的巧克力或者不同口味混合而成的。

 

 

sns.boxplot(

 

data=chocolate_data,

 

x=’BlendNotBlend’,

 

y=’Rating’,

 

)

 

ax.set_title(‘Boxplot, Rating by Blend/Pure’)

 

 

KDE (kernel density plot)-让我们尝试使用KDE来绘制同类的图

 

 

Blended = chocolate_data.loc[chocolate_data.BlendNotBlend == 1]

 

NotBlended = chocolate_data.loc[chocolate_data.BlendNotBlend == 0]

 

ax = sns.kdeplot(Blended.Rating,

 

shade=True,shade_lowest=False, label = “Blend”)

 

ax = sns.kdeplot(NotBlended.Rating,

 

shade=True,shade_lowest=False, label = “Pure”)

 

 

维基百科定义:KDE是一种估计变量概率密度函数的非参数方法。柱状图可以看作是一种简单的非参数密度估计。这里,用一个矩形来表示每个观测值,它越大,观测值越多。

 

因此以上的图包含了观察的面积/列的值,并且数据点越多区域面积越大。这种图可以被认为是代表每个观察到的较大的值。我们可以把所有的核都加起来来给出平滑的分布。

 

小提琴图-我们将把箱型图和核密度图放在一起。

 

ax = sns.violinplot(x=”BlendNotBlend”, y=”Rating”, data=chocolate_data, hue=”BlendNotBlend”)

 

 

小提琴图

 

小提琴图清晰的展示了平滑的曲线,例如,箱型图和和密度图结合。有了上面的图,你可以很轻易的判断“混合”味的有着很高的评价,例如,混合味能得到很多评论并且能收到很多不同的评分相比于纯巧克力。使用这种图的优点就是不用读很多的点来理解数据。

 

    总结

 

通过这篇,我们探索了数据如何让进行预处理,并且探索了数据可视化是如何影响复杂的机器学习模型建立环节。我们知道了不同的数据预处理技巧,并且用巧克力数据集进行了一些尝试

 

关于这些数据,假设我们希望了解更多关于当前和未来评级/评论的分布,以便公司能够改进其生产和制作的策略。如果我们没有处理丢失的数据,没有校正不正确的数据,在建模阶段这将会导致不正确的决策。

 

我们也探索可一些数据可视化的工具,谈论了可视化如何影响模型本身。每个可视化的工具都有自己讲述故事的方式,并且也是非常重要的,在特定的数据类型使用哪种工具。

 

    参考

 

Violin plot

 

Kaggle Dataset

 

Motivation — Blazing fast EDA

 

GitHub repo

 

Data Pre-processing

原标题 :Data Pre-processing and Visualization for Machine Learning Models

作者 |  Natasha Sharma 翻译 | Dddda、Gelel、AI小山      编辑 | 邓普斯•杰弗、约翰逊·李加薪

原文链接: https://heartbeat.fritz.ai/data-preprocessing-and-visualization-implications-for-your-machine-learning-model-8dfbaaa51423

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注