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

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

3天内不再提示

数据科学的完整流程几个组成部分

电子工程师 来源:未知 作者:李倩 2018-10-18 16:58 次阅读

数据科学的完整流程一般包含以下几个组成部分:

数据收集

数据清洗

数据探索和可视化

统计或预测建模

虽然这些组成部分有助于我们理解数据科学的不同阶段,但对于编程工作流并无助益。

通常而言,在同一个文件中覆盖完整的流程将会导致Jupyter Notebook、脚本变成一团乱麻。此外,大多数的数据科学问题都要求我们在数据收集、数据清洗、数据探索、数据可视化和统计/预测建模中切换。

但是还存在更好的方法来组织我们的代码!在这篇博客中,我将介绍大多数人在做数据科学编程工作的时候切换的两套思维模式:原型思维模式和生产流思维模式。


JupyteLab:我个人使用JupyteLab来进行整个流程的操作(包括写原型代码和生产流代码)。我建议至少使用JupyteLab来写原型代码:

http://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html

借贷俱乐部数据

为了更好地理解原型和生产流两种思维模式,我们来处理一些真实的数据。我们将使用个人对个人的借贷网站——借贷俱乐部上面的借贷数据。跟银行不同,借贷俱乐部自身并不借钱,而是为贷款人提供一个市场以贷款给因不同的原因(比如维修、婚礼)需要借款的个人。

借贷俱乐部网站:

https://www.dataquest.io/blog/programming-best-practices-for-data-science/www.lendingclub.com

我们可以使用这个数据来建立一个模型,判断一个给定的贷款申请是否会成功。这篇博客中,我们不会深入到建立机器学习模型工作流。

借贷俱乐部提供关于成功的贷款(被借贷俱乐部和联合贷款人通过的贷款)和失败的贷款(被借贷俱乐部和联合贷款人拒绝的贷款,款项并没有转手)的详尽历史数据。打开他们的数据下载页,选择2007-2011年,并下载数据:

数据下载页:

https://www.lendingclub.com/info/download-data.action

原型思维模式

在原型思维模式中,我们比较关心快速迭代,并尝试了解数据中包含的特征和事实。创建一个Jupyter Notebook,并增加一个Cell来解释:

你为了更好地了解借贷俱乐部而做的所有调查

有关你下载的数据集的所有信息

首先,让我们将csv文件读入pandas:

import pandas as pd

loans_2007 = pd.read_csv('LoanStats3a.csv')

loans_2007.head(2)

我们得到两部分输出,首先是一条警告信息:

/home/srinify/anaconda3/envs/dq2/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2785: DtypeWarning: Columns (0,1,2,3,4,7,13,18,24,25,27,28,29,30,31,32,34,36,37,38,39,40,41,42,43,44,46,47,49,50,51,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,134,135,136,142,143,144) have mixed types. Specify dtype option on import or set low_memory=False.

interactivity=interactivity, compiler=compiler, result=result)

然后是数据框的前5行,这里我们就不展示了(太长了)。

警告信息让我们了解到如果我们在使用pandas.read_csv()的时候将low_memory参数设为False的话,数据框里的每一列的类型将会被更好地记录。

第二个输出的问题就更大了,因为数据框记录数据的方式存在着问题。JupyterLab有一个内建的终端,所以我们可以打开终端并使用bash命令head来查看原始文件的头两行数据。

head -2 LoanStats3a.csv

原始的csv文件第二行包含了我们所期望的列名,看起来像是第一行数据导致了数据框的格式问题:

Notes offered by Prospectus

https://www.lendingclub.com/info/prospectus.action

增加一个Cell来说明你的观察,并增加一个code cell来处理观察到的问题。

import pandas as pd

loans_2007 = pd.read_csv('LoanStats3a.csv', skiprows=1, low_memory=False)

在借贷俱乐部下载页查看数据字典以了解哪些列没有包含对特征有用的信息。Desc和url列很明显就没有太大的用处。

loans_2007 = loans_2007.drop(['desc', 'url'],axis=1)

然后就是将超过一半以上都缺失值的列去掉,使用一个cell来探索哪一列符合这个标准,再使用另一个cell来删除这些列。

loans_2007.isnull().sum()/len(loans_2007)

loans_2007 = loans_2007.dropna(thresh=half_count, axis=1)

因为我们使用Jupyter Notebook来记录我们的想法和代码,所以实际上我们是依赖于环境(通过IPython内核)来记录状态的变化。这让我们能够自由地移动cell,重复运行同一段代码,等等。

通常而言,原型思维模式专注于:

可理解性

使用Markdown cell来记录我们的观察和假设

使用一小段代码来进行真实的逻辑操作

使用大量的可视化和计数

抽象最小化

