継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

『機械学習を始める前の「学習」』を発表した

タダです。

社内勉強会で、『機械学習を始める前の「学習」』と題して機械学習を始めるにあたっての用語やツール、手法などの発表をしてきました。

モチベーション

去年からAIの分野に興味をもって機械学習ディープラーニングを0から勉強し始めました。

最近機械学習の実践としてJupyter Notebookを使ってscikit-learnやnumpy、matplotlibなどのライブラリを活用したデータの解析やモデル生成の勉強がようやくわかってきました。

機械学習に興味があってもいきなり実践をやってしまうといろんな専門用語、ツール等がわからず、勉強してて辛かった過去の経験から実践に入る前段の情報を伝えたいと思って資料を作りました。

資料

資料はこちらです。

www.slideshare.net

個人的にやったほうがいいと思った学習パス

個人的に、機械学習の勉強やモデルのプログラミングを実際にやってみたりして感じたのは、以下の順番で理解が必要なのかと思っています。

  1. 機械学習の体系的な理解
  2. 実データを使ったモデルの生成

そのためには、東大松尾教授の公開コンテンツや、Coursera のコンテンツで知識をインプットし、 KaggleSIGNATE で扱っているような既にデータがあるサービスを利用して実践力を高めるのが個人的にオススメです。

関連記事

私は機械学習の体系的な理解を行うためCoursera の 「Machine Learning Course」で主に勉強中です。

sadayoshi-tada.hatenablog.com

まとめ

今回は、機械学習の導入の話をさせてもらったのですが、次は実践のプログラミングを行いながら、機械学習を体感してもらえる内容にしていきたいです。

参考にさせてもらった関連記事

カックさんのプレゼン時に意識していることと Keynote のベストプラクティス参考に資料を作りました! ありがとうございました!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Cousera で「Machine Learning Course」の 第1週を受講した

タダです。

Cousera の 「Machine Learning Course」を受講してます。 www.coursera.org

講座の Introduction 以降を受講したので個人的なメモをまとめていきます。

第1週の講座は、次の3つのセクションになります。

  1. Model and Cost Function
  2. Parameter Learning
  3. Linear Algebra Review

Model and Cost Function

回帰に関する事例として住宅価格の例が紹介された。

講座では学習の訓練セットとして、以下のモノを使った。

  • 小文字のm :訓練のサンプル数
  • 小文字のx :入力変数、特徴
  • y:出力変数、目標変数

訓練セットによって定義されるものは、教師あり学習アルゴリズムになる。

住宅価格の例のように、予測しようとしている目標変数が連続的である場合、回帰問題と呼ぶ。

少数の離散値(数値が連続していない)しか取ることができない時(例えば、癌腫瘍を見てどれが悪性でどれが良性かを判別する場合など)、分類問題と呼ぶ。

Parameter Learning

最急降下法は、適当に初期点を選び、関数の値の最小値あるいは局所的最小値に到達するように反復する。

最小値を求める目的関数(コスト関数)と、偏微分項(勾配)が最急降下法を使うのに必要になる。

なお、ディープラーニングの文脈では、最急降下法をベースにした確率的勾配降下法が使われることがある。

Linear Algebra Review

本章では、行列とベクトルの解説に加えて、行列同士の計算、ベクトル同士の計算、行列とベクトルの計算が解説された。

また、行列のインバース(逆行列)は手で計算せず、プログラミングでやることが多く、 Octave が紹介された。

ja.wikipedia.org

まとめ

第1週のプログラムで以下のことを学びました。

第2週のプログラムも引き続き受講していきます。

関連記事

sadayoshi-tada.hatenablog.com

海外の有名大学・企業の講義を受けられる Cousera の「Machine Learning Course」

タダです。

機械学習の勉強で、 前々から Cousera を使いたいと思って下記の 「Machine Learning Course」を受講します。 www.coursera.org

そこで、今回は本コースの概要と、受講スタイル、料金、本コースの Introduction で学んだことをまとめていきます。

ちなみに受講者の私のステータスは、文系かつ数学は学生時代に挫折していますが、機械学習に興味をもち1から勉強している身です。

受講する準備

Coursera では、アカウントを作成する必要があります。

そのため、 Facebook のアカウントを使って認証か Coursera の独自アカウントを作成しておいてください。

ja.coursera.org

本コースの概要

