Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
機械学習の素人による素人のための最初の1歩まとめ情報 (間違いの指摘はwelcome)

「ルール」に関する最初の2択

  • 機械学習 : 法則やルールを予めユーザが与えることで、未知のデータに対して解答を作る
  • 深層学習 : 何の指示も与えずに、AIが自分でデータの特徴やルールを学習していく (ディープラーニング)

前者は人がルールを与えるため、準備が大変だが、学習の方向性はコントールし易い。(まあ飛車が点数高いからそうなるよね。評価関数を変更しよう)。 後者は学習のコントロールが難しい。(正解かもだけど、なんで初手3八金なん?)

「教師」に関する3択

  • 教師あり学習 : 訓練データ(入力と出力のセット)を元に、入力に対して答えを返すモノを作る。正解を知っている教師によって、「これはこう作業してね」と教育する「OJT研修」。 (過去データから未来の値を予測できる)
  • 教師なし学習 : 出力値(正解)を必要としない分類。正解とかこまけぇこたぁいいんだよ派。とにかく集団に線引して、「似てる奴ら」を集める。 (クラスタリングができる)
  • 強化学習 : 「状態を知る」「行動する」「行動で報酬を得る」ことができる主体を「エージェント」とする。ユーザは報酬関数(Q関数)を定義する。後はエージェントが報酬が最大になる行動を自ら学習(試行錯誤で最適化)していく。 (自動でゲームをクリアできる)

ツール

汎用
  • NumPy : ベクトルや行列などの基本的なデータ型を高速に行うPythonの数値計算モジュール。独自バイナリ(npz)だが、機械学習のサンプルデータの多くはnpzで配布されるくらいのデファクト
  • Pandas : データ操作のためのPythonライブラリ(BSDライセンス)。コアはc実装。npzやCSVの相互変換からSQLぽい集計処理もできるため、データの前処理に便利なツール
  • Matplotlib : データの描画ライブラリ。グラフや画像として表示できる。Pandasよりも複雑な出力が可能
機械学習
  • SciPy : サイエンス系のPythonライブラリ。積分、線形代数、フーリエ変換、信号処理、画像処理、遺伝的アルゴリズムとかできる
  • scikit-learn : 機械学習全般のアルゴリズムが実装されたライブラリ。機械学習のデファクト
  • statsmodels : 統計モデルに特化したライブラリ。scikit-learnより統計機能が豊富
  • PyTorch : FB製の機械学習用ライブラリ。動的な計算グラフ。APIがシンプルかつNumPyに似て使い易い。海外で人気があり最新の論文がすぐにコード化される
  • Dlib : C++で書かれた機械学習向けのオープンソース(Boost)な汎用ライブラリ。顔認識も可能。OpenCVでも顔は検出できるが、Dlibは特徴点が多いため表情の検出ができる
深層学習
  • TensorFlow : Google製の機械学習用コアライブラリ(Apache License 2.0)。避けては通れないデファクト
  • Keras : ニューラルネット用のPythonライブラリ(MIT)。TensorFlow等のコアライブラリをバックエンドに持てる高レベルライブラリ
GUI
  • TensorBoard : TensorFlowをブラウザで操作できる。入力指定、コード実行、plot表示がブラウザで完結できる。(BoardのHTTPサーバがTensorFlowに入っている)
  • Jupyter : ブラウザで対話的にPythonコードを実行するツール。機械学習に限らない汎用ツール。コード群を「セル」という単位に分割することで、セル単位での実行が可能。実行結果はキャッシュされるため、重い処理(データ読み込み、学習実行)は1回だけ実行してにして、グラフ出力部分だけ何度も修正実行したりできて便利
  • Google Colab : Googleの機械学習環境。Googleアカウントがあれば無料で使えるJupyterみたいなもの。サーバ不要、ライブラリは大概準備済み。GPUもTPUも使える。ぶっちゃけこれでいいと思う

言語選択

  • Python : データの取り扱いはPandas、表現力はKerasが強力で、データの利便性や関連ツールの安定性まで考えるとPythonが最適。
  • その他 : 「別言語でやりたい」が主目的でない限り、Pythonが無難。速い言語でも、実速度はTensorFlowに律速するため、恩恵は薄い。

