かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

Confusion Matrix の復習をしてみた。 2018/12/18

かえるるる(@kaeru_nantoka)です。

今回は、私が今朝まで参加していた通称 PLAsTiccコンペ
PLAsTiCC Astronomical Classification | Kaggle)で大変お世話になった、
Confusion Matrix (sklearn.metrics.confusion_matrix — scikit-learn 0.20.1 documentation)

について復習したのでその備忘として書いていこうと思っております。

ソースコードは、私の github に残しているのでよろしければご覧になってください。

https://github.com/osuossu8/myEDAs/blob/master/plasticc/confusion_matrix.ipynb

*****

( i ) Confusion Matrix とはなんぞや

このような図を描画してくれる便利メソッドです。

f:id:kaeru_nantoka_py:20181218225533p:plain
PLAsTiCC コンペでの私の best model の Confusion Matrix

簡単に言うと分類問題で、test label と prediction label とで、何を何に分類しているのかが格子状になっていてひと目でわかる描画メソッドです。

PLAsTiCC コンペは たくさんある星のデータを15種類に分類するのが課題でした。

コンペ中は、
New Confusion matrix | Kaggle

というような discussion スレッドが立ち、上位陣のモデルでは何を正しく分類できており、何を正しく分類するのが難しいのかを知ることができ、大変参考になりました。

( ii ) 動機

今回の執筆の動機は、シンプルに言うとまた使えるように整理しておきたかったからです。
実はこの PLAsTiCC コンペで散々お世話になったこのメソッド、 コンペ期間中はコピペで、中身を理解せずに使用しておりました。
コピペのままじゃあ次につながらぬ。と言うことでおさらいがてらまとめてみようと思った次第です。

( iii ) 本題

はい、今回は定番中の定番、アヤメのデータセットを使って復習してみました。(一度やってみたかった)

アヤメのデータセットは、花弁や茎などの長さといった特徴から 3種類に分類する基本的なデータです。
分類に使用したモデルは XGBoost です。

import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

import matplotlib.pyplot as plt
import seaborn as sns 

import xgboost as xgb

from sklearn import datasets
from sklearn.model_selection import train_test_split

使用するライブラリを import して

# Iris データセットを読み込む
iris = datasets.load_iris()
X, y = iris.data, iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1111)

params = {
        # 多値分類問題
        'objective': 'multiclass',
        # クラス数は 3
        'num_class': 3,
}

# 上記のパラメータでモデルを学習する
clf = xgb.XGBClassifier(**params)
    
clf.fit(X_train, y_train)
    
# テストデータを予測する
y_pred = clf.predict(X_test)

# 精度 (Accuracy) を計算する
from sklearn.metrics import accuracy_score
print(accuracy_score(y_pred,y_test))

accuracy は 0.97 とかでした。

アヤメのデータセットは ndarray の形で与えられているので、DataFrame に変換しておきます。

y_test_df = pd.DataFrame(y_test)
print(y_test_df[0].unique())

y_pred_df = pd.DataFrame(y_pred)
print(y_pred_df[0].unique())


で主役の Confusion Matrix です。

def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')

    print(cm)

    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.tight_layout()


# http://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html

from sklearn.metrics import confusion_matrix

# Compute confusion matrix
cnf_matrix = confusion_matrix(y_test_df, y_pred_df) # 引数に先ほどの df を渡す...(a)
np.set_printoptions(precision=2)

class_names = list(y_pred_df[0].unique()) # 正解ラベルを定義 ...(b)

# Plot non-normalized confusion matrix
plt.figure(figsize=(5,5))
foo = plot_confusion_matrix(cnf_matrix, classes=class_names,normalize=True,
                      title='Confusion matrix') ...(a) (b) を渡す

これで以下のような画像が得られます。

f:id:kaeru_nantoka_py:20181218231632p:plain


1.00 となっている label 0 と label 1 は 100% 正しく分類できており、0.94 となっているところは、label 2
を正しく分類できた確率が 94% , 残りの 0.06 は、正解ラベル 2 のものを間違えて ラベル 1 と予測しちゃったのが 6% あるよ。という見方をします。