本コースの講師は、スタンフォード大学の Andrew Ng 先生です。

あの有名なスタンフォード大学の講義を受けられるなんて凄い時代です...

Coursera では、週ごとの学習コンテンツが設けられており、 「Machine Learning Course」では11週間のプログラムになってます。

f:id:sadayoshi_tada:20190112121204p:plain

受講スタイル

受講スタイルは、eラーニングでの受講になります。

中身としては、以下のようなコンテンツ構成となっています。

  • 動画による Andrew Ng 先生の講義
  • 動画で解説してきたキーワードの解説資料(学習用教材)
  • テスト

動画を何本か観たのですが、1本あたり5分~8分ほどで非常にコンパクトで観やすいです。

何より日本語字幕が対応しているのがありがたいです。

受講料金

受講料金は、無料になります。

Introduction を受講して学んだこと

まず、もうすでに私たちは以下のような多くの機会学習アルゴリズムを使っていることが紹介されました。

また、機械学習アルゴリズムは大きく以下のものがあり、本講座では以下のアルゴリズムについて紹介されます。

教師なし学習教師なし学習

教師あり学習は、正しい答えが与えられて、アルゴリズムに正解を予測させます。

教師あり学習の種類として以下のものがあります。

  • 分類:Eメールのスパムメールのように、ラベル(「正解」)をつけて分類する
  • 回帰:住宅の価格変動を予測するなど数値を予測する

教師なし学習は、答えはなく、何らかの構造や法則を見出すアルゴリズムです。

例えば、Web上の一連のニュース記事の中身から同様のニュースである、といったグルーピングを自動で行うような処理をさします。

これは、クラスタリングという手法で行なっている処理になります。

以上が、 Introduction で学んだことになります。

次からは教師あり学習の線形回帰の解説に入りますが、次回の記事で学んだことをまとめます。

まとめ

Machine Learning Course」を学び始める前にコースと Introduction の受講の所感をまとめてみました。

数学や論文を使わず、具体例を交えながら教師あり学習教師なし学習を解説されているのでイメージがつきやすかったです。

引き続き次回もIntroduction以降の第1週のコンテンツの受講レポートを順次書いていきます!

AWS CLI のコマンドを自動生成してくれる「AWS CLI Builder」

タダです。

Jeff Barrさんのツイートを見ていたら、「AWS CLI Builder」というサイトが紹介されていました。

サイトはこちらです。

AWS CLI Builder By Prasad Domala

こちらのサイトでは、AWS サービスごとの AWS CLI コマンド実行支援がされています。

Let me help you BUILD YOUR AWS CLI COMMANDS

GET STARTED by choosing a service.

AWSマネジメントコンソールでの操作ばかりでなく自動化で使うので AWS CLI コマンドの実行でどう使えるかの観点で上記のサイトを使ってみます。

AWS CLI 実行の準備

あらかじめ AWS CLI コマンドの実行環境を準備してください。 aws.amazon.com

また、 AWS CLI コマンドを実行するのに必要なパラメータの確認を行っておいてください。

例えば、 EC2 を構築するなら下記のドキュメントを参考に情報収集しておきます。 docs.aws.amazon.com

AWS CLI Builder の使い方

それでは、試しに EC2 を作るためのCLIコマンドを作ってみます。

サイトにアクセスすると、このようなトップページです。 f:id:sadayoshi_tada:20190104122607p:plain

左メニューから「Compute > Elastic Compute Cloud」を選択します。 f:id:sadayoshi_tada:20190104122515p:plain

利用する「Region」,「Output Format」と必要があれば、「Profile Name」を指定します。 また、 EC2 作成に必要なパラメーターを適宜作成していきます。 f:id:sadayoshi_tada:20190105223550p:plain

なお、パラメータがどのような値かを知りたい場合、「i」ボタンを押すとパラメータ情報を確認できます。 f:id:sadayoshi_tada:20190105223606p:plain

パラメータ入力が完了すると、CLI コマンドが出来上がっています。

実際にコマンドを実行してみます。

$ aws ec2 run-instances --image-id ami-0a2de1c3b415889d2 --instance-type t2.micro --key-name xxxxxxx --security-group-ids sg-xxxxxxx --subnet-id subnet-xxxxxxx --instance-initiated-shutdown-behavior stop --region ap-northeast-1 --output text

