SEが最近起こったことを書くブログ

ITエンジニアが試したこと、気になったことを書いていきます。

AWS SageMakerの因数分解機について調べてみた

AWS因数分解機について理解できていないので、調べてメモを残す

  • 分類や回帰に使用できる
  • 線形回帰よりも疎なデータセットにおいて、計算効率がよい
  • レコメンドに使用される
  • 利用イメージ
    • 密なユーザ行列と密なアイテム行列を使って、疎な評価行列(ユーザ*アイテム)を埋める

参考資料

docs.aws.amazon.com

aws.amazon.com

Partial Dependence Plotについて調べてみた

Partial Dependence Plotについて調べたので、理解できた内容を以下に記録する

  • ターゲットと対象の入力特徴のセットとの間の依存性を示す
    • 興味のある変数以外の影響を周辺化して消す
  • 元の説明変数の値からある説明変数の値をすべて何かの値xに置き換えて、予測結果する
    • 上記の結果を変数をxに置き換えた時の出力とする
    • これをxを変えながら、プロットする
  • 注意点
    • 説明変数に多重共線性があると結果がおかしくなる
    • ある程度モデルの機械学習モデルの精度が高くないと見ても意味がない

参考情報

scikit-learn.org

speakerdeck.com

Permutation Importanceについて調べてみた

Permutation Importanceについて調べてみたので、分かったことについて以下にまとめる

調べて理解できたこと

  • 「ある特徴量がどれだけモデルの予測精度向上に寄与しているのか」を解釈したもの
  • ある特徴量をランダムに並べ替えて、どの程度モデルの誤差へ影響があるかを計算したもの
  • ランダムに特徴を並べ替えて予測した誤差を元々の予測結果の誤差の精度の差
  • 注意点
    • 相関の高い特徴が含まれる場合はどちらかの特徴が評価されないことが起こる
    • 全体への影響は小さいが局所的な影響が強い特徴が小さく評価される

参考資料

www.datarobot.com

qiita.com

SHAP理解できたこと

まだまだ勉強中ですが、SHAPについて理解できたことをメモしておく。

ちゃんと理解できていないので、間違いがあると思いますが、 その際は優しくご指摘いただけると幸いです。

近似するモデルについて

  • 予測結果に対する各変数の寄与を求める手法
  • 学習したモデルを変数の寄与が説明しやすいモデルで近似する
    • 近似したモデルでは各変数の寄与度が分解されている
  • ある変数を追加したときと追加していないときのモデルの結果を比較することで、変数の寄与度を計算する

  • 以下の性質を持つように制約を加える

    • 近似したモデルは元のモデルと同じ入力の場合に同じ出力をする
    • ある変数が存在しないときはその変数の寄与度は0になる
    • 元のモデルで比べたときに変数iのモデルAへの寄与度のほうがモデルBよりも大きい場合は、モデルAを近似したモデルのほうがモデルBを近似したモデルよりも変数iの寄与度が大きい
  • 上記の制約により近似したモデルは一意に定まる

    • それぞれの変数の寄与度は以下のように計算できる
      • ある変数が現れるすべての順列のパターンでどれぐらいの貢献をするかの平均を計算する
        • 何番目かやそれ以前にどの変数が追加されているかにより、その変数を追加したときの寄与度が異なるため、順列のパターンで計算する

参考情報

logmi.jp

engineering.mercari.com

www.slideshare.net

書いてみて少しだけ理解が進んだ気がする

Docker上にWordCloud + MeCab +Jupyter環境構築する際にはまったこと

Docker上にWordCloud + MeCab +Jupyter環境を構築したがはまったので、 非常に雑だがメモしておく。

はまったこと

  • MeCabを利用しようとしたら、以下のエラーが出る
error message: [ifs] no such file or directory: /usr/local/etc/mecabrc

以下を実行して解決

ln -s /etc/mecabrc /usr/local/etc/mecabrc
  • WordCloudで利用する日本語フォントがない

以下を実行して解決

RUN curl -L https://moji.or.jp/wp-content/ipafont/IPAexfont/ipaexg00401.zip > font.zip
RUN unzip font.zip
RUN mkdir -p ~/.fonts
RUN cp *ttf ~/.fonts
RUN fc-cache -f -v # optional

作成したDockerfile

FROM python:3.7
  
RUN apt-get update && apt-get install -y \
    apt-utils \
    python3-setuptools \
    mecab libmecab-dev mecab-ipadic-utf8 \
    git curl
  
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \
    && apt-get install -y nodejs
  
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*
  
RUN pip --no-cache-dir install \
    autopep8 \
    jupyterlab_code_formatter \
    sklearn \
    jupyterlab \
    ipykernel \
    scipy \
    numpy \
    matplotlib \
    pandas \
    nltk \
    mecab-python3 \
    gensim \
    wordcloud \
    && \
    python -m ipykernel.kernelspec
  
