kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

GitHub Actions で Re:VIEW プロジェクトをビルドする

最近 Pandoc 以外の選択肢として Re:VIEW を試している.ビルドを自動化するために GitHub Actions で Re:VIEW プロジェクトをビルドできるように設定してみた.今回は vvakame/review Docker Image を使うことにした.検証日時点で最新となる Re:VIEW v5.1 もサポートされていて良かった💡その前に GitHub Marketplace で Re:VIEW 専用の Action も探してみたけど,あまり良さそうなものはなかった.

github.com

Re:VIEW プロジェクトを作る

サンプルとして review-init コマンドを使って Re:VIEW プロジェクトを作る.今回は sandbox-github-actions-review という名前にした.以下のように rake pdf コマンドで簡単に PDF 化できる.

$ review-init sandbox-github-actions-review --without-doc --without-config-comment
$ cd sandbox-github-actions-review
$ rake pdf

GitHub Actions

さっそく GitHub Actions ワークフロー用に YAML を書く.今回は「main ブランチに対するプルリクエスト」と「main ブランチに対するプッシュ(マージなど)」をトリガーするように on を設定した.そして jobs に vvakame/review Docker Image を使うように設定した.なお actions/upload-artifact を使うとビルド結果などのアーティファクトを簡単にファイルをアップロードできる.便利!

name: Build

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    name: Re:VIEW Workflow
    runs-on: ubuntu-latest
    container: docker://vvakame/review:5.1
    steps:
      - uses: actions/checkout@v2
      - name: Build PDF
        run: rake pdf
      - uses: actions/upload-artifact@v2
        with:
          name: Artifacts
          path: book.pdf

YAML 構文はドキュメントに載っている.

docs.github.com

ビルド結果

GitHub Actions でうまくビルドできた👌

f:id:kakku22:20210618212059p:plain

関連記事

もし GitHub Actions 入門するなら以下の記事で紹介している「GitHub Learning Lab」を使うと便利!

kakakakakku.hatenablog.com

Intro to Machine Learning : Kaggle Courses で「住宅価格予測」に入門した

Kaggle が公開している「Kaggle Courses」で機械学習に入門できる「Intro to Machine Learning」コースを受講した.Intro と書いてある通り,入門レベルではあるけど,scikit-learn を使って「決定木(回帰)」や「ランダムフォレスト」で「住宅価格予測」を体験できる.紹介も兼ねて,受講したメモを整理してまとめる!

www.kaggle.com

アジェンダ 🌴

「Intro to Machine Learning」コースには「計7種類」のレッスン(ドキュメントと演習)がある.なお,データを取り扱うときに Pandas の知識は最低限必要になるため,もし不安があれば,先に「Pandas」コースを受講しておくと良いと思う.詳細は前にブログで紹介した.

  1. How Models Work
  2. Basic Data Exploration
  3. Your First Machine Learning Model
  4. Model Validation
  5. Underfitting and Overfitting
  6. Random Forests
  7. Machine Learning Competitions

kakakakakku.hatenablog.com

1. How Models Work 🌴

最初は今回テーマとする「住宅価格予測」の概要と「決定木」の紹介が載っている.例えば「寝室を2つ以上持っているかどうか」という基準だと,一般的な傾向としては寝室が多い方が住宅価格は高いと予測できる.しかし,実際にはバスルームやロケーションなど,他にも様々な特徴を考慮する必要があり,それらを「決定木」として,木構造で Yes/No に分岐していく.

f:id:kakku22:20210616113341p:plain
How Models Work | Kaggle より引用

2. Basic Data Exploration 🌴

さっそく Pandas を使って「住宅データ」を確認していく.特に複雑な内容はなく,DataFrame の describe() 関数を使って統計量を確認している.データを観察することは重要!👀

f:id:kakku22:20210616113225p:plain

3. Your First Machine Learning Model 🌴

次に「決定木」を使ってモデルを構築する.まずは「住宅データ」の中から今回使う説明変数(特徴量)を決める.

  • 説明変数
    • LotArea
    • YearBuilt
    • 1stFlrSF
    • 2ndFlrSF
    • FullBath
    • BedroomAbvGr
    • TotRmsAbvGrd
  • 目的変数
    • SalePrice

実装としては scikit-learn の DecisionTreeRegressor クラスを使う.今回は結果に統一性を持たせるために random_state パラメータも指定している.以下は重要なコードを抜粋して載せている.

import pandas as pd
from sklearn.tree import DecisionTreeRegressor

iowa_file_path = '../input/home-data-for-ml-course/train.csv'
home_data = pd.read_csv(iowa_file_path)

feature_names = [ 'LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']
X = home_data[feature_names]
y = home_data.SalePrice

iowa_model = DecisionTreeRegressor(random_state=1)
iowa_model.fit(X, y)

