10个实用的机器学习建议

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”

总第 126 篇文章,本文大约 2500 字,阅读大约需要 10 分钟

原文:https://medium.com/modern-nlp/10-great-ml-practices-for-python-developers-b089eefc18fc

作者:Pratik Bhavsar

导语

有时候作为一名数据科学家,我们可能会忘记自己的主要职责。我们首先是开发者,接着是研究者,最后还可能是数学家。因此,我们最重要的责任就是快速开发出一个没有错误的解决方案。

只因为我们能创建模型,并不意味着我们就是神,这不会带给我们可以写出糟糕的代码的自由。

从我开始进入这个领域,我曾经犯下很多错误,并考虑分享一些我所知道的对于机器学习工程开发中最常用的技能。在我看来,这些也是工业界目前最缺乏的一些技能。

如果必须在一个优秀的数据科学家和一个优秀的机器学习工程师中选择招聘一个,我会选择后者。

下面就开始介绍 10 个实用的机器学习建议吧。


1. 学会写抽象类

当你开始写抽象类的时候,你就知道它可以让你的代码库变得很清晰明了,它们会强制采用一样的方法和方法名字。如果同个项目有多个人参与,并且每个人都用不同方法,那会产生不必要的混乱情况。

下面是一个代码例子:

import os
from abc import ABCMeta, abstractmethodclass DataProcessor(metaclass=ABCMeta):"""Base processor to be used for all preparation."""def __init__(self, input_directory, output_directory):self.input_directory = input_directoryself.output_directory = output_directory@abstractmethoddef read(self):"""Read raw data."""@abstractmethoddef process(self):"""Processes raw data. This step should create the raw dataframe with all the required features. Shouldn't implement statistical or text cleaning."""@abstractmethoddef save(self):"""Saves processed data."""class Trainer(metaclass=ABCMeta):"""Base trainer to be used for all models."""def __init__(self, directory):self.directory = directoryself.model_directory = os.path.join(directory, 'models')@abstractmethoddef preprocess(self):"""This takes the preprocessed data and returns clean data. This is more about statistical or text cleaning."""@abstractmethoddef set_model(self):"""Define model here."""@abstractmethoddef fit_model(self):"""This takes the vectorised data and returns a trained model."""@abstractmethoddef generate_metrics(self):"""Generates metric with trained model and test data."""@abstractmethoddef save_model(self, model_name):"""This method saves the model in our required format."""class Predict(metaclass=ABCMeta):"""Base predictor to be used for all models."""def __init__(self, directory):self.directory = directoryself.model_directory = os.path.join(directory, 'models')@abstractmethoddef load_model(self):"""Load model here."""@abstractmethoddef preprocess(self):"""This takes the raw data and returns clean data for prediction."""@abstractmethoddef predict(self):"""This is used for prediction."""class BaseDB(metaclass=ABCMeta):""" Base database class to be used for all DB connectors."""@abstractmethoddef get_connection(self):"""This creates a new DB connection."""@abstractmethoddef close_connection(self):"""This closes the DB connection."""

2. 固定好随机种子

实验的可复现是非常重要的一件事情,而随机种子可能会造成实验结果无法复现。因此必须固定好随机种子,否则会导致不同的训练集和测试集,以及神经网络的不同初始化权重,这些都会导致不一样的实验结果。

def set_seed(args):random.seed(args.seed)np.random.seed(args.seed)torch.manual_seed(args.seed)if args.n_gpu > 0:torch.cuda.manual_seed_all(args.seed)

3. 先展示少量数据

如果你的数据量非常大,然后你接下来要做的工作是类似于清洗数据或者建模,那么可以每次采用少量的数据来避免一次加载大量的数据。当然这个做法的前提是你只是希望测试代码,而不是实际开始实现相应的工作。

这个做法非常实用,特别是你本地电脑的配置不足以加载全部数据集的时候,但你又想在本地电脑采用 Jupyter/ VS code/ Atom 做实验。

代码例子如下:

df_train = pd.read_csv(‘train.csv’, nrows=1000)

4. 预估可能的错误(一个成熟开发者的标志)

记得每次都要检查数据是否存在空数据(NA),因为这将带来代码出错。当然,即便当前数据中不存在,这并不意味着在后续的训练步骤中不会出现这种情况,所以需要保持这种检查。

比如采用下述的代码:

print(len(df))
df.isna().sum()
df.dropna()
print(len(df))

5. 展示处理进度

当在处理大量的数据的时候,如果能够知道总共需要的时间以及当前的处理进度是非常有帮助的。

这里有几种方法:

第一种方法:采用 tqdm 库,代码例子:

from tqdm import tqdm
import timetqdm.pandas()df['col'] = df['col'].progress_apply(lambda x: x**2)text = ""
for char in tqdm(["a", "b", "c", "d"]):time.sleep(0.25)text = text + char

第二种方法--fastprogress

from fastprogress.fastprogress import master_bar, progress_bar
from time import sleep
mb = master_bar(range(10))
for i in mb:for j in progress_bar(range(100), parent=mb):sleep(0.01)mb.child.comment = f'second bar stat'mb.first_bar.comment = f'first bar stat'mb.write(f'Finished loop {i}.')

效果如下图所示:

6.  Pandas 可能会很慢

如果你采用 pandas 库,那么你会发现有的时候它的速度会有多慢,特别是采用 groupby 函数的时候。不需要想尽办法来寻找更好的加速方法,只需要修改一行代码即可,如下所示,采用 modin 即可解决这个问题:

import modin.pandas as pd

7. 计算函数运行的时间

不是所有的函数运行时间都是一样的。

即便你的代码都跑通了,但也不表示你写出一手好代码。有些软性错误(soft-bugs)可能会导致你的代码运行算的变慢,因此很有必要找到这些问题。可以采用下述装饰器来打印函数的运行时间。

import time
from functools import wrapsdef timing(f):"""Decorator for timing functionsUsage:@timingdef function(a):pass"""@wraps(f)def wrapper(*args, **kwargs):start = time.time()result = f(*args, **kwargs)end = time.time()print('function:%r took: %2.4f sec' % (f.__name__,  end - start))return resultreturn wrapper

使用的例子如下所示:

from time import sleep
@timing
def count_nums():sleep(1)

结果如下所示:

8. 不要在云服务器方面花太多钱

没有人会喜欢一个浪费云资源的工程师

有些实验是需要跑上数十个小时的,这些实验很难进行跟踪并在实验完成的时候关闭云服务器的实例。我曾经犯过这样的错误,同时也看到其他人也曾经因为这个忘记关闭好几天。

这种情况通常发现在周五的时候,然后让其一直运行到周一。

为了避免发生这种情况,可以在代码的最后加入下列代码。

不过,注意要主要代码放在 try catch中进行捕获异常,以防止发生错误。这种情况也是很可能发生的。

import osdef run_command(cmd):return os.system(cmd)def shutdown(seconds=0, os='linux'):"""Shutdown system after seconds given. Useful for shutting EC2 to save costs."""if os == 'linux':run_command('sudo shutdown -h -t sec %s' % seconds)elif os == 'windows':run_command('shutdown -s -t %s' % seconds)

9. 创建并保存报告

在训练模型后,所有的想法最终都是来自错误和评判指标的分析。因此需要创建并保存好一个格式不错的报告,以便进行汇报。

下面是一个代码例子:

import json
import osfrom sklearn.metrics import (accuracy_score, classification_report,confusion_matrix, f1_score, fbeta_score)def get_metrics(y, y_pred, beta=2, average_method='macro', y_encoder=None):if y_encoder:y = y_encoder.inverse_transform(y)y_pred = y_encoder.inverse_transform(y_pred)return {'accuracy': round(accuracy_score(y, y_pred), 4),'f1_score_macro': round(f1_score(y, y_pred, average=average_method), 4),'fbeta_score_macro': round(fbeta_score(y, y_pred, beta, average=average_method), 4),'report': classification_report(y, y_pred, output_dict=True),'report_csv': classification_report(y, y_pred, output_dict=False).replace('\n','\r\n')}def save_metrics(metrics: dict, model_directory, file_name):path = os.path.join(model_directory, file_name + '_report.txt')classification_report_to_csv(metrics['report_csv'], path)metrics.pop('report_csv')path = os.path.join(model_directory, file_name + '_metrics.json')json.dump(metrics, open(path, 'w'), indent=4)

