安排机器学习代码

从note本转移到 Python 脚本时安排代码。

Intuition

有安排的代码便是有可读的、可重现的、健壮的代码。您的团队、经理,最重要的是,您未来的自己,将感谢您为安排工作付出的最初尽力。在本课中,将讨论怎么将代码从note本迁移和安排到 Python 脚本。

Editor

在开端编码之前,需求一个空间来完结它。代码修改器有多种选择,例如VSCode、Atom、Sublime、PyCharm、Vim等,它们都供给独特的功用,同时供给代码修改和履行的基本操作。由于 VSCode 的简单性、多语言支持、附加组件和不断增加的行业选用,将运用 VSCode 来修改和履行代码。

欢迎您运用任何修改器,但将运用一些或许特定于 VSCode 的附加组件。

  1. 源代码为您的系统装置 VSCode:https ://code.visualstudio.com/
  2. 翻开指令面板(在 macF1上是Cmd++ Shift)P→ 输入“首选项:翻开设置(UI)”→ 点击Enter
  3. 调整您想要的任何相关设置(间距、字体大小等)
  4. 装置VSCode 扩展(运用修改器左侧面板上的乐高积木图标)

推荐的 VSCode 扩展

我主张装置这些扩展,你能够经过复制/粘贴这个指令:

code --install-extension 74th.monokai-charcoal-high-contrast
code --install-extension alefragnani.project-manager
code --install-extension bierner.markdown-preview-github-styles
code --install-extension bradgashler.htmltagwrap
code --install-extension christian-kohler.path-intellisense
code --install-extension euskadi31.json-pretty-printer
code --install-extension formulahendry.auto-close-tag
code --install-extension formulahendry.auto-rename-tag
code --install-extension kamikillerto.vscode-colorize
code --install-extension mechatroner.rainbow-csv
code --install-extension mikestead.dotenv
code --install-extension mohsen1.prettify-json
code --install-extension ms-azuretools.vscode-docker
code --install-extension ms-python.python
code --install-extension ms-python.vscode-pylance
code --install-extension ms-vscode.sublime-keybindings
code --install-extension njpwerner.autodocstring
code --install-extension PKief.material-icon-theme
code --install-extension redhat.vscode-yaml
code --install-extension ritwickdey.live-sass
code --install-extension ritwickdey.LiveServer
code --install-extension shardulm94.trailing-spaces
code --install-extension streetsidesoftware.code-spell-checker
code --install-extension zhuangtongfa.material-theme
假如您增加自己的扩展并期望与他人共享,只需运转此指令即可生成指令列表:

一旦设置好 VSCode,就能够开端创立项目目录,将运用它来安排一切的脚本。发动项目的方法有很多种,但推荐以下方法:

  1. 运用终端创立目录 (mkdir <PROJECT_NAME>)。

  2. 切换到您刚刚创立的项目目录 (cd<PROJECT_NAME>)。

  3. 经过键入从此目录发动 VSCodecode .

    要运用指令直接从终端翻开 VSCode,请翻开指令面板(或在 mac 上为++)→ 输入“Shell 指令:在 PATH 中装置‘代码’指令”→点击→重新发动终端。code$PATH``F1CmdShiftPEnter

  4. 在 VSCode (View>Terminal) 中翻开一个终端,以依据需求继续创立脚本 (touch <FILE_NAME>) 或其他子目录 (mkdir <SUBDIR>)。

组织机器学习代码

设置

自述文件

将从一个README.md文件开端安排,该文件将供给有关目录中的文件的信息、履行操作的阐明等。将不断更新此文件,以便可认为将来的信息编目。

touch README.md

让从增加用于创立虚拟环境的阐明开端:

# Inside README.md
python3 -m venv venv
source venv/bin/activate
python3 -m pip install pip setuptools wheel
python3 -m pip install -e .

假如您按下坐落修改器右上角的预览按钮(下图中赤色圆圈中的按钮),您能够看到README.md当为git推送到长途主机时会是什么姿态。

组织机器学习代码

配置

接下来,将创立一个名为的配置目录config,能够在其中存储应用程序所需的组件。在此目录中,将创立一个config.py和一个args.json.

mkdir config
touch config/main.py config/args.json
config/
├── args.json       - arguments
└── config.py       - configuration setup

在 内部config.py,将增加代码来界说关键目录方位(将在以后的课程中依据需求增加更多配置):

# config.py
from pathlib import Path
# Directories
BASE_DIR = Path(__file__).parent.parent.absolute()
CONFIG_DIR = Path(BASE_DIR, "config")

在里面args.json,将增加与数据处理和模型练习相关的参数。

{
    "shuffle": true,
    "subset": null,
    "min_freq": 75,
    "lower": true,
    "stem": false,
    "analyzer": "char",
    "ngram_max_range": 7,
    "alpha": 1e-4,
    "learning_rate": 1e-1,
    "power_t": 0.1
}