predictions = iowa_model.predict(X)

実際に構築したモデルを使って予測をすると,以下のように結果を確認できる.

f:id:kakku22:20210616113237p:plain

4. Model Validation 🌴

予測結果を評価するために,次は「平均絶対誤差 : MAE (Mean Absolute Error)」を使う.MAE は名前の通り「正解と予測の差の平均値」を計算する.まずは scikit-learn で train_test_split() 関数を使って「学習用データと正解ラベル」と「テスト用データと正解ラベル」に分割する.そして MAE も mean_absolute_error() 関数を使えば良く,簡単に予測結果を評価できるようになった.とは言え 29652.931506849316 という平均絶対誤差は大きく,モデルを改善する必要がある.

from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split

train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)

val_predictions = iowa_model.predict(val_X)
val_mae = mean_absolute_error(val_predictions, val_y)

print(val_mae)
# 29652.931506849316

5. Underfitting and Overfitting 🌴

そこで「Underfitting(過少適合)」と「 Overfitting(過剰適合/過学習)」という概念を考慮しながら,「決定木」の最適な「リーフノード(葉)」を模索していく.以下のように 5 から 500 までの組み合わせを検証して,今回は 100 が最適だと判断できた.以下は重要なコードを抜粋して載せている.

def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
    model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
    model.fit(train_X, train_y)
    preds_val = model.predict(val_X)
    mae = mean_absolute_error(val_y, preds_val)
    return(mae)

candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]

scores = {leaf_size: get_mae(leaf_size, train_X, val_X, train_y, val_y) for leaf_size in candidate_max_leaf_nodes}
print(scores)
# {5: 35044.51299744237, 25: 29016.41319191076, 50: 27405.930473214907, 100: 27282.50803885739, 250: 27893.822225701646, 500: 29454.18598068598}

best_tree_size = min(scores, key=scores.get)
print(best_tree_size)
# 100

6. Random Forests 🌴

モデルを改善するために「決定木」よりも優れている「ランダムフォレスト」を使ってモデルを作り直す.scikit-learn で RandomForestRegressor クラスを使えば,簡単に「ランダムフォレスト」を実装できる.実際に予測結果を評価すると,平均絶対誤差は 21946.238703196348 となった.少し改善することができた.

from sklearn.ensemble import RandomForestRegressor

rf_model = RandomForestRegressor()
rf_model.fit(train_X, train_y)

rf_val_predictions = rf_model.predict(val_X)
rf_val_mae = mean_absolute_error(rf_val_predictions, val_y)

print("Validation MAE for Random Forest Model: {}".format(rf_val_mae))
# Validation MAE for Random Forest Model: 21946.238703196348

なお,コースには「ランダムフォレスト」の詳細解説までは載っていないため,関連資料を組み合わせるとより理解度が高まると思う.今回は「機械学習図鑑」を併読した.

7. Machine Learning Competitions 🌴

よりモデルを改善するために,最後は Kaggle Competitions「Housing Prices Competition for Kaggle Learn Users」に挑戦して!という内容だった.もう少し勉強をしたら Kaggle Competitions にも挑戦してみたい💪

www.kaggle.com

まとめ 🌴

「Kaggle Courses」で機械学習に入門できる「Intro to Machine Learning」コースを受講した.scikit-learn を使って「決定木(回帰)」や「ランダムフォレスト」で「住宅価格予測」を体験できる.Pandas や scikit-learn の実装は「Python 3 エンジニア認定データ分析試験」を受験したときに繰り返し学んだため,特にハマるところはなくスラスラと読めた.

kakakakakku.hatenablog.com

そして今回も受講証明書を取得できた🏆

f:id:kakku22:20210616122153p:plain

GRC (git-remote-codecommit) をサポートした ghq v1.2.0 を試した

Git リポジトリを操作するために使っている ghq が,2021年5月にリリースされた v1.2.0(bugfix も含めると v1.2.1)で AWS CodeCommit の HTTPS GRC (git-remote-codecommit) をサポートしていた.さっそく動作確認をしてみた!

github.com

brew upgrade ghq コマンド

まず,Homebrew を使って ghq アップデートする.現時点で最新となる v1.2.1 を使えるようになった.

$ brew upgrade ghq

$ ghq --version
ghq version 1.2.1 (rev:dd139fb)

ghq get コマンド

さっそく ghq get コマンドを使って AWS CodeCommit リポジトリを取得する.今回は検証用に playground-ghq リポジトリを作った.GRC の場合,URL は codecommit://${RepositoryName} や codecommit::${RegionName}://${RepositoryName} となり,以下の通り,うまく取得できた!今まで必要だった「AWS CodeCommit の HTTPS Git 認証情報」を使わずに簡単にリポジトリを操作できるようになる.

