継続は力なり

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

海外の有名大学・企業の講義を受けられる 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からデータを取得して実践的な使い方を記事にしたいと思います。

2018年の振り返りと2019年の抱負

タダです。

2018年も今日で終わりですね。ということで、今年の振り返りと来年の抱負を書きたいと思います。

f:id:sadayoshi_tada:20181231140201p:plain

今年の振り返り

AWS専業の会社で働き続けて3年が経過しました。 2018年はどういう一年だったかと考えると、今までの自分じゃ通用しないことが多くて、一皮向けないといけないと痛感した一年でした。

新しい技術

ただ、新しい技術へのチャレンジさせてもらう機会も多かった一年だったと思います。

下記のジャンルに関する業務やら趣味やら、独学で触れることが多かったですね。

継続的アウトプットを習慣化する

その一方で年始に立てた継続的アウトプット(アウトプット駆動学習)を習慣化するは、週に1本は書いて、自分の中でのルーティンに組み込まれてきました。

今年は連続52週かけていますので、引き続き継続していきます。 sadayoshi-tada.hatenablog.com

今年の記事数は、これまでの記事数より圧倒的に本数は多いです。 f:id:sadayoshi_tada:20181231132402p:plain

また、人生初のホッテントリに選んでもらえました。

sadayoshi-tada.hatenablog.com sadayoshi-tada.hatenablog.com

課題点

が、自分のメモで留まって、誰かのためになっていないことが多い課題があると思っています。

目的は自分のインプットをアウトプットすることだったのでそれはよかったですが、これからは誰かの為に書き方しているかを気にして行きたいです。

来年の抱負

2019年の抱負は、以下の通りです。

No. 目標概要 アクション 結果
1 継続的アウトプットとの継続 週に1本以上の記事を継続 -
2 読み手を意識するアウトプット はてブ総数や記事シェアなど気にする -
3 今年手を広げた新しい技術の深堀 今年手を広げたのはやりたい領域なので引き続き実践力をつけていければと思います。
・Docker / Kubernetes の使い方、インフラの知識の理解を深める、普段使いにする
・CloudFormation, Ansible, Terraformの勉強継続と、実戦投入する
ビッグデータ機械学習等のデータ分析は机上の勉強だけでなく Kaggle や SIGNATE といったコンペに参加する
・CI/CD のツールを使ってみて経験を積む
-
4 自分の武器を1つ作る Python を使ったデータ分析のプロジェクトに自分を入れてもらえるようにする。
Web サービスのポートフォリオを最低1つ作る。
-
5 セキュリティ、データベース領域が弱いため弱点強化 専門書を購入して資格試験やコンペなどで実力を確認 -

最後に

来年は平成が終わり、元年生まれの僕は30歳に突入します。

変化と実りある一年になるようにブログでは継続して、input/output、その質を高めて行きたいと思います!!

12/23~12/29 AWSブログ

タダです。

今週のAWSブログアップデートをまとめていきます。

今週のブログアップデート

1、Amazon RDS Under the Hood: シングル AZ インスタンスのリカバリ

  • 理由がありRDSのシングルAZにする場合の復旧方法に関する考慮事項の紹介記事です
    • RDSではマルチAZ配置が推奨事項になります

2、3 つの新しい言語で音声の文字起こしが可能に: フランス語、イタリア語、ブラジルポルトガル語

3、Amazon CloudFront のアクセスログを大規模に分析する

4、Amazon Elasticsearch Service、Amazon Kinesis Data Firehose、Kibana を使用してユーザーの行動を分析する

  • ApacheのログをKinesis Firhoseで収集、Amazon ESで取りこみ、Lambdaで解析、Kibanaで可視化するための方法の紹介記事です
    • Kibanaの認証をCognitoで行います

5、Apache Spark および Hadoop を Amazon EMR に移行してコストを削減

  • Apache SparkおよびHadoopをEMRに移行してコスト削減ができるかをホワイトペーパーの内容に沿って確認する記事です
    • インフラストラクチャの物理的コストの削減
    • IT スタッフの生産性向上の推進
    • より強固な可用性のビッグデータ環境を提供

6、Amazon SageMaker で、Scikit-Learn のサポートを追加

  • SageMakerでScikit-Learnがサポートされました

7、Amazon DynamoDB グローバルテーブルを使用してマルチリージョンアーキテクチャを強化する方法

  • DynamoDBのグローバルテーブルを使って、マルチリージョンアーキテクチャを実現するための方法の紹介記事です

8、Amazon Translate を使用してオンデマンドで翻訳されたレビューを用いたウェブサイトの強化

  • Amazon Translate を活用して、オンデマンドの翻訳済みレビューをリアルタイムで取得できるか、Eコマースサイトに統合する方法の紹介記事です

9、AWS Firewall Manager が東京リージョンに対応しました。

  • 表題通りのアップデートアナウンス記事です

10、AWS データストア内の機密データを保護するためのベストプラクティス

11、[AWS Black Belt Online Seminar] Amazon Sumerian 資料及び QA 公開

  • 表題通りのWebinar資料及びQA公開記事です

12、AWS Black Belt オンラインセミナーのご案内 (2019 年 1月)

  • 表題通りのアナウンス記事です

以上が今週のアップデートまとめです。