百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

独家2种数据科学编程中的思维模式,了解一下(附代码)

toyiye 2024-06-21 12:01 10 浏览 0 评论


作者:Srini Kadamati

翻译:梁傅淇

校对:丁楠雅

本文约2500字,建议阅读10分钟。

本文以具体的例子阐释了如何最优化原型思维模式及生产流思维模式的应用。

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

  • 数据收集
  • 数据清洗
  • 数据探索和可视化
  • 统计或预测建模


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

通常而言,在同一个文件中覆盖完整的流程将会导致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 pdloans_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 Prospectushttps://www.lendingclub.com/info/prospectus.action

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

import pandas as pdloans_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/

原文标题:

Programming Best Practices For Data Science

原文链接:

https://www.kdnuggets.com/2018/08/programming-best-practices-data-science.html

译者简介


梁傅淇,软件工程本科在读,主修大数据分析,喜好搜索、收集各类信息。希望能在THU数据派平台认识更多对数据分析感兴趣的朋友,一起研究如何从数据挖掘出有用的模型和信息。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码