人手で競馬予想を行うのは限界があるため、機械学習を利用したい。
分析時の環境構築方法が分からないから教えて欲しい。
こんなお悩みを解決します。
「機械学習を用いた勉強をしたい」と思っていたところ、機械学習を用いて競馬予想を行っている記事を見つけました。
丁度良い題材になると考え、今回から、環境構築、データ収集、前処理、特徴量設計、学習・推論の一連の作業を記事にまとめ、機械学習を用いてどの程度競馬予想が行えるかを検証していきたいと思います。
今回は、環境構築部分が対象となります。(データ収集も終わり次第、記事にしていく予定です。)
クラウド環境を利用するという方法もありますが、データ収集や前処理を実行する際は、自前の計算機を利用した方がランニングコストを抑えられます。
このため、今回は自前の計算機(手元の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の作成が完了したら、実行環境が利用できることを確認します。
PUID
とPGID
の設定
通常、JupyterLabで作成したファイルの所有者はrootとなります。
このままでは都合が悪いため、Docker上で実行するユーザ権限とホスト環境のユーザ権限が一致するように、PUID
とPGID
を設定します。
ホスト環境のユーザ権限は、以下のコマンドを実行することで、確認できます。
id
# 出力結果例
# uid=1000(yuruto) gid=1000(yuruto)
# -> 上記の例の場合、UID=1000, GID=1000
そして、docker-compose.yml
の以下の部分を調べたPUID
とPGID
に書き換えます。
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/
以下のような画面が表示されれば成功です。
まとめ
今回は、Dockerを用いたJupyterLabの環境構築方法について解説しました。
Dockerを用いることで、再利用可能かつ自前の環境を汚すことがないため、非常に扱いやすいものとなっています。
これから機械学習について学習を始めたいと考えている方は、本記事の内容をもとに環境構築を行ってみてください。
続きの記事を執筆しました。
【Python】機械学習を用いた競馬予想【モデル構築・評価編】
続きを見る