コードをローカルで検証する
機械学習プロジェクトのコードを変更するたびに、コードとモデルの品質を検証する必要があります。
継続的インテグレーション中に、アプリケーションの資産を作成して検証します。 データ サイエンティストは、データの準備とモデルのトレーニングに使用されるスクリプトの作成に焦点を当てるでしょう。 機械学習エンジニアは、後でパイプラインのスクリプトを使用して、これらのプロセスを自動化します。
スクリプトを検証する方法として、次の 2 つの一般的なタスクがあります。
- リンティング: Python または R スクリプトに含まれるプログラムまたはスタイルのエラーをチェックします。
- 単体テスト: スクリプトの内容のパフォーマンスをチェックします。
コードを検証することで、モデルのデプロイ時にバグや問題を防ぎます。 Visual Studio Code などの IDE で、ローカルでリンターと単体テストを実行することによって、コードをローカルで検証できます。
また、Azure Pipelines や GitHub Actions を使用して自動化されたワークフローで、リンターと単体テストを実行することもできます。
これから Visual Studio Code でリンティングと単体テストを実行する方法について説明します。
コードをリントする
コードの品質は、ユーザーとチームが同意する標準によって異なります。 合意された品質が必ず満たされるようにするため、コードがチームの標準に準拠しているかどうかを確認するリンターを実行できます。
使用するコード言語に応じて、コードをリントするいくつかのオプションがあります。 たとえば、Python を使用する場合は、Flake8 または Pylint のいずれかを使用できます。
Flake8 を使用してコードをリントする
Visual Studio Code において Flake8 をローカルで使用するには、以下の手順を実行します。
-
pip install flake8
を使用して Flake8 をインストールします。 - 構成ファイル
.flake8
を作成し、リポジトリにそのファイルを格納します。 - 設定 (
Ctrl+,
) に移動し、リンターとして Flake8 を使用するように Visual Studio Code を構成します。 -
flake8
を検索します。 - Python > Linting > Flake8 Enabled で有効にします。
- Flake8 のパスを、
.flake8
ファイルを保存したリポジトリの場所に設定します。
コード品質に関するチームの標準を指定するには、Flake8 リンターを構成します。 標準を定義する一般的な方法は、コードと共に格納される .flake8
ファイルを作成することです。
.flake8
ファイルは [flake8]
で始まり、その後に使用する構成が続くようにします。
ヒント
可能な構成パラメーターの完全な一覧については、Flake8 のドキュメントを参照してください。
たとえば、すべての行の最大長を 80 文字を超えないようにする場合は、.flake8
ファイルに次の行を追加します。
[flake8]
max-line-length = 80
Flake8 では、返される可能性のあるエラーのリストがあらかじめ定義されています。 さらに、PEP 8 スタイル ガイドに基づくエラー コードを使用することもできます。 たとえば、インデントや空白の適切な使用を参照するエラー コードを含めることができます。
リンターの一部となる一連のエラー コードを選択 (select
) するか、既定のオプションのリストから無視するエラー コード (ignore
) を選択できます。
結果として、.flake8
構成ファイルは次の例のようになります。
[flake8]
ignore =
W504,
C901,
E41
max-line-length = 79
exclude =
.git,
.cache,
per-file-ignores =
code/__init__.py:D104
max-complexity = 10
import-order-style = pep8
ヒント
参照できるエラー コードの概要については、Flake8 エラー リストを参照してください。
コードをリントするように Visual Studio Code を構成したら、任意のコード ファイルを開いて、リントの結果を確認できます。 警告またはエラーには下線が引かれます。 [問題の表示] を選択すると、問題を調べてエラーを把握できます。
Azure Pipelines または GitHub Actions でリントする
Azure Pipelines または GitHub Actions を使用して自動でリンターを実行することもできます。 次のようにすると、いずれかのプラットフォームで提供されるエージェントによって、リンターが実行されます。
- 構成ファイル
.flake8
を作成し、リポジトリにそのファイルを格納します。 - YAML で継続的インテグレーション パイプラインまたはワークフローを定義します。
- タスクまたはステップとして、
python -m pip install flake8
で Flake8 をインストールします。 - タスクまたはステップとして、
flake8
コマンドを実行してコードをリントします。
単体テスト
リンティングがコードの記述方法を検証する場合、単体テストによってコードの動作が確認されます。 単体テストでは、作成するコードが確認されます。 したがって、単体テストはコード テストとも呼ばれます。
ベスト プラクティスとして、コードは主に関数の外に配置するようにします。 データを準備する関数を作成したか、モデルをトレーニングする関数を作成したかどうかにかかわらず、 次のような単体テストを適用できます。
- 列名が正しいことを確認する。
- 新しいデータセットのモデルの予測レベルを確認する。
- 予測レベルの分布を確認する。
Python を使用する場合は、Pytest と Numpy (Pytest フレームワークを使用) を使用してコードをテストできます。 Pytest での作業については、Pytest でテストを記述する方法をご確認ください。
ヒント
詳細については、Visual Studio Code での Python テストのチュートリアルを確認してください。
次の関数を含むトレーニング スクリプト train.py
を作成しました。
# Train the model, return the model
def train_model(data, ridge_args):
reg_model = Ridge(**ridge_args)
reg_model.fit(data["train"]["X"], data["train"]["y"])
return reg_model
リポジトリ内のディレクトリ src/model/train.py
にトレーニング スクリプトを格納したとします。 関数 train_model
をテストするには、src.model.train
から関数をインポートする必要があります。
test_train.py
フォルダーに tests
ファイルを作成します。 Python コードをテストする方法の 1 つは、numpy
を使用する方法です。 Numpy には、配列、文字列、オブジェクト、または項目を比較するいくつかの assert
関数が用意されています。
ヒント
Numpy テストを使用するときのテスト ガイドラインと、Numpy のテスト サポートの詳細について説明します。
たとえば、train_model
関数をテストするには、小さなトレーニング データセットを使用し、予測が定義済みのパフォーマンス メトリックと "assert
" かどうかを確認するために を使用できます。
import numpy as np
from src.model.train import train_model
def test_train_model():
X_train = np.array([1, 2, 3, 4, 5, 6]).reshape(-1, 1)
y_train = np.array([10, 9, 8, 8, 6, 5])
data = {"train": {"X": X_train, "y": y_train}}
reg_model = train_model(data, {"alpha": 1.2})
preds = reg_model.predict([[1], [2]])
np.testing.assert_almost_equal(preds, [9.93939393939394, 9.03030303030303])
UI を使用して Visual Studio Code でコードをテストするには、以下の手順を実行します。
- トレーニング スクリプトを実行するために必要なすべてのライブラリをインストールします。
- Visual Studio Code 内で
pytest
がインストールされ、有効になっていることを確認します。 - Visual Studio Code 用の Python 拡張機能をインストールします。
- 使用する
train.py
スクリプトを選択します。 - 左側のメニューから [テスト] タブを選択します。
-
pytest を選択し、テスト ディレクトリを
tests/
フォルダーに設定して、Python テストを構成します。 - 再生ボタンを選択してすべてのテストを実行し、結果を確認します。
Azure DevOps パイプラインまたは GitHub アクションでテストを実行するには、以下の手順を実行します。
- トレーニング スクリプトを実行するために必要なすべてのライブラリがインストールされていることを確認します。
requirements.txt
ですべてのライブラリを一覧表示するpip install -r requirements.txt
を使用するのが理想的です -
pytest
のpip install pytest
でのインストール -
pytest tests/
でテストを実行します
テスト結果は、実行するパイプラインまたはワークフローの出力に表示されます。
注意
リンティングまたは単体テスト中にエラーが返された場合、CI パイプラインが失敗する可能性があります。 したがって、CI パイプラインをトリガーする前に、まずローカルでコードを確認することをお勧めします。