( iv ) まとめ

結局ソースコード自体は kernels のものを丸々 パクった 参考にした形になりましたが、
うまく基本データセットで応用できたのできちんと身についたかなと思います。

ありがとうございました。

$gcloud コマンドがどうしても効かない時の tips. 2018/12/18

お久しぶりです。かえるるる(@kaeru_nantoka) です。

今回は、私が2ヶ月ぶりに GCPGPU インスタンスを立てようとした時につまづいたことと、それを脱することができた解決法を記していきます。

根本的な解決法ではないのですが、藁にもすがりたい. そんな時にお役に立てれば幸いです :)

〜今回のケース〜

OS:macOS High Sierra 10.13.6
SDK : google-cloud-sdk-196.0.0-darwin-x86_64.tar
shell : bash

GPU で計算回したいな〜」
「いまはやりのくらうどなるものをいちどさわつてみむ」

はい、このように考えて、

macOS 用のクイックスタート  |  Cloud SDK のドキュメント  |  Google Cloud

ここにたどり着いた方はたくさんいらっしゃると思います。
私もその一人でした。

ここを覗くとありますね、問題の一文が。そう。

f:id:kaeru_nantoka_py:20181218005832p:plain

そして、こう。

f:id:kaeru_nantoka_py:20181218005927p:plain
ローカルの bash で gcloud コマンドが効かなかった図

💢💢ローカルで $gcloud コマンドが効かないんだけど💢💢


path が通っていないんだろうな〜と思い、環境変数を云々してみたものの応答なし。。

環境変数むつかしい・・・

〜〜今回の解決法〜〜

shell までのフルパスでコマンドが叩けます。

f:id:kaeru_nantoka_py:20181218010328p:plain
指定zone の利用可能な設備を確認できるコマンドを叩いた図

よくよく考えたら当たり前なのですが、ちょっと感動しました。

〜おまけ〜

cloud shell というGCP のプラットフォーム上で専用の shell を起動できます。 gcloud, datalab(GCD), gsutil(GCS) などGCPの各サービスで使えるコマンドのパスがデフォルトで通っている shell です。幸せになれます。

以上、ありがとうございました。

「深層学習を用いた株価予測の分析」宮崎・松尾(2017)を読了して

かえるるる(@kaeru_nantoka) です。

 

最近AI関連の技術論文を読むのにハマっておりまして、発見や思ったことを文字として残しておこうかなと思ったので書いていきます。

 

第1弾はこちらです。

https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/1112.pdf

以下、当論文 と表記します。

 

概要

画像認識で頻繁に使われる技術を CNN を株価予測に応用してみた。

 

といった内容で考察されてます。

 

発見

1. CNN を画像データ以外に対しても適用できるということ。

 

CNN自体は以前から知っておりました。

この技術を使って 顔認識AI内蔵のLINE BOT を作成し、30人ほどの方に使って頂いたこともあります。

 

一般的に CNN について説明がなされる場合、

当論文の 図1 で示されるような概念図を用いて説明されます。

 

「人間の網膜の仕組みを機械的に再現し、コンピュータに処理させる」という理系的背景がなくても直感的に理解できるもので、私も漏れなくそのように認識しておりました。

 

従って「CNNで株価予測」とはじめて聞いたときは ??? だったのですが、当論文でも言及があるように

i ) 株価の値動き自体を画像データに落とし込む

i i ) 入力データをそのまま画像データと同様に扱いインプットとする

 

というように考えられることを知りました。

 

2. 当論文では、9:00のデータをブレが大きいアウトライナーとして処理しておりました。

 

以前証券会社に勤めていた私はこの点にささやかながら疑問を感じました。

 

株価予測の過去データの有用性は、当論文でも言及があるように市場関係者がテクニカル分析(過去の値動きを参考に経験則で導き出された予測手法)を使用していることから一定の価値があるとされます。

 

午前9時は、寄り付きといい株式の売買が開始される時間です。

 

よって「寄り付きの時間の値動きにブレがある」という事実もまた将来の株価予測を導き出すための1パラメータになり得るのではないか