10. 写好接口

你可以很好完成数据清理和训练模型,但是也还可能在最后制造很大的错误,比如没有写好服务接口。我的经验告诉我,很多人其实不知道如果写出一个好的服务接口,文档说明和服务安装配置。后面我会写另一篇文章介绍,但现在先简单介绍一下。

下面是一个很好的用于经典的机器学习和深度学习的部署策略,但注意是请求数量不大的时候,比如每分钟1000次。

一个组合:Fastapi + uvicorn + gunicorn

  • Fastest--采用 fastapi  写接口是非常快速的,正如[1]中的报告展示,以及原因可以参考[2];

  • 文档-- fastapi有免费的官方文档以及可以通过 http:url/docs 进行测试,并且这个链接可以自动生成以及随着我们修改代码而自动改变;

  • Workers--采用 gunicorn 服务器部署接口是因为它具有开始多于 1 个 worker 的功能,并且你应该至少保持 2 个。

运行下列命令可以部署使用 4 个 wokers ,另外可以通过测试来优化这个 workers 的数量。

pip install fastapi uvicorn gunicorngunicorn -w 4 -k uvicorn.workers.UvicornH11Worker main:app

一个运行例子如下图所示:


参考

  1. https://www.techempower.com/benchmarks/#p=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7

  2. https://fastapi.tiangolo.com/benchmarks/


精选AI文章

1. 深度学习算法简要综述(上)

2. 深度学习算法简要综述(下)

3. 关于AI你可能不知道的5件事情

4.常用机器学习算法汇总比较(完)

5.实战|手把手教你训练一个基于Keras的多标签图像分类器

精选python文章

1. Python 基础入门--简介和环境配置

2. python版代码整洁之道

3. 快速入门 Jupyter notebook

4. Jupyter 进阶教程

5. 10个高效的pandas技巧

精选教程资源文章

1. [资源分享] TensorFlow 官方中文版教程来了

2. [资源]推荐一些Python书籍和教程,入门和进阶的都有!

3. [Github项目推荐] 推荐三个助你更好利用Github的工具

4. Github上的各大高校资料以及国外公开课视频

5. GitHub上有哪些比较好的计算机视觉/机器视觉的项目?


欢迎关注我的微信公众号--算法猿的成长,或者扫描下方的二维码,大家一起交流,学习和进步!

 

如果觉得不错,在看、转发就是对小编的一个支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式笔记——生成器模式(Builder Pattern)

一、概述在软件系统中,把构造对象实例的逻辑移到了类的外部,在这个类的外部定义了类的逻辑。它把一个复杂对象的构造过程从对象的表示中分离出来了,其直接效果是将一个复杂的对象简化为一个比较简单的目标对象。它强调的是产品构造过程。二、…

每日一学:如何转换png图片为jpg图片

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 128 篇文章,本文大约 800 字,阅读大约需要 3 分钟背景最近在工作中会遇到需要将 png 图片转换为 jpg 图片的需求,主要原因也是 png 图片占的空间太…

python 数据模型

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 129 篇文章,本文大约 4500 字,阅读大约需要 15 分钟最近开始阅读《流畅的python》,也会开始更新这本书的学习笔记第一篇的内容是第一章 python 数…

每日一学:如何用matplotlib展示图片

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 130 篇文章,本文大约 1000 字,阅读大约需要 5 分钟前言今天简单介绍如何通过 matplotlib 展示图片,分为以下几种情况:直接用 matplotli…