大部分的代码都不在函数中(更为面向对象)

我们会花时间来探索数据并且写下我们采取哪些步骤来清洗数据,然后就切换到工作流模式,并且将代码写得更强壮一些。

生产流模式

在生产流模式,我们会专注于写代码来统一处理更多的情况。比如,我们想要可以清洗来自借贷俱乐部的所有数据集的代码,那么最好的办法就是概括我们的代码,并且将它转化为数据管道。数据管道是采用函数式编程

的原则来设计的,数据在函数中被修改,并在不同的函数之间传递:

函数式编程教程

https://www.dataquest.io/blog/introduction-functional-programming-python/

这里是数据管道的第一个版本,使用一个单独的函数来封装数据清洗代码。

import pandas as pd

def import_clean(file_list):

frames = []

for file in file_list:

loans = pd.read_csv(file, skiprows=1, low_memory=False)

loans = loans.drop(['desc', 'url'], axis=1)

half_count = len(loans)/2

loans = loans.dropna(thresh=half_count, axis=1)

loans = loans.drop_duplicates()

# Drop first group of features

loans = loans.drop(["funded_amnt", "funded_amnt_inv", "grade", "sub_grade", "emp_title", "issue_d"], axis=1)

# Drop second group of features

loans = loans.drop(["zip_code", "out_prncp", "out_prncp_inv", "total_pymnt", "total_pymnt_inv", "total_rec_prncp"], axis=1)

# Drop third group of features

loans = loans.drop(["total_rec_int", "total_rec_late_fee", "recoveries", "collection_recovery_fee", "last_pymnt_d", "last_pymnt_amnt"], axis=1)

frames.append(loans)

return frames

frames = import_clean(['LoanStats3a.csv'])

在上面的代码中,我们将之前的代码抽象为一个函数。函数的输入是一个文件名的列表,输出是一个数据框的列表。

普遍来说,生产流思维模式专注于:

适合的抽象程度

代码应该被泛化以匹配的类似的数据源

代码不应该太过泛化以至于难以理解

管道稳定性

可依赖程度应该和代码运行的频率相匹配(每天?每周?每月?)

在不同的思维模式中切换

假设我们在运行函数处理所有来自借贷俱乐部的数据集的时候报错了,部分潜在的原因如下:

不同的文件当中列名存在差异

超过50%缺失值的列存在差异

数据框读入文件时,列的类型存在差异

在这种情况下,我们就要切换回原型模式并且探索更多。如果我们确定我们的数据管道需要更为弹性化并且能够处理数据特定的变体时,我们可以将我们的探索和管道的逻辑再结合到一起。

以下是我们调整函数以适应不同的删除阈值的示例:

import pandas as pd

def import_clean(file_list, threshold=0.5):

frames = []

for file in file_list:

loans = pd.read_csv(file, skiprows=1, low_memory=False)

loans = loans.drop(['desc', 'url'], axis=1)

threshold_count = len(loans)*threshold

loans = loans.dropna(thresh=half_count, axis=1)

loans = loans.drop_duplicates()

# Drop first group of features

loans = loans.drop(["funded_amnt", "funded_amnt_inv", "grade", "sub_grade", "emp_title", "issue_d"], axis=1)

# Drop second group of features

loans = loans.drop(["zip_code", "out_prncp", "out_prncp_inv", "total_pymnt", "total_pymnt_inv", "total_rec_prncp"], axis=1)

# Drop third group of features

loans = loans.drop(["total_rec_int", "total_rec_late_fee", "recoveries", "collection_recovery_fee", "last_pymnt_d", "last_pymnt_amnt"], axis=1)

frames.append(loans)

return frames

frames = import_clean(['LoanStats3a.csv'], threshold=0.7)

默认值是0.5,如果需要的话,我们也可以改为0.7。

这是一些将管道改得更为弹性的方式,按推荐程度降序排列:

使用可选参数、位置参数和必需参数

在函数中使用if / then语句以及使用布尔输入值作为函数的输入

使用新的数据结构(字典,列表等)来表示特定数据集的自定义操作

这个管道可以扩展到数据科学工作流程的所有阶段。这是一些伪代码,可以总揽它的结构。

import pandas as pd

def import_clean(file_list, threshold=0.5):

## Code

def visualize(df_list):

# Find the most important features and generate pairwise scatter plots

# Display visualizations and write to file.

plt.savefig("scatter_plots.png")

def combine(df_list):

# Combine dataframes and generate train and test sets

# Drop features all dataframes don't share

# Return both train and test dataframes

return train,test

def train(train_df):

# Train model

return model

def validate(train_df, test-df):

# K-fold cross validation

# Return metrics dictionary

return metrics_dict