ENV CONFIG /root/.jupyter/jupyter_notebook_config.py
ENV CONFIG_IPYTHON /root/.ipython/profile_default/ipython_config.py
  
RUN jupyter labextension install @jupyterlab/toc \
    @lckr/jupyterlab_variableinspector \
    @ryantam626/jupyterlab_code_formatter \
    @jupyter-widgets/jupyterlab-manager && \
    jupyter serverextension enable --py jupyterlab_code_formatter && \
    jupyter labextension enable toc jupyterlab_variableinspector \
    jupyterlab-manager && \
    jupyter notebook --generate-config --allow-root && \
    ipython profile create
  
RUN echo "c.NotebookApp.ip = '*'" >>${CONFIG} && \
    echo "c.NotebookApp.port = 8888" >>${CONFIG} && \
    echo "c.NotebookApp.open_browser = False" >>${CONFIG} && \
    echo "c.NotebookApp.allow_root = True" >>${CONFIG} && \
    echo "c.NotebookApp.iopub_data_rate_limit=10000000000" >>${CONFIG} && \
    echo "c.MultiKernelManager.default_kernel_name = 'python3'" >>${CONFIG}
  
RUN echo "c.InteractiveShellApp.exec_lines = ['%matplotlib inline']" >>${CONFIG_IPYTHON}
  
# port
EXPOSE 8888
  
# Run Jupyter Notebook
WORKDIR "/root/work"

RUN ln -s /etc/mecabrc /usr/local/etc/mecabrc
RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

RUN curl -L https://moji.or.jp/wp-content/ipafont/IPAexfont/ipaexg00401.zip > font.zip
RUN unzip font.zip
RUN mkdir -p ~/.fonts
RUN cp *ttf ~/.fonts
RUN fc-cache -f -v # optional


CMD ["jupyter", "lab"]

Docker-Compose

version: '3'
services:
  app:
    build: .
    ports:
    - "8888:8888"
    volumes:
      - ./work:/root/work

参考URL

dockerfileを書く際に非常に参考にさせていただきました。 ありがとうございます。 tonop.cocolog-nifty.com

MeCabの問題調査時に参考にさせていただきました hakasenote.hnishi.com

WordCloudの問題対応時に参考にさせていただきました。 qiita.com

AI・データ分析プロジェクトのすべてを読みました

読もうと思った理由

  • データ分析プロジェクトのはまりどころを把握したかった
  • データサイエンティストの情報収集方法を知りたかった

全体的な感想

  • 今まで暗黙知になりがちだったノウハウが文書化されていて、プロジェクトを進めるうえで非常に参考になる
  • 本で学んだ知識を生かしてプロジェクトを実施することで、プロジェクトをビジネス効果があるものに導きたい

特に興味深かった内容

  • オフライン検証とオンライン検証でみるべき指標が異なるのは意識が弱かった

オンライン検証でもオフライン検証と同じ指標で確認しようとしていて、それは間違っていることが分かった。

  • MLOpsで必要なスキルが明確になった

MlOpsという言葉のイメージはなんとなく持っていたものの、きちんと説明できる状態ではなかった。 本書を読んでどのようなスキルセットを持っていればMLOpsを実現できるかを把握できた。

  • データ分析プロジェクトを再現性のあるものにするためのノウハウが分かった。

実施した施策を社内に残すための方法が把握できた。文書だけでなく、動かす環境も残すことが大事だとわかった。

  • データ分析プロジェクトで自分がうまく説明できない箇所がわかった

書籍の中身は、実情を文書化してくれたといったイメージが強かったが、いざ章末のチェックリストで答えられない箇所があり、いざ説明用しようとすると説明できないことが明確になった

t-SNEについて調べてみた

t-SNEとは?となり調べたので、理解できたことをメモしておく。

書いてみて、ちゃんと理解できてない感たっぷりですが、そのまま残しておきます。

  • t-SNEは高次元のデータを二次元または三次元に圧縮して可視化する
  • 元の特徴空間上で近い点が圧縮後の次元でも近くなる
  • 従来手法と比べてよいところ
    • 類似しているデータを低次元に落としても近くに保つことができる
      • 高次元の非線形データが特に難しい
  • 二つの点がxiはxjを近接点として選択する確率を距離と定義する
    • xjはxiを中心とした正規分布に基づいて確率的に選択される
  • 低次元にしたときも元々の空間での距離となるように配置する
    • もともとの正規分布と低次元でのt分布のKLダイバージェンスを最小化するようにプロットする
    • 低次元での確率分布を考えるときは、正規分布ではなくt分布を仮定する
      • t分布を仮定することで、中距離のデータポイントをより遠くとしてモデル化できる
  • SNEとの違いとして、xi-xjの距離とxj-xiの距離が同じになるようにした

参考資料

qiita.com

blog.albert2005.co.jp