と考えていたからです。

 

データ分析のプロの知見とかつて市場関係者として勤めていた者の細やかな経験則とで1つの事象に対する考え方の相違がとても新鮮でした。

 

まとめ

技術論文を読むと学びが多いです。

特に、最初に関連研究や研究史に触れた上でその論文のトピックがどうその流れを変化させうるのかが簡略に述べてあります。

また、当該技術の簡単な実装法、比較対象としてどの技術が有用かなどその分野のバックボーンがない私にとっては宝の山のような情報源でした。

 

これを機会にこういった論文を読んでみようと思った方が増えると嬉しいです。

ありがとうございました。

 

Google Cloud Datalb で kaggle の画像コンペ用の画像データを扱えるようにする。 2018/09/28

かえるるる(@kaeru_nantoka)です。

 

今回は、有料のGPUインスタンスが立てられる、 Google Cloud Datalab 環境で

kaggle の画像コンペ用の大容量の画像ファイルを扱えるようにするプロセスについて書いていきます。
以前、無料でGPU を扱える Google Colab で似たようなエントリを書いたのですが、Datalab の GPUインスタンスでは幾分勝手が違いました。ということで備忘として残していきます。

 

今回のゴール **

(写真A)
 f:id:kaeru_nantoka_py:20180928232720p:plain

からの

img = load_img("TGSsalt/train/hoge/fugafuga12345.png")

train_df = pd.read_csv("TGSsalt/train.csv")

で、エラーにならず読み込めるようになることです。

手順 **

1. zip ファイルをドラッグ&ドロップで持ってくる。

2. zip ファイルと同ディレクトリに notebook を立ち上げる。

3. !unzip コマンドでファイルを展開する。

********


1 )
写真A の上部真ん中あたりに、 upload と書かれたところがあります。
ここを押すと ファイルをアップロードできます。

kaggle の画像ファイルは大容量なので、「容量が大きいですよ!」という旨のポップアップが出ますが、それほど時間もかからずアップロードできます。

2 )
今回のポイントです。

最初私は、デフォルトで存在するディレクトリの datalab/notebook/ というところに 新規notebook を立ち上げ、意気揚々と以下のコマンドを叩きました。

../datalab/TGSsalt.zip #画像がたくさん入っているディレクトリを固めた zipファイル

すると「そのようなファイル、ディレクトリはないですよ〜」と言われました。
はい、 パスが通っていないのです。


Google Colab では、drive/My \ Drive というところにマウントされるので、
drive/My \ Drive/hoge/fuga でパスを通すことができました。

ということで根本的な解決策ではないですが、同一ディレクトリ上に notebook を立ち上げて、ことなきを得ました。

3 )

(写真B)
f:id:kaeru_nantoka_py:20180928235548p:plain


写真の通りです。
こちらは Colab に比べると光の速さで(気持ちの問題です笑)展開されました。

まとめ **

実際に画像がうまく読み出せている画面キャプチャはあるのですが、コンペ期間中なので控えておきます。
私と同じ事象ではまったどなたかの一助になれば幸いです。
以上、ありがとうございました。

Happy Kaggling !

Google Cloud Datalab で OpenCV を使えるようにする。 2018/09/28

かえるるる(@kaeru_nantoka)です。

今回は、 Google Cloud Datalab で kaggle の画像コンペに挑戦するにあたって、

import cv2

がエラーになったのでその解決法を残しておきます。

結論 **

以下のコードを実行したら使えるようになりました!

!apt-get update

!apt-get -qq install -y libsm6 libxext6 --allow-unauthenticated && pip install -q -U opencv-python

!apt-get -qq install -y libxrender1 --allow-unauthenticated


open-cv がサードパーティ製のライブラリなために、lib~ からはじまる上記のパッケージたちをインストールしないといけないようです。

同じような理由で heroku の環境構築でも似たような処理をする必要があります。
興味ある方は、以下の記事も見てみてください!

kaeru-nantoka.hatenablog.com


ありがとうございました!

Google Colab で kaggle の画像コンペに挑戦する。

かえるるる(@kaeru_nantoka)です。