個人で頑張って作り始めてもきっと途中で燃え尽きるし、例え完成したとしてもその間に進化したTensorFlowの前では型落ちツールになり消える

時期

  • TensorFlow : 2.0がまさに出つつある過渡期。世の中のサンプルは1.xで、2.0は当然枯れておらず情報もないのでハマりがち。少し待ちたい
  • Python : 2のサポートが2020/1/1に終了。3への移行中に環境構築問題で手間取るので、情報が揃うのを少し待つのはアリ

半年待って Ubuntu 20.04 LTS Python3 TensorFlow2 の高速道路を走り始めるのがコスト面では効率的

利用者イメージ

  • 本格的に始めるのでなく、少しだけすぐに試してみたい
  • パッケージやPythonのインストールが面倒、トラブルに巻き込まれたくない
  • むしろサーバ(PC)を準備するのすら面倒 → Google Colab : ブラウザから使えるJupyterタイプのGoogle製の機械学習クラウドサービス。サーバ代もプロセッサ代も不要。無料。Googleアカウントさえあれば直ぐにコードを実行できる。もうこれでいいじゃん

Pros / Cons

  • Pros
    • サーバの準備が不要 (ブラウザとGoogleアカウントだけあればいい)
    • Jupyter Notebook と同様に使える
    • python, pip がインストール済
    • メジャーなライブラリがインストール済
    • pip 利用可能
    • GPU 利用可能
    • TPU 利用可能
  • Cons
    • 利用可能なリソースに上限がある
    • 手元のデータを直接使うことができない (driveへのアップロードが必要)
    • 数時間アイドルするとセッションが切れる

使い方

  1. Google Colabへ行く https://colab.research.google.com/
  2. コードを実行する

参考

利用者イメージ

  • windowsを使ってる
  • Jupyter Notebookは補完できなくて辛い
  • やっぱりnativeでVSCodeとかからゴリゴリ書きたい → 全部入りのAnacondaを使う (pythonだけ入れてもpip等のツールのPATH問題が面倒なので環境ツールで入れる)

Anaconda

  • Pythonのパッケージマネージャー (Pythonのバージョン管理もできる。pipは利用中のPythonに対してのみ)
  • 専用のレポジトリでいい感じに管理しているのでライブラリの品質も高いらしい (NumPyはリンクライブラリの違いでpip版より2倍速いとか)
  1. ダウンロード(462MB) https://www.anaconda.com/distribution/
  2. インストール先はJust Me、PATHはregister (管理者権限が面倒)
conda upgrade --all
pip install --upgrade pip

Anacondaと関連パッケージのインストール

  1. パッケージのアップデート (Anaconda Powershell Prompt)
conda install -y -c spyder-ide spyder
conda install -y numpy scipy h5py scikit-learn scikit-image matplotlib seaborn pandas pillow
conda install -y jupyter pytest docopt pyyaml cython
pip install opencv-python opencv-contrib-python
pip install chainer chainerrl
pip install tensorflow==2.1.0
pip install keras
pip install natsort
# fbprophetのインストールにccが必要
conda install libpython m2w64-toolchain -c msys2
pip install fbprophet

VS Code

  1. VS Codeのインストール https://code.visualstudio.com/Download
  2. VS Codeの拡張機能をインストール https://qiita.com/surei/items/9f25d7efa7c67d55d98f

エラー

このシステムではスクリプトの実行が無効になっているため...
  • windowsのセキュリティー設定。cmdプロンプトから以下を実行する
  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

参考

利用者イメージ

  • 学習用にGUIでグラフを確認したい
  • サーバに入れて家からブラウザで手軽に実行したい → jupyter notebook

手順 (ubuntu-18.04)

1. インストール

  • ライブラリを一式入れる (python3系)
  • jupyter notebook(Pythonコードをブラウザ上で実行するツール)をインストール
apt install python3-pip python3-pandas python3-sklearn
apt install jupyter-notebook
pip3 install chainer tensorflow pandas-ml
pip3 install opencv-python

2. jupyterサーバを起動 (127.0.0.1からのみアクセス)

  • 127.0.0.1:8888 で listen
  • ブラウザは起動しない