操作

将从tagifai在项目目录 (mlops) 中创立包目录 ( ) 开端。在这个包目录中,将创立一个main.py文件来界说期望能够履行的中心操作。

mkdir tagifai
touch tagifai/main.py
tagifai/
└── main.py       - training/optimization pipelines
`

当将代码从note本移动到下面main.py适当的脚本时,将在内部界说这些中心操作:

  • elt_data:提取、加载和转化数据。
  • optimize:调整超参数以针对目标进行优化。
  • train_model:运用优化研讨中的最佳参数练习模型。
  • load_artifacts:从给定的运转中加载经过练习的工件。
  • predict_tag:预测给定输入的标签。

Utilities

在开端从note本中移动代码之前,应该有意识地了解怎么将功用移动到脚本中。note本内有暂时进程是很常见的,由于只需note本在运转,它就会坚持状况。例如,能够像这样在note本中设置种子:

# Set seeds
np.random.seed(seed)
random.seed(seed)

但在脚本中,应该将此功用包装为一个洁净、可重用的函数,并带有适当的参数:

def set_seeds(seed=42):
    """Set seeds for reproducibility."""
    np.random.seed(seed)
    random.seed(seed)

能够将一切这些存储在包目录中的一个utils.py文件中。tagifai

touch tagifai/utils.py

tagifai/
├── main.py       - training/optimization pipelines
└── utils.py      - supplementary utilities

项目

在将代码从note本迁移到脚本时,最好依据实用程序进行安排。例如,可认为数据处理、练习、评价、预测等 ML 开发的各个阶段创立脚本:

将创立不同的 python 文件来包装数据和 ML 功用:

cd tagifai
touch data.py train.py evaluate.py predict.py
tagifai/
├── data.py       - data processing utilities
├── evaluate.py   - evaluation components
├── main.py       - training/optimization pipelines
├── predict.py    - inference utilities
├── train.py      - training utilities
└── utils.py      - supplementary utilities

或许在其他项目中有其他脚本,由于它们是必要的。例如,一般有一个models.py脚本,在 Pytorch、Tensorflow 等中界说显式模型架构。

以这种方法安排代码库也使更容易了解(或修改)代码库。本能够将一切代码放入一个main.py脚本中,但随着项目的增加,将很难在一个全体文件中导航。另一方面,能够经过分化data.pysplit.pypreprocess.py等来假设更细粒度的立场。假如有多种拆分、预处理等方法(例如 ML 操作库),这或许更有意义,但是对于使命,在这个更高级别的安排中就足够了。

准则

经过下面的迁移进程,将反复运用几个中心软件工程准则。

将功用包装到函数中

怎么决议何时将特定代码行包装为一个独自的函数?函数应该是原子的,由于它们每个都有单一的职责,这样就能够轻松地测验它们。假如不是,需求将它们拆分红更细粒度的单元。例如,能够用这些行替换项目中的标签:

oos_tags = [item for item in df.tag.unique() if item not in tags_dict.keys()]
df.tag = df.tag.apply(lambda x: "other" if x in oos_tags else x)

────比较────

def replace_oos_tags(df, tags_dict):
    """Replace out of scope (oos) tags."""
    oos_tags = [item for item in df.tag.unique() if item not in tags_dict.keys()]
    df.tag = df.tag.apply(lambda x: "other" if x in oos_tags else x)
    return df

最好将它们包装为一个独自的函数,由于或许想要:

  • 在项目的其他部分或其他项目中重复此功用。
  • 测验这些标签实际上是否被正确替换。

组合广义函数

Specific
def replace_oos_tags(df, tags_dict):
    """Replace out of scope (oos) tags."""
    oos_tags = [item for item in df.tag.unique() if item not in tags_dict.keys()]
    df.tag = df.tag.apply(lambda x: "other" if x in oos_tags else x)
    return df

────比较────

Generalized
def replace_oos_labels(df, labels, label_col, oos_label="other"):
    """Replace out of scope (oos) labels."""
    oos_tags = [item for item in df[label_col].unique() if item not in labels]
    df[label_col] = df[label_col].apply(lambda x: oos_label if x in oos_tags else x)
    return df

这样当列的名称发生变化或许想用不同的标签替换时,很容易调整代码。这还包括在函数中运用通用名称,例如label而不是特定标签列的名称(例如tag)。它还允许其他人在他们的用例中重用此功用。

但是,重要的是不要强行泛化,假如它触及很多的尽力。假如看到类似的功用再次出现,能够稍后再花时间

本文主体源自以下链接:

@article{madewithml, author = {Goku Mohandas}, title = { Made With ML }, howpublished = {\url{madewithml.com/}}, year = {2022} }

本文由mdnice多渠道发布