広告 プログラミング

【Python】機械学習を用いた競馬予想【環境構築編】

※本ページには、プロモーション(広告)が含まれています。

悩んでいる人

人手で競馬予想を行うのは限界があるため、機械学習を利用したい。

分析時の環境構築方法が分からないから教えて欲しい。

こんなお悩みを解決します。

「機械学習を用いた勉強をしたい」と思っていたところ、機械学習を用いて競馬予想を行っている記事を見つけました。

丁度良い題材になると考え、今回から、環境構築、データ収集、前処理、特徴量設計、学習・推論の一連の作業を記事にまとめ、機械学習を用いてどの程度競馬予想が行えるかを検証していきたいと思います。

今回は、環境構築部分が対象となります。(データ収集も終わり次第、記事にしていく予定です。)

クラウド環境を利用するという方法もありますが、データ収集や前処理を実行する際は、自前の計算機を利用した方がランニングコストを抑えられます。

このため、今回は自前の計算機(手元のPC)に環境を構築する方法について解説します。

実行するコマンド等を含めて紹介するので、興味がある方はぜひご覧ください。

前提

今回は、環境構築を行うマシン上にDockerがインストール済みである前提で説明を進めます。

まだ、Dockerをインストールしていない方かつLinuxの方は、以下の記事を参考に、Dockerのインストールを完了させてください。

あわせて読みたい
【解説】Raspberry Pi+Dockerでサーバ構築

続きを見る

また、今後、前処理や特徴量設計を行っていきますが、私自身、競馬に詳しくないため、調べつつ取り組むことになると思います。

このため、以降の記事を読み進めることで、すぐに効果が得られる情報を提供できる訳ではありません。

この点を理解した上で、読み進めていただければと思います。

参考サイト

環境構築を行うにあたり、以下のサイトを参考にしました。

https://qiita.com/dijzpeb/items/db74aa9726aaf55201eb

https://www.idnet.co.jp/column/page_187.html

また、データ収集部分までは上記のQiitaの記事を参考にしたいと思います。

環境構築

今回は、環境の移植のしやすさとPythonを利用することを想定し、Docker&JupyterLabによる環境構築方法について解説します。

また、以下のマシン上で環境構築を行っております。参考にしてください。

あわせて読みたい
【解説】Linuxサーバの構築方法を分かりやすく解説!

続きを見る

ディレクトリ構成

今回は、以下のようなディレクトリ構成を想定します。