frames = import_clean(['LoanStats3a.csv', 'LoanStats2012.csv'], threshold=0.7)

visualize(frames)

train_df, test_df = combine(frames)

model = train(train_df)

metrics = test(train_df, test_df)

print(metrics)

下一步

如果你对加深理解和练习感兴趣的话,我推荐:

了解如何将你的管道转化为作为一个模块或者从命令行中单独运行的脚本:

https://docs.python.org/3/library/main.html

了解如何使用Luigi来构建更复杂的、能够在云上面运行的管道

https://marcobonzanini.com/2015/10/24/building-data-pipelines-with-python-and-luigi/

了解更多有关数据工程的信息:

https://www.dataquest.io/blog/tag/data-engineering/

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

    关注

    0

    文章

    72

    浏览量

    11160
  • 数据科学
    +关注

    关注

    0

    文章

    165

    浏览量

    10056

原文标题:2 种数据科学编程中的思维模式,了解一下

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

收藏 人收藏

    评论

    相关推荐

    GUTOR备品备件主要包括哪几个组成部分

    GUTOR备品备件主要包括哪几个组成部分
    发表于 09-12 17:19

    你应该知道通用示波器几个组成部分

    过程呢?下文主要介绍通用示波器的组成部分。显示电路包括示波管及其控制电路两个部分。示波管是一种特殊的电子管,是示波器一个重要组成部分。示波管由电子枪、偏转系统和荧光屏3个部分组成。电子
    发表于 02-01 14:45

    无线数据收发器的基本组成部分的简单介绍

    无线数据收发器一般有哪几个基本组成部分呢?以无线数据收发器为例,向大家介绍它的组成结构。无线数据
    发表于 07-16 22:24

    虚拟存储器组成部分

    Linux将虚拟存储器高端的1/4留给内核,剩下3/4全留给用户进程。虚拟存储器上中的程序主要由以下几个重要组成部分
    发表于 08-07 07:00

    Andon电子看板系统的主要组成部分

    ;ANDON电子看板系统的主要组成部分ANDON电子看板系统主要由数据采集装置(用来采集生产数据、异常信息等数据)、显示看板、报警灯、统计分析后台四大
    发表于 12-05 18:03

    smt主要组成部分有哪些

    `  谁来阐述一下smt主要组成部分有哪些?`
    发表于 04-01 17:16

    IC设计完整流程分哪几个部分

    IC设计完整流程及工具IC的设计过程可分为两个部分,分别为:前端设计(也称逻辑设计)和后端设计(也称物理设计),这两个部分并没有统一严格的界限,凡涉及到与工艺有关的设计可称为后端设计。前端设计的主要
    发表于 07-28 07:51

    模块化数据中心的主要组成部分

    原标题:模块化数据中心的主要组成部分一、主要组成部分及参数模块化数据中心主要由机柜、密闭通道、供配电系统、制冷系统、智能监控系统、综合布线和消防系统
    发表于 09-08 07:17

    直流电源的组成部分

    直流电源有哪些组成部分我们大家应该都知道直流电源是交流电还有三相电的输入能够在数千伏的直流电压下进行输出的。它主要分为两大部分,第一个就是直流屏第二个就是直流充电屏。它的组成部件(1)绝缘检测单元
    发表于 01-03 08:17

    完整视频会议系统的组成部分有哪些?

    完整视频会议系统的组成部分有哪些?   一套完整的视频会议系统通常由视频会议终端、多点控制单元MCU、网络管理软件、传输
    发表于 02-21 09:47 7314次阅读

    详细介绍8310各组成部分原理

    详细介绍8310各组成部分原理
    发表于 10-21 17:58 8次下载

    关于完整的PLC程序组成部分

    一个完整的PLC程序一般有以下几个部分组成,文字粗糙但句句实用:
    的头像 发表于 09-19 09:40 4737次阅读

    pcb电路板的组成部分

    一块完整的pcb电路板的制作是需要经过多道复杂的工序的,那么pcb电路板的组成部分有哪些呢?下面由小编简单介绍一下。
    的头像 发表于 11-21 16:16 1417次阅读

    图灵机模型的组成部分及作用

    图灵机是图灵提出的一种抽象的计算模型,被认为是计算机科学的基础。在图灵机模型中,包含了以下几个组成部分:输入带、读写头、状态集合、转移函数以及输出。 首先,输入带是图灵机的数据存储器,
    的头像 发表于 12-20 17:23 3705次阅读

    什么是EMSS?它包括哪些组成部分?

    、降低成本,并增强企业与员工、供应商和客户之间的沟通与协作。 EMSS包括以下几个主要的组成部分: 移动设备管理(Mobile Device Management,MDM):MDM是EMSS
    的头像 发表于 02-03 09:56 3437次阅读