每日一学:如何读取网络图片

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 131 篇文章,本文大约 1300 字,阅读大约需要 3 分钟前言有时候我们需要读取的图片是网络上的图片,应该怎么操作呢?这里也是介绍两个常用…

编写高效的PyTorch代码技巧(上)

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 132 篇文章,本文大约 7000 字,阅读大约需要 20 分钟原文:https://github.com/vahidk/EffectivePyTorch作者:vahidk前言这是一份 PyTorc…

编写高效的PyTorch代码技巧(下)

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 133 篇文章,本文大约 3000 字,阅读大约需要 15 分钟原文:https://github.com/vahidk/EffectivePyTorch作者:vahidk前言这是一份 PyTorc…

2020年计算机视觉学习指南

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 134 篇文章,本文大约 3000 字,阅读大约需要 10 分钟原文:https://towardsdatascience.com/guide-to-learn-computer-vision-in-2020-36f19d92c934作…

是选择Keras还是PyTorch开始你的深度学习之旅呢?

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 135 篇文章,本文大约 7000 字,阅读大约需要 20 分钟原文:https://medium.com/karan_jakhar/keras-vs-pytorch-dilemma-dc434e5b5ae0作者&#xff1…

关于myeclipse打开jsp巨慢解决方案

作为企业级开发最流行的工具,用Myeclipse开发java web程序无疑是最合适的,java web前端采用jsp来显示,myeclipse默认打开jsp的视图有卡顿的现象,那么如何更改jsp默认的打开方式,让我们可以进行更快速的jsp开发呢? 简单…

event

听取了网友:kenwang的意见,我的Blog在记流水账啊,现在才发现我发表的都是代码,一个感想也没有,以后要慢慢改正。明天要培训公司的框架,后天要搬家,这个周未没有得休息。

60分钟快速入门PyTorch

点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”总第 136 篇文章,本文大约 26000 字,阅读大约需要 60 分钟PyTorch 是由 Facebook 开发,基于 Torch 开发,从并不常用的 Lua 语言转为 Python …

[libGDX游戏开发教程]使用libGDX进行游戏开发(12)-Action动画

前文章节列表:使用libGDX进行游戏开发(11)-高级编程技巧 使用libGDX进行游戏开发(10)-音乐音效不求人,程序员也可以DIY 使用libGDX进行游戏开发(9)-场景过渡使用libGDX进行游戏开发(8)-没有美工的程序员,能够依赖的还有粒子系统 使用libGDX进…

将DataSet中的操作更新到Access数据库

代码如下&#xff1a;<%import Namespace Namespacesystem.data%><%import Namespace Namespacesystem.data.oledb%><script languagevb runatserver>Sub page_load()sub page_load() dim strConnection as string dim strSQL as string dim ob…

@synthesize obj=_obj的意义详解 @property和@synthesize

本文转载至&#xff1a;http://blog.csdn.net/showhilllee/article/details/8971159我们在进行iOS开发时&#xff0c;经常会在类的声明部分看见类似于synthesize window_window; 的语句&#xff0c;那么&#xff0c;这个window是什么&#xff0c;_ window又是什么&#xff0c;两…

Github项目推荐|可视化 GAN 的训练过程

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 137 篇文章&#xff0c;本文大约 1000 字&#xff0c;阅读大约需要 5 分钟今天介绍的一个开源的 github 项目&#xff0c;主要是实现了对 GAN 训练过程的可视化代码&#xff0c;项目链…

Github|类别不平衡学习资源(上)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 138 篇文章&#xff0c;本文大约 5400 字&#xff0c;阅读大约需要 15 分钟今天推荐的是一个 github 项目&#xff0c;项目地址如下&#xff0c;主要是类别不平衡学习的论文、代码、框…

Github|类别不平衡学习资源(下)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 139 篇文章&#xff0c;本文大约 3600 字&#xff0c;阅读大约需要 10 分钟继续介绍类别不平衡学习资源&#xff0c;github 地址&#xff1a;https://github.com/ZhiningLiu1998/awes…