今回は環境構築不要かつ無料でGPUを使用して開発できる Google Colab環境で kaggle の画像コンペの提出ファイルを提出するまでの手順についてまとめていきます。
ライブラリのインストールなどは適宜よろしくお願いします。

 

*** 目次 ****

手順1:マウントする。

手順2:画像ファイルを Colab環境に用意する

[ i ] zip ファイルをアップロードする。

[ i i ] zipファイルを解凍する。

手順3:実際に学習する。

手順4:できた csv ファイルをローカル環境にダウンロードする。

手順5:kaggle にコミットする。

おわりに

*********

1 **

まず、 Google Colab 環境での作業ディレクトリの整備をしないといけません。
「マウント」 という処理をやっていきます。

ちなみにこのマウント作業は毎回しなければできません。(無料なのでそこは辛抱です。)

以下のコードを実行してください。

from google.colab import drive
drive.mount('/content/drive')
!ls drive/My\ Drive

ログイン処理の画面に遷移します。遷移先のパスワードをコピペすると完了です。

Google Drive の「マイドライブ」に drive/My\ Drive でアクセスできるようになります。
Linux コマンドの ls 前の ! は Google Colab の方言のようなものです。(私はそのように認識してます。)

注意点は、My と Drive 間に空白が必要なのですが、この空白を「 \ (バックスラッシュ)」で表示しないといけないことです。(私はハマりました。。)

ちなみにアップロードした画像データにアクセスする時は、

train_df = pd.read_csv("drive/My Drive/train.csv")

というようにしましょう。
逆に、バックスラッシュを使用したらエラーという罠です。
(やはりハマりました。。)

2 **

次に、画像データを用意しましょう。

私の場合は、
[ i ] kaggle の HP からダウンロードできる zip ファイルをドラッグ&ドロップでマイドライブに持ってきて、
[ i i ] コマンドで解凍する。

という手法でやりました。

この時に使用したコマンドたちが以下です。

(1)

!unzip drive/My\ Drive/all.zip -d drive/My\ Drive/

(1)のポイントは、-d drive/My\ Drive/ です。
展開先をマイドライブを指定して展開するためのものです。
このようにしたら再びマウントした時にも画像データが残っていました。

これをしないで展開すると、 !ls の直下に画像が展開されます。
そのセッション中なら展開した画像が使えるのですが、セッションが切れると丸ごと消えちゃいます。
(私の場合は再びマウントした時に消えていました。。私の場合のみだといいのですが。。)


(2)

!rm -r drive/My\ Drive/images

(2)はドライブ内のフォルダ・ファイルを削除するためのコマンドです。
やり直したい時に使っています。

3 **

ここでは割愛します。
GPU パワーをフルに体感してください!!!

4 **

さて、提出用の csv ファイルができました。
これは、 !ls の直下にできます。

ローカルだと作業ディレクトリ内にできるので簡単に提出できるのですが、Colab環境で作ったファイル
はこのままだと提出できないので、ローカルにダウンロードしましょう。

# 学習したファイルを local に持ってくる。
from google.colab import files
files.download("sample.csv")

5 **

これで、ローカルに提出ファイルを持ってくることができました。
いつもやっている通りに kaggle にコミットしましょう。

おわりに **

これで Google Colab の GPU リソースを使用して画像コンペに挑むことができます。
私個人では、画像ファイルの入っている zip ファイルの解凍が一番苦労しました。(全部解凍される前にランタイムエラーになったり、セッションエラーになったり。。)ただ画像さえ用意できれば、計算スピードは段違いなのでぜひ一度使用してみてください。

ありがとうございました!

herokuで python3 + opencv を動かす 2018/09/16

かえるるる(@kaeru_nantoka)です。
 

今回は、heroku 環境で python3 + opencv を動かす という内容で書いていきます。

方法は主に二つありまして
i ) docker 環境を構築する。
i i ) build pack を利用する。

で、今回は後者で実装していきます。