EC2 の起動が成功しました。 f:id:sadayoshi_tada:20190105224019p:plain

まとめ

AWS CLI Builder」を使うことで、CLI コマンドの生成が容易にできました。

また、コマンド生成時にヘルプコマンドやドキュメントで都度確認していましたが、必須パラメーターや任意パラメータを GUI で教えてくれてコマンドを自動生成してくれるので便利だと思いました。

なお、対応していないサービス(例えば、 AWS Transit Gateway 等)もあるため、適宜利用するサービスが対応しているかを確認する必要があります。

PythonでスクレイピングとMNISTを使って機械学習を実践する

タダです。

あけましておめでとうございます! 新年一発目のブログを書いて行きます。

実は、id:kakku22さんのブログメンティーに選んでいただきまして、良いプレッシャーをいただきつつブログを書いています。

さて、昨年から機械学習に興味が出てきて、その技術について学んでいます。 その中でデータ収集するための手段としてスクレイピング技術を勉強しているので、今回はPythonスクレイピングをサンプルデータで実際に動かしてみます。

教本としてこちらの本を使わせてもらっています。

www.socym.co.jp

TL;DR

ソースコード載せたりしている関係で冗長になっているので、以下の2つのことを書いています。

スクレイピング機械学習

スクレイピングは、Webサイトから任意の情報を抽出、データ構造の解析することができます。

機械学習を行う為には、大量のデータを収集する必要があります。

そのための手段として、スクレイピング技術を扱うことができればデータの収集がしやすくなれると思い勉強しています。

スクレイピングの技術要素

勉強していて出てきたPythonスクレイピングするために必要な技術要素を紹介します。 なお、今回はスクレイピングしたデータから機械学習を行うための手順を書きたいので、下記の技術の詳細な説明は割愛します。

  • urllib : HTTPやFTPを利用してデータをダウンロードするためのライブラリ
    • urllib.request : ファイルをダウンロードするためのモジュール
  • requests : クッキーを利用したWebアクセスが簡単に行えるモジュール
  • BeautifulSoup : HTMLやXMLの解析を行うためのライブラリ
  • Selenium : JavaScriptなどWebブラウザを使わないと正しく動作しないサイトへの遠隔操作するためのツール。主にWebアプリのテストで使う。
  • PhantomJS : コマンドラインから使えるWebブラウザー(PhantomJSの開発は終了して、リポジトリアーカイブ化されてるため注意)

参考 : PhantomJSの開発が終了しリポジトリがアーカイブ化された - JSer.info

これらの技術を使ってWebからデータを収集します。

実際にPythonスクレイピングして機械学習を行う

それでは、実際にPythonスクレイピングして機械学習していきます。

今回は、機械学習のためのフレームワークである「scikit-learn」を使うので環境にインストールしておきます。

pip install -U scikit-learn scipy matplotlib scikit-image

また、機械学習の対象はMNISTの手書き数字データになります。

MNISTのデータは機械学習の練習によく使われるデータなので、利用することにしています。

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

さて、大まかに作業の順番ですが、以下の通りです。

  1. MNISTから学習用データとテスト用データをダウンロードする
  2. MNISTの学習用データをCSVに変換する
  3. 画像データを学習させる

1. MNISTから学習用データとテスト用データをダウンロードする

MNISTのサイトから以下の4つファイルを「mnist」ディレクトリにダウンロードします。

  • train-images-idx3-ubyte.gz : 学習用画像データ
  • train-labels-idx1-ubyte.gz : 学習用ラベルデータ
  • t10k-images-idx3-ubyte.gz : テスト用画像データ
  • t10k-labels-idx1-ubyte.gz : テスト用ラベルデータ
# coding:utf-8
import requests
import gzip, os, os.path

savepath = "./mnist"
baseurl = "http://yann.lecun.com/exdb/mnist"
files = [
    "train-images-idx3-ubyte.gz",
    "train-labels-idx1-ubyte.gz",
    "t10k-images-idx3-ubyte.gz",
    "t10k-labels-idx1-ubyte.gz"
]

# ディレクトリの作成
if not os.path.exists(savepath): os.mkdir(savepath)

# ダウンロード
for file in files :
    url = baseurl + "/" + file
    res = requests.get(url)
    location = savepath + "/" + file
    print("download:", url)
    if not os.path.exists(location):
        with open(location, "wb") as f:
            f.write(res.content)
            