$ ghq get codecommit::ap-northeast-1://playground-ghq
     clone codecommit::ap-northeast-1://playground-ghq -> /Users/kakakakakku/ghq/ap-northeast-1/playground-ghq
       git clone --recursive codecommit::ap-northeast-1://playground-ghq /Users/kakakakakku/ghq/ap-northeast-1/playground-ghq
Cloning into '/Users/kakakakakku/ghq/ap-northeast-1/playground-ghq'...
warning: You appear to have cloned an empty repository.

関連記事

Scratch で機械学習を楽しめちゃう!「Scratch ではじめる機械学習」を読んだ

最近「Scratch ではじめる機械学習」を読んで,とても楽しめたので紹介したいと思う.本書は Scratch を使って「機械学習で実現できること」を実際に体験できる.そして「機械学習」をあまり意識せずに読むことができるので(特に前半),例えば「子供と一緒に楽しみながら読む」こともできる!読み方はいろいろ!

目次

目次を見ると難しく感じるけど,実際には Scratch を使って「体験ベース」で楽しめる.キャプチャも多く,文章量も少ないため,サクサク読める.正誤表や Scratch ファイル(.sb3 ファイル)も公開されている.

  • 序章 : 10分で体験できる機械学習
  • 1ç«  : [画像認識編] ジャンケンゲームを作ろう
  • 2ç«  : [音声認識編] 声を聞き分けるデジタルペットを作ろう
  • 3ç«  : [姿勢推定編] 体を使った楽器プログラムを作ろう
  • 4ç«  : [知識編] 機械学習について学ぼう
  • 5ç«  : [上級編] 遺伝的アルゴリズムでネコの動きを進化させよう
  • 付録 : その他の拡張機能を使った機械学習

www.oreilly.co.jp

カスタマイズされた Scratch

本書を読む前に「どうやって Scratch で機械学習を実現するんだろう?」と思ったけど,本書を読んでいたら「カスタマイズされた Scratch」を使っていた.以下の URL でアクセスすることができて,実際に「拡張機能」を見ると,見たことがない拡張機能が多くある.

stretch3.github.io

本書の「序章」には「画像認識」のサンプルがあり,簡単に機械学習を体験できるようになっている.具体的には「ImageClassifier2Scratch」と「翻訳」を使って「物体認識をして日本語に翻訳」することができる.以下はサンプルとして「マグカップ」を試してみた.僕です...😇

f:id:kakku22:20210614211002p:plain

画像認識 : ジャンケンゲーム

1章「[画像認識編] ジャンケンゲームを作ろう」では,画像認識を使ったより実践的なサンプルとして「ジャンケンゲーム」を作る.最初に「ラベル(グー/チョキ/パー)」を認識するモデルを構築するところから試す.今回は「計60回」も撮影をして,結果的にうまく識別できるようになった.以下は「ラベル2(チョキ)」を認識できているところ.なお,少ない枚数で識別できるのは「転移学習」を使っている!からという解説も載っていた.

f:id:kakku22:20210614211038p:plain

姿勢推定 : 体を使った楽器

3章「[姿勢推定編] 体を使った楽器プログラムを作ろう」では,ポーズ(姿勢)推定ができる PoseNet と Scratch を組み合わせたサンプルを試せる.「目」や「鼻」の場所を特定できるので,Scratch のスプライトと組み合わせるとメガネを付けられる!わいわい!もしかしたら「黒い布の Scratch スプライト」さえあれば五条悟(呪術廻戦)になれるのでは?(なれない🤞)本書ではこの後に PoseNet を使って「体の動きの検知」をして「右腕を横に伸ばしたら音を鳴らす」という楽器を実装する.

f:id:kakku22:20210614211029p:plain

単純パーセプトロン

本書を楽しむことにフォーカスして読むなら「3章」までで良いと思う.「4章」以降は難易度が高くなっていく.なお「4章」では「単純パーセプトロン」の概要を学ぶことができる.とても面白かったため,以下の記事で紹介した.合わせて読んでもらえると!

kakakakakku.hatenablog.com

遺伝的アルゴリズムを使って障害物をよけるネコ

最後に5章「[上級編] 遺伝的アルゴリズムでネコの動きを進化させよう」では「遺伝的アルゴリズム」を Scratch で実装していく.難易度はとても高くなる.テーマは「遺伝的アルゴリズムを使って障害物をよけるネコ」でとてもよく考えられて実装されているし,アルゴリズムの基本的な思想も理解できるようになった.もし試す場合は以下に公開されている.結構時間がかかるため Scratch の「ターボモード(Shift を押しながら緑色の旗をクリックする)」を使った方が良いと思う.

具体的にはネコの移動方向を「上 (U) 下 (D) 左 (L) 右 (R)」として,以下のように遺伝子を定義する(実際にはもっと長い).

DDDULDRDLURU