この時参考にさせて頂いた記事(https://takasa-5.blogspot.com/2018/02/opencv-4-heroku-python3-opencv.html?m=1)でとても簡潔にわかりやすく書かれていました。

こちらをベースに設定ファイルを少し調整し、私が動作を確認できた内容になっています。

ソースコードGitHub にあげておりますので参考にしていただければ幸いです。

GitHub - osuossu8/python3_opencv_tutorial )


***目次***

1:経緯

2:結論

3:ソースコードの説明

4:heroku 側の設定

5:まとめ

********



1: 経緯

私が機械学習を用いた画像判別LINE Bot を作成し、heroku にデプロイしたときの話です。

例のごとくアプリケーションエラーが出てきていつものように heroku  logs --app アプリ名でログを確認してみると、「 import cv2 」 のところでエラーが出ているようでした。

ググってみると、

・素のheroku環境では cv2 を読み込めない

・heroku 側の設定で buildpack というものを追加し、機能を拡張する

・Aptfile という設定ファイルを作成し、buildpack に対する命令を書き込む

といった手順を踏む必要があるらしいとわかりました。

 

2: 結論

⬆︎のリンクで書かれていた内容 + Aptfileに2行追加する

という形で私の場合は動くようになりました。

 

3: ソースコードの説明

今回のディレクトリ構成は以下のような感じになっています。

python3_opencv/

  • main.py *
  • requirements.txt **
  • Aptfile ***
  • shiogao_model2.h5 ****
  • runtime.txt
  • Procfile

特に今回のポイントになる部分を以下で解説します。 

i ) main.py

ブラウザ上で hello world ! と出力されるだけのプログラムです。

f:id:kaeru_nantoka_py:20180916223336p:plain

(⬆︎ うまく行った時のログです。)


あくまで今回の目的は、

・cv2 のimportでエラーが出ないようにすること

機械学習モデルを load して、ロードできているか確認する(おまけ)

ですので、「機械学習で使用するライブラリを import した上でエラーが出ずにプログラムが実行された状態」をわかりやすく実現するために簡潔な処理だけ入れています。

因みに、コメントアウトしてる load_model あたりの# を外すと、hello world ! が表示されなくなり、ログで以下のようなものが確認できるはずです。

f:id:kaeru_nantoka_py:20180916220021p:plain

理由はモデルに投入する画像データを想定するサイズでインプットする処理が抜けているからです。
しかし、 model.summary() が実行されてログが確認できていることから、from keras.models import load_model がきちんと読み込まれていることがわかります。

i i ) requirements.txt

heroku 環境に pip install して欲しいライブラリを記述します。今回は、
Flask, pillow, keras, tensorflow,
opencv-python

を記述しています。
バージョン名を記述しなければ、heroku 対応しているバージョンを勝手にとってきてくれます。

i i i ) Aptfile

今回のポイントです。
buildpack と一緒に組み合わせて heroku 機能を拡張するようなものと認識しております。(詳しい方教えてください。。)
libsm6, libice6 は参考にさせて頂いた記事で書かれていたものです。

この二行のみの状態でデプロイしたところ、記事のようにうまくいかなかったのでログを見ながら追加したのが以下の二行です。

linfontconfig1
libxrender1

これらを記述したところエラーがなくなりました!


f:id:kaeru_nantoka_py:20180916223436p:plain

(⬆︎ うまくいかなかった時のログです。 import cv2 が云々怒っています。)

i v ) shiogao_model2.h5

こちらは別件で組んだ画像判別モデルです。
これをきちんと読み込めますよ〜と実演するためのファイルなのでなんでも良いです。


4: heroku 側の設定

settings の buildpack  のところに urlを追加する形で実装します。

f:id:kaeru_nantoka_py:20180916215759p:plain

  • buildpackとは?

公式のリンクを貼っておきます。
 
Heroku buildpack | Heroku


5: まとめ

現在機械学習が流行っており、私のようにローカルで作成したものをデプロイしたい!という同じ気持ちを持った方々に届いたら嬉しいです。

タイトルは python3 + opencv となっていますが、 ソースコードではおまけで ローカルで学習させたモデルを loadしてsummaryを確認するというような内容も組み込んでいますのでお役に立てればと思ってます。

以上、ありがとうございました。