for file in files:
    gz_file = savepath + "/" + file
    raw_file = savepath + "/" + file.replace(".gz", "")
    print("gzip:" + file)
    with gzip.open(gz_file, "rt") as fp:
        body = fp.read()
        with open(raw_file, "wb") as w:
            w.write(body)

2.MNISTの学習用データをCSVに変換する

バイナリデータのままだとPythonで扱いづらいため、CSVファイルへの変換を行います。

CSVファイルへの変換とあわせて、画像データから最初の10件だけデータを取得しています。

# coding:utf-8
import struct

def to_csv(name, maxdata):
    # ラベルファイルとイメージファイルを開く
    lbl_f = open("./mnist/"+name+"-labels-idx1-ubyte", "rb")
    img_f = open("./mnist/"+name+"-images-idx3-ubyte", "rb")
    csv_f = open("./mnist/"+name+".csv", "w", encoding="utf-8")
    # ヘッダ情報を読む
    mag, lbl_count = struct.unpack(">II", lbl_f.read(8))
    mag, img_count = struct.unpack(">II", img_f.read(8))
    rows, cols = struct.unpack(">II", img_f.read(8))
    pixels = rows * cols
    # 画像データを読んでCSVで保存
    res = []
    for idx in range(lbl_count):
        if idx > maxdata: break
        label = struct.unpack("B", lbl_f.read(1))[0]
        bdata = img_f.read(pixels)
        sdata = list(map(lambda n: str(n), bdata))
        csv_f.write(str(label)+",")
        csv_f.write(",".join(sdata)+"\r\n")
        # 試しに10件だけPGMで保存
        if idx < 10:
            s = "P2 28 28 255\n"
            s += " ".join(sdata)
            iname = "./mnist/{0}-{1}-{2}.pgm".format(name,idx,label)
            with open(iname, "w", encoding="utf-8") as f:
                f.write(s)
    csv_f.close()
    lbl_f.close()
    img_f.close()

# 出力件数を指定 --- (※4)
to_csv("train", 1000)
to_csv("t10k", 500)

3.画像データを学習させる

書籍では、下記のようなモジュールの読み込ませ方が紹介されていました。

from sklearn import cross_validation

ただ、scikit-learnの0.20バージョンからcross_validationモジュールはなくなり、代わりにmodel_selectionモジュールが使われるようになりました。

# coding:utf-8
from sklearn.model_selection import cross_val_score # ここの書き方注意
from sklearn import svm, metrics

# CSVファイルを読んで学習用データに整形
def load_csv(fname):
    labels = []
    images = []
    with open(fname, "r") as f:
        for line in f:
            cols = line.split(",")
            if len(cols) < 2: continue
            labels.append(int(cols.pop(0)))
            vals = list(map(lambda n: int(n) / 256, cols))
            images.append(vals)
    return {"labels":labels, "images":images}

data = load_csv("./mnist/train.csv")
test = load_csv("./mnist/t10k.csv")

# 学習
clf = svm.SVC()
clf.fit(data["images"], data["labels"])

# 予測
predict = clf.predict(test["images"])

# 精度の確認
ac_score = metrics.accuracy_score(test["labels"], predict)
cl_report = metrics.classification_report(test["labels"], predict)
print("正解率=", ac_score)
print("レポート=")
print(cl_report)

このプログラムの実行結果が下記です。

正解率が78.6%です。何もチューニングしていないためまずまずな精度かと言えます。

正解率= 0.7884231536926147
レポート=
              precision    recall  f1-score   support

           0       0.87      0.93      0.90        42
           1       0.81      1.00      0.89        67
           2       0.84      0.69      0.76        55
           3       0.87      0.57      0.68        46
           4       0.76      0.75      0.75        55
           5       0.63      0.80      0.71        50
           6       0.97      0.67      0.79        43
           7       0.74      0.86      0.79        49
           8       0.91      0.72      0.81        40
           9       0.71      0.81      0.76        54

   micro avg       0.79      0.79      0.79       501
   macro avg       0.81      0.78      0.78       501
weighted avg       0.80      0.79      0.79       501

まとめ

Pythonスクレイピングしたデータを使ってscikit-learnで機械学習をしてみました。

サンプルデータなのでチューニングはしていませんが、今度は公開されているAPIからデータを取得して実践的な使い方を記事にしたいと思います。