1. 開発環境への思い

開発環境は仕事道具、手に馴染んだ環境が開発効率に大きな影響を与えます。

でも開発環境のセットアップはこだわると時間がかかる。思い通りの環境ができないこともある。

ディレクトリ構成はどうするか?ドキュメントはどこまで作成しようか?エディタにもこだわりたい。

気づけば膨大な時間を浪費してデータを扱う作業にはたどり着けない。

私はこのような日々を延々と繰り返してきました。

この不毛な(しかしある意味では楽しくもある)繰り返しから抜け出すためにデータサイエンスの開発環境を整理しておくことにした。

はじめの構想は

を使用して環境を構築。

cookiecutter-data-scienceは使い慣れていないので試したことを記録として残したい。

実際にモデル開発するところまで実装する。(実装したい)

cookiecutter-data-scienceをいろいろ試してみたことがメインコンテンツとなる予定です。

2. kaggle api

まずはデータが必要なのでkaggleコマンドをインストールします。

kaggle-apiのドキュメントに従うだけなので戸惑うことはないと思います。

2.1. インストール

pipでインストールするだけです。

terminal
pip install kaggle

2.2. kaggle.jsonのダウンロード

kaggleのユーザプファイルからダウンロードします。

規定の位置に移動して権限設定をします。

terminal
mkdir ~/.kaggle
mv kaggle.json ~/.kaggle/
chmod 600 ~/.kaggle/kaggle.json

2.3. titanicデータのダウンロード

kaggleコマンドを使用してデータをダウンロードします。

ダウンロードしたファイルはzipファイルなので解答しておきます。

とりあえずデータがダウンロードできることろまで確認できました。

本格的なの環境はこれから構築していきます。

terminal
kaggle competitions download titanic
unzip titanic.zip

3. cookiecutter

プロジェクトの雛形を作成するツールです。

多くの雛形が公開されていて自分で雛形を作成することも可能です。

この記事では自分で雛形を作成することはしません。

cookiecutter-data-science を使用してモデルを構築することが目標です。

cookiecutterはpipでインストールするだけです。

terminal
pip install cookiecutter

4. cookiecutter-data-science でプロジェクトを作成

本題のプロジェクトを作成です。

下記のコマンドを実行することでプロジェクトを作成できます。コマンドを実行するとプロジェクト名など対話的な入力で設定します。

terminal
cookiecutter https://github.com/drivendata/cookiecutter-data-science

私は下記のように入力してプロジェクトを作成しました。 .terminal

project_name [project_name]: setupdatascience
repo_name [setupdatascience]:
author_name [Your name (or your organization/company/team)]: ryo
description [A short description of the project.]:
Select open_source_license:
1 - MIT
2 - BSD-3-Clause
3 - No license file
Choose from 1, 2, 3 [1]: 1
s3_bucket [[OPTIONAL] your-bucket-for-syncing-data (do not include 's3://')]:
aws_profile [default]:
Select python_interpreter:
1 - python3
2 - python
Choose from 1, 2 [1]: 1


=============================================================================
*** DEPRECATION WARNING ***

Cookiecutter data science is moving to v2 soon, which will entail using
the command `ccds ...` rather than `cookiecutter ...`. The cookiecutter command
will continue to work, and this version of the template will still be available.
To use the legacy template, you will need to explicitly use `-c v1` to select it.

Please update any scripts/automation you have to append the `-c v1` option,
which is available now.

For example:
    cookiecutter -c v1 https://github.com/drivendata/cookiecutter-data-science
=============================================================================

WARNINGが出ています。バージョンが更新されそうです。今回はこのまま進めます。

実行後にはsetupdatascienceディレクトリが作成されています。これが使用するプロジェクトです。

5. プロジェクト環境の構築

作成したプロジェクトをさらに追加で構築していきます。

5.1. venvで仮想環境を作成

プロジェクトごとに仮想環境を構築します。

私はvenvを使用しています。

仮想環境を構築したらacivateしておきます。

terminal
python -m venv .setupdatascience
source .setupdatascience/bin/activate