jupyter notebook --ip=127.0.0.1 --port=8888 --no-browser

3. sshでトンネルして、手元のブラウザから利用

  • puttyなどで ssh -L 8888:127.0.0.1:8888 的なトンネルを張る
  • 2で表示されたURL(認証コード付き)にアクセス

4. サンプル実行

  • 右上の「NEW」→「Python3」を選択して実行モードにする
  • 「File」→「New Notebook」→「Python3」
  • コードを入力
  • 「Run」を実行

実行例: 埋め込みデータ

コード
import pandas as pd
%matplotlib inline

ts = pd.Series([10,20,30], index=[1,2,3])
ts.plot()
  • x軸: [1,2,3]
  • y軸: [10,20,30]
  • %matplotlib inline はPythonコードでなく、jupyterへの命令 (pytonを直接実行する場合は消す)

実行例: CSVから描画

CSV
"2020-01-12",7127
"2020-01-13",6789
  • 「日付」と「値」
コード
import pandas as pd
%matplotlib inline

df = pd.read_csv('foo.csv', names=('date', 'count'))
ts = pd.Series(df['count'].values, index=df['date'].values)
ts.plot()
  • read_csvでDataFrameとして読み込むことができる (namesで列に名前付けが可能)
  • df['date']で列名を指定したデータ取得ができる (Series型のデータを得る)
  • Series.values で Array に変換できる

参考

利用者イメージ

  • GUIなしでコードのみ実行したい場合
  • インストールで環境を汚染したくない → docker

インストール

  • Docker : pythonはバージョン(2,3)とインストール先(local,global)とパッケージ管理ツールの組み合わせが魔境なのでDockerが楽
  • pandas : これだけpipで追加 (KerasはTensorFlowに既に含まれている)
FROM tensorflow/tensorflow
RUN pip --no-cache-dir install pandas

勉強環境はDockerがトラブルが少なくてお手軽。本番環境はそもそもGPUを選ぶ所から真面目に考える必要があるのでここでは気にしない

tensorflowの動作確認
git clone git@github.com:tensorflow/tensorflow.git
cp -pr ~/git/tensorflow/tensorflow/examples
  • -v $(PWD)/examples/tutorials:/usr/local/lib/python2.7/dist-packages/tensorflow_core/examples/tutorials

matplotlib

  • 描画ライブラリ
基本
  • pandas.Series や pandas.DataFrame を描画できる (2種類の方法)
  • 方法1: SeriesやDataFrameのplotメソッドを呼ぶ
  • 方法2: plotメソッドに引数で渡す
import matplotlib.pyplot as plt

ts = pd.Series([10,20,30], index=[1,2,3])
ts.plot()    # 方法1
plt.plot(ts) # 方法2
画像サイズを指定
  • dpiなので癖がある
plt.figure(figsize=(12.0, 6.0), dpi=72) # 1200x600ぐらいのイメージ
ts.plot()
重ねて表示
  • 連続でplotを実行すると同じ描画先になる (複数のグラフが重なって表示)
plt.figure(figsize=(12.0, 6.0), dpi=72)
ts1.plot()
ts2.plot()
個別に表示
  • plt.figure で描画先をリセットできる
plt.figure(figsize=(12.0, 6.0), dpi=72)
ts1.plot()
plt.figure(figsize=(12.0, 6.0), dpi=72)
ts2.plot()
レイアウト
  • 2段組などのレイアウトは、M行N列のサブプロットとして表現する
  • figure時に返されるfigureオブジェクトに対して指定する
  • 指定は「M行N列のI番目の要素」に描画する場合 MNI という3桁の数字を指定する
fig = plt.figure(figsize=(12.0, 6.0), dpi=72)
fig.add_subplot(221) # 2行2列のレイアウトの1番目(左上)
ts1.plot()
fig.add_subplot(224) # 2行2列のレイアウトの4番目(右下)
ts2.plot()

PyTorch

  • FB製のオープンソース機械学習ライブラリ
  • 比較対象: TensorFlow, Keras, Chainer

歴史

Torch (Lua)
  + DeepMind社が利用(今はTensorFlow)

PyTorch (Python)
  + Python化された (Touchの後継?)