./
|-- Dockerfile
|-- docker-compose.yml
|-- entrypoint.sh
`-- workspace/
    `-- keiba/
        |-- data/
        |   |-- html/
        |   |   |-- horse/
        |   |   |-- ped/
        |   |   `-- race/
        |   |-- master/
        |   `-- raw/
        |-- models/
        `-- modules/

Dockerfileの作成

以下のようなDockerfileを作成します。

FROM python:3.9.7-buster
ARG DEBIAN_FRONTEND=noninteractive
ARG TZ=Asia/Tokyo

# Install packages and setup timezone
RUN    apt-get update \
    && apt-get install -y tzdata \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && useradd -m labuser \
    && mkdir -p /home/labuser/work \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN    apt-get update \
    && apt-get install -y cargo \
    \
    # install jupyter packages
    \
    && pip install --no-cache-dir \
        black \
        jupyterlab \
        jupyterlab_code_formatter \
        jupyterlab-git \
        lckr-jupyterlab-variableinspector \
        jupyterlab_widgets \
        ipywidgets \
        import-ipynb \
    \
    # install basic packages
    \
    && pip install --no-cache-dir \
        numpy \
        pandas \
        scipy \
        scikit-learn \
        pycaret \
        matplotlib \
        japanize_matplotlib \
        mlxtend \
        seaborn \
        plotly \
        requests \
        beautifulsoup4 \
        lxml \
        html5lib \
        Pillow \
        opencv-python \
    \
    # install additional packages
    \
    && pip install --no-cache-dir \
        pydeps \
        graphviz \
        pandas_profiling \
        shap \
        umap \
        xgboost \
        optuna \
        MonthDelta \
        lightgbm \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["jupyter-lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--NotebookApp.token=''", "--notebook-dir=/home/labuser/work"]

docker-compose.ymlの作成

以下のようなdocker-compose.ymlを作成します。

version: '3.7'

x-logging:
    &default-json-logging
    driver: json-file
    options:
        max-file: "3"
        max-size: "10m"

services:
  jupyterlab:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        TZ: Asia/Tokyo
    image: jupyterlab
    restart: always
    container_name: jupyterlab
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./workspace:/home/labuser/work
    ports:
      - 18580:8888
    logging: *default-json-logging

Docker Imageの作成

docker-compose.ymlがあるディレクトリで、以下のコマンドを実行し、Docker Imageを作成します。

docker-compose build

環境構築には、しばらくかかるため、そのままお待ちください。

また、インストールされるライブラリの一覧は、以下のようになります。

aiofiles==22.1.0
aiosqlite==0.18.0
alembic==1.9.2
anyio==3.6.2
argon2-cffi==21.3.0
argon2-cffi-bindings==21.2.0
arrow==1.2.3
asttokens==2.2.1
attrs==22.2.0
Babel==2.11.0
backcall==0.2.0
beautifulsoup4==4.11.2
black==23.1.0
bleach==6.0.0
blis==0.7.9
Boruta==0.3
catalogue==1.0.2
certifi==2022.12.7
cffi==1.15.1
charset-normalizer==3.0.1
click==8.1.3
cloudpickle==2.2.1
cmaes==0.9.1
colorama==0.4.6
colorlog==6.7.0
colorlover==0.3.0
comm==0.1.2
contourpy==1.0.7
cufflinks==0.17.3
cycler==0.11.0
cymem==2.0.7
databricks-cli==0.17.4
debugpy==1.6.6
decorator==5.1.1
defusedxml==0.7.1
docker==6.0.1
entrypoints==0.4
executing==1.2.0
fastjsonschema==2.16.2
Flask==2.2.2
fonttools==4.38.0
fqdn==1.5.1
funcy==1.18
future==0.18.3
gensim==3.8.3
gitdb==4.0.10
GitPython==3.1.30
graphviz==0.20.1
greenlet==2.0.2
gunicorn==20.1.0
html5lib==1.1
htmlmin==0.1.12
idna==3.4
ImageHash==4.3.1
imbalanced-learn==0.7.0
import-ipynb==0.1.4
importlib-metadata==5.2.0
ipykernel==6.21.1
ipython==8.9.0
ipython-genutils==0.2.0
ipywidgets==8.0.4
isoduration==20.11.0
itsdangerous==2.1.2
japanize-matplotlib==1.1.3
jedi==0.18.2
Jinja2==3.1.2
joblib==1.2.0
json5==0.9.11
jsonpointer==2.3
jsonschema==4.17.3
jupyter-events==0.5.0
jupyter-server-mathjax==0.2.6
jupyter-ydoc==0.2.2
jupyter_client==8.0.2
jupyter_core==5.2.0
jupyter_server==2.2.1
jupyter_server_fileid==0.6.0
jupyter_server_terminals==0.4.4
jupyter_server_ydoc==0.6.1
jupyterlab==3.6.1
jupyterlab-code-formatter==1.5.3
jupyterlab-git==0.41.0
jupyterlab-pygments==0.2.2
jupyterlab-widgets==3.0.5
jupyterlab_server==2.19.0
kiwisolver==1.4.4
kmodes==0.12.2
lckr-jupyterlab-variableinspector==3.0.9
lightgbm==3.3.5
llvmlite==0.37.0
lxml==4.9.2
Mako==1.2.4
Markdown==3.4.1
MarkupSafe==2.1.2
matplotlib==3.6.3
matplotlib-inline==0.1.6
mistune==2.0.4
mlflow==2.1.1
mlxtend==0.19.0
MonthDelta==0.9.1
multimethod==1.9.1
murmurhash==1.0.9
mypy-extensions==1.0.0
nbclassic==0.5.1
nbclient==0.7.2
nbconvert==7.2.9
nbdime==3.1.1
nbformat==5.7.3
nest-asyncio==1.5.6
networkx==3.0
nltk==3.8.1
notebook==6.5.2
notebook_shim==0.2.2
numba==0.54.1
numexpr==2.8.4
numpy==1.20.3
oauthlib==3.2.2
opencv-python==4.7.0.68
optuna==3.1.0
packaging==22.0
pandas==1.5.3
pandas-profiling==3.6.6
pandocfilters==1.5.0
parso==0.8.3
pathspec==0.11.0
patsy==0.5.3
pexpect==4.8.0
phik==0.12.3
pickleshare==0.7.5
Pillow==9.4.0
plac==1.1.3
platformdirs==2.6.2
plotly==5.13.0
preshed==3.0.8
prometheus-client==0.16.0
prompt-toolkit==3.0.36
protobuf==4.21.12
psutil==5.9.4
ptyprocess==0.7.0
pure-eval==0.2.2
pyarrow==10.0.1
pycaret==2.3.10
pycparser==2.21
pydantic==1.10.4
pydeps==1.11.0
Pygments==2.14.0
PyJWT==2.6.0
pyLDAvis==3.3.1
pynndescent==0.5.8
pyod==1.0.7
pyparsing==3.0.9
pyrsistent==0.19.3
python-dateutil==2.8.2
python-json-logger==2.0.4
pytz==2022.7.1
PyWavelets==1.4.1
PyYAML==5.4.1
pyzmq==25.0.0
querystring-parser==1.2.4
regex==2022.10.31
requests==2.28.2
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
scikit-learn==0.23.2
scikit-plot==0.3.7
scipy==1.5.4
seaborn==0.12.2
Send2Trash==1.8.0
shap==0.41.0
six==1.16.0
sklearn==0.0.post1
slicer==0.0.7
smart-open==6.3.0
smmap==5.0.0
sniffio==1.3.0
soupsieve==2.3.2.post1
spacy==2.3.9
SQLAlchemy==1.4.46
sqlparse==0.4.3
srsly==1.0.6
stack-data==0.6.2
statsmodels==0.13.5
stdlib-list==0.8.0
tabulate==0.9.0
tangled-up-in-unicode==0.2.0
tenacity==8.1.0
terminado==0.17.1
textblob==0.17.1
thinc==7.4.6
threadpoolctl==3.1.0
tinycss2==1.2.1
tomli==2.0.1
tornado==6.2
tqdm==4.64.1
traitlets==5.9.0
typeguard==2.13.3
typing_extensions==4.4.0
umap==0.1.1
umap-learn==0.5.3
uri-template==1.2.0
urllib3==1.26.14
visions==0.7.5
wasabi==0.10.1
wcwidth==0.2.6
webcolors==1.12
webencodings==0.5.1
websocket-client==1.5.1
Werkzeug==2.2.2
widgetsnbextension==4.0.5
wordcloud==1.8.2.2
xgboost==1.7.3
y-py==0.5.5
ydata-profiling==4.0.0
yellowbrick==1.2.1
ypy-websocket==0.8.2
zipp==3.12.0

動作確認

Docker Imageの作成が完了したら、実行環境が利用できることを確認します。

PUIDPGIDの設定

通常、JupyterLabで作成したファイルの所有者はrootとなります。

このままでは都合が悪いため、Docker上で実行するユーザ権限とホスト環境のユーザ権限が一致するように、PUIDPGIDを設定します。

ホスト環境のユーザ権限は、以下のコマンドを実行することで、確認できます。

id
# 出力結果例
# uid=1000(yuruto) gid=1000(yuruto)
# -> 上記の例の場合、UID=1000, GID=1000

そして、docker-compose.ymlの以下の部分を調べたPUIDPGIDに書き換えます。

environment:
  - PUID=1000 # ここを調べたUIDの値に更新
  - PGID=1000 # ここを調べたGIDの値に更新

コンテナ起動&Webブラウザからアクセス

docker-compose.ymlがあるディレクトリで、以下のコマンドを実行し、コンテナを起動します。

docker-compose up -d

そして、Webブラウザを起動し、以下のリンクにアクセスします。

ここで、server-ip-addressは、コンテナを起動したマシンのIPアドレスになります。

http://server-ip-address:18580/

以下のような画面が表示されれば成功です。

JupyterLabの起動画面

まとめ

今回は、Dockerを用いたJupyterLabの環境構築方法について解説しました。

Dockerを用いることで、再利用可能かつ自前の環境を汚すことがないため、非常に扱いやすいものとなっています。

これから機械学習について学習を始めたいと考えている方は、本記事の内容をもとに環境構築を行ってみてください。

続きの記事を執筆しました。

あわせて読みたい
【Python】機械学習を用いた競馬予想【モデル構築・評価編】

続きを見る

スポンサードリンク

-プログラミング
-, , ,