5.2. pip install -r requirements.txt

作成したプロジェクトにはrequirements.txtが作成されているのでインストールします。

terminal
pip install -r requirements.txt

実行してみるとawscliでエラーが発生しました。使う予定がないのでとりあえずこのまま進めます。

error
ERROR: awscli 1.25.7 has requirement docutils<0.17,>=0.10, but you'll have docutils 0.18.1 which is incompatible.

6. git init

とりあえずgit initしておきます。

6.1. .gitignoreに仮想環境.setupdatascience/を追加

仮想環境を管理対象から外すために.gitignoreに追加します。

7. プロジェクトの環境設定

外部パッケージのインストールなどプロジェクの環境設定を進めます。

7.1. とりあえずrequirements.txtに外部パッケージの追加

後々必要になりそうな外部パッケージをrequirements.txtに追加します。

terminal
echo "pandas" >> requirements.txt
echo "sklearn" >> requirements.txt
echo "pytest" >> requirements.txt
echo "lightgbm" >> requirements.txt
echo "mlflow" >> requirements.txt

7.2. 外部パッケージのインストール

外部パッケージをインストールします。仮想環境にインストールしたいので仮想環境をactivateしておきます。

makeコマンドでプロジェクトの環境設定ができます。

terminal
make requirements

これで外部パッケージのインストールの完了です。

8. titanicデータのダウンロード

kaggleからtitanicデータをダウンロードします。kaggle apiの設定は済ませておきます。

データはdata/raw/に保存します。

zipファイルだと扱いが面倒なので解凍しておきます。

terminal
kaggle competitions list
kaggle competitions download titanic
mv titanic.zip ./data/raw
unzip ./data/raw/titanic.zip -d ./data/raw/

csvファイルはgitの管理対象から外しておきます。

terminal
echo "*.csv" >> .gitignore

9. データインポート/エクスポートしてみる

実際にデータインポートとエクスポートを試してみます。

9.1. プログラム:src/data/make_dataset.py

プロジェクトにはデータ作成用のプログラムの雛形が作成されています。

このプログラムにCSVファイルのインポートとエクスポートの処理を追加します。

追加するのは3つの処理です。

  1. pandasのインポート

  2. csvファイルの読み込み

  3. csvファイルの出力

pandasのインポートはファイルの先頭付近、csvファイルの処理はmain関数に追加します。

3行追加するだけでほかは変更しません。

実際のプログラムです。

src/data/make_dataset.py
# -*- coding: utf-8 -*-
import click
import logging
from pathlib import Path
from dotenv import find_dotenv, load_dotenv
import pandas as pd


@click.command()
@click.argument('input_filepath', type=click.Path(exists=True))
@click.argument('output_filepath', type=click.Path())
def main(input_filepath, output_filepath):
    """ Runs data processing scripts to turn raw data from (../raw) into
        cleaned data ready to be analyzed (saved in ../processed).
    """
    logger = logging.getLogger(__name__)
    logger.info('making final data set from raw data')
    train = pd.read_csv(Path(input_filepath, "train.csv"))
    train.to_csv(Path(output_filepath, "train.csv"))


if __name__ == '__main__':
    log_fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    logging.basicConfig(level=logging.INFO, format=log_fmt)

    # not used in this stub but often useful for finding various files
    project_dir = Path(__file__).resolve().parents[2]

    # find .env automagically by walking up directories until it's found, then
    # load up the .env entries as environment variables
    load_dotenv(find_dotenv())

    main()

これでとりあえずのプログラムは完成です。

9.2. 実行

makeコマンドで実行できます。

terminal
make data

Makefileを確認すると入力ディレクトリと出力ディレクトリが指定されています。

Makefile
## Make Dataset
data: requirements
	$(PYTHON_INTERPRETER) src/data/make_dataset.py data/raw data/processed
  1. 入力ディレクトリ:data/raw

  2. 出力ディレクトリ:data/processed

make dataを実行後にdata/processedを確認するとtrain.csvが作成されていることを確認できます。

9.3. logをファイルに出力する

作成中