そして遺伝子と遺伝子を交叉(二点交叉)して世代を増やしたり,突然変異を作ったり,自然淘汰が行われたり,本当に Scratch で「遺伝的アルゴリズム」を楽しんで学べるようになっている.以下の例はデフォルト設定のまま「105 世代」まで増やしたところ.

f:id:kakku22:20210614194256p:plain

またデフォルト 3% に設定されている変数「突然変異が起こる確率 (%)」を 0% にすると,世代を増やすほどに優秀になっていく.以下は「155 世代」まで増やしたところ.現実的ではないかもしれないけど,実際に設定を変更しながら試すこともできる.

f:id:kakku22:20210614194806p:plain

Scratch プロジェクト自体も大規模に実装されているけど,本書にも重要な部分は解説が載っているため,理解を深めることができる.特に「ブロック定義」が重要なので1個1個調べていくと良さそう.

  • x と y を交叉させる
  • 遺伝子を作る
  • 次世代の遺伝子を作る
  • 自然淘汰
  • 突然変異
  • etc

f:id:kakku22:20210614202949p:plain

まとめ

最近「Scratch ではじめる機械学習」を読んだ.本書は Scratch を使って「機械学習で実現できること」を実際に体験できる.とても楽しめた!「音声認識」など今回紹介しなかった Scratch プロジェクトもあるため,興味があれば本書を読んでみると良いのではないでしょうか!

「単純パーセプトロン」を使った分類(フルーツのグループ分け)を体験できる Scratch プロジェクト

最近「Scratch ではじめる機械学習」を読んでいる.Scratch を使って「機械学習」を体験することができて,非常に楽しめている.書評記事はまた別に書く予定!本書の中で「第4章 : 機械学習について学ぼう」を読んでいたら「単純パーセプトロン」を使った分類(フルーツのグループ分け)を体験できる Scratch プロジェクトが紹介されていた.実際に試すことができるので紹介する!

フルーツのグループ分け(単純パーセプトロン) on Scratch

さっそく試す🍎🍌

緑色の旗🚩を押すとランダムに「10個」のリンゴ🍎が配置される.その中から自由にリンゴを1個選んでクリックするとバナナ🍌になり,そこから学習をする.最適な境界線を導き出すまで繰り返し学習をするので,その過程を見るのも面白い.最初は分類しやすい場所のリンゴを選ぶと良いと思う.最終的には境界線が収束する.他にもリンゴを選んでクリックするとバナナになり,その状態からもう1度学習をする.

f:id:kakku22:20210613154309p:plain
右上のリンゴを1個バナナにしたところ

f:id:kakku22:20210613154331p:plain
さらに3個のリンゴをバナナにしたところ

そして次に好きな場所で「スペース」を押すと,重みを計算してリンゴ🍎かバナナ🍌が配置される.以下は試しに中央あたりに追加してみた.このように境界線によってうまく分類(フルーツのグループ分け)できていることを確認できる.

f:id:kakku22:20210613154451p:plain
中央あたりに追加したらバナナに分類されたところ

「単純パーセプトロン」とは

そもそも今回紹介した Scratch プロジェクトのテーマになっている「単純パーセプトロン」とは,深層学習(ディープラーニング)に必要となるニューラルネットワークの基礎になるモデルで「複数の入力と重み」から「単一の出力 (0 or 1)」を返す.以下のような数式で表現できる.


y =
\begin{cases}
1  & (w_1x_1 + w_2x_2 \cdots w_nx_n \geq \theta ) \\
0 & (w_1x_1 + w_2x_2 \cdots w_nx_n < \theta )
\end{cases}

とは言え,あくまで「直線(線形分離)」になるため,うまく分類できないこともある.Scratch の例だと,リンゴとリンゴに挟まれた場合など,場所によってはうまく境界線を導き出すことができず,ずっと学習をし続けてしまうこともある.「単純パーセプトロン」に関しては解説記事などを読んでもらえればと!

www.slideshare.net

実装を確認する

Scratch プロジェクトの実装も簡単に調べられる.詳細な実装解説は「Scratch ではじめる機械学習」には載っていないけど,座標を入力値として繰り返し重みを修正していくなど「ブロック定義(学習する)」の解説は載っている.実装を全体的に確認して理解できないところもあったけど,勉強になる.またそもそも Scratch の実装 Tips としても参考になる部分も多く,拡張機能「ブロック(ペンを上げる/ペンを下げる)」を使って線を引いたり,「ブロック定義」を使ってモジュール化をしたり.

f:id:kakku22:20210613154605p:plain

まとめ

最近「Scratch ではじめる機械学習」を読んでいる.本書で「単純パーセプトロン」を使った分類(フルーツのグループ分け)を体験できる Scratch プロジェクトが紹介されていて,面白かったので紹介した.次は本書の書評記事を書く予定!