特徴

  • シンプル、NumPyに似ているので使いやすい
  • 海外で人気 (新しい論文がPyTorchを使って実装されがち)

参考

線形回帰

  • 「統計学における回帰分析の一種である」(Wikipedia)
  • 「線形」であるのは、目的変数 Y が説明変数 X の係数 β に対して線形であるためである (Wikipedia)

用語

  • 目的変数 : 求めたい値(予測値)
  • 説明変数 : 目的変数に影響を与える変数
  • 回帰分析 : 説明変数を使って目的変数を導出すること
  • 単回帰分析 : 説明変数が1つである回帰分析
  • 重回帰分析 : 説明変数が2つ以上である回帰分析

参考

statsmodels

  • 1週間ごとに特徴があるデータを周期7の季節成分として分解する
  • original : Array(Int)
import statsmodels.api as sm

res = sm.tsa.seasonal_decompose(original, freq=7)
trend    = res.trend    # トレンドデータ
seasonal = res.seasonal # 季節性データ
residual = res.resid    # 残差データ

# 1200x600
fig = plt.figure(figsize=(12.0, 6.0), dpi=72)

# 左上 (オリジナル)
original = pd.DataFrame({'trend': original, 'date':ts.index})
original['date'] = pd.to_datetime(original['date'], format='%Y-%m-%d')
original = original.set_index(['date'])
fig.add_subplot(221)
plt.plot(original)

# 右上 (季節性)
seasonal = pd.DataFrame({'seasonal': seasonal, 'date':ts.index})
seasonal['date'] = pd.to_datetime(seasonal['date'], format='%Y-%m-%d')
seasonal = seasonal.set_index(['date'])
fig.add_subplot(222)
plt.plot(seasonal)

# 左下 (トレンド)
trend = pd.DataFrame({'trend': trend, 'date':ts.index})
trend['date'] = pd.to_datetime(trend['date'], format='%Y-%m-%d')
trend = trend.set_index(['date'])
fig.add_subplot(223)
plt.plot(trend)

# 右下 (残渣)
residual = pd.DataFrame({'residual': residual, 'date':ts.index})
residual['date'] = pd.to_datetime(residual['date'], format='%Y-%m-%d')
residual = residual.set_index(['date'])
fig.add_subplot(224)
plt.plot(residual)
orignal_monthly = original.groupby(original.index.month).mean()
orignal_monthly.plot(kind='bar')

自己相関係数の出力

original_acf = sm.tsa.stattools.acf(original, nlags=40) #ラグ=40(デフォルト値)、省略可能
original_acf

コレログラム

# trendに関するコレログラム
fig = plt.figure(figsize=(12, 4))
ax1 = fig.add_subplot(111)

# 周期データのため、N/Aを含んでいるので除外する
valid_trend = trend.dropna(how='all')
sm.graphics.tsa.plot_acf(valid_trend, lags=40, ax=ax1) # trendデータ、ラグ40、グラフaxes
plt.show() 
Q. 僕の Jupyter は画面がただのファイルブラウザになってる
  • A. 右上の「NEW」から「Python3」とかを選択すると画面が変わる
Q. [Python] WindowsでUTF-8でTimestamp#strftime("%a")が化ける
  • A. 諦める。自分でreplaceするのが確実
Q. Google Colab で CUDA が使えないエラーが出た
RuntimeError: Error while calling cudaGetDevice(&the_device_id) in file /tmp/pip-wheel-b9ck8go0/dlib/dlib/cuda/gpu_data.cpp:201.
code: 100, reason: no CUDA-capable device is detected
  • A. 上部メニュー「ランタイム」→「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」→「GPU」

参考

概念
コーディング
統計モデルとツール
自然言語処理
@maiha

This comment has been minimized.

Copy link
Owner Author

maiha commented Feb 16, 2020

keras vs pytorch
ディープラーニングの精度はプログラミングよりもデータ数に依存する

  • エンジニアリング<データ量
    ディープラーニングの作業の大半はデータワーク
    データワークには大量のラベル付きデータが必要 (生データを学習用に使えるように整理すること)
    大量データは前提で、効率的にかつ継続的にラベリングを行うことが重要
    効率的なラベリングのために専用ツールの開発の必要 (エンジニアリングは必要)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.