歩いたら休め

なんでこんな模様をしているのですか?

【雑記】deepart.ioを見てると、機械学習を使ったGlitch Artみたいなのが生まれるんじゃないかと思う

要するに今日はプログラミングをサボってWEBサービスで遊んでました。

先日、「人工知能(ディープラーニング)が画像の絵柄を真似して、別の画像に適用する」というサービスが話題になってました。

ima.goo.ne.jp

電子ノイズを乗せ、思ってもみないかっこよさを狙う、Glitch Art的な使い方をする人が出てくるんじゃないかなと思います。というわけで、昔のゲームの画像とかを入れてどうなるか試してみています。

グリッチ・アートとは

【AWS】Amazon Machine Learningチュートリアルやってみました

AWS上で楽に機械学習できるAmazon Machine Learningというものが話題になっています。

Amazon Machine Learning は、どのスキルレベルの開発者でも、機械学習テクノロジーを簡単に使用できるようになるサービスです。Amazon Machine Learning では、複雑な機械学習(ML)アルゴリズムおよびテクノロジーを学習する必要なく、 ML モデルの作成プロセスを説明する仮想化ツールおよびウィザードを提供します。

www.gixo.jp

今回はそのチュートリアルを通してやってみたので、ちょっとしたメモ書きを残しています。 英語が苦手な私でも、画面キャプチャーと太字以外を読み飛ばして40分くらいで終わったので、気になっている方は一回やってみると良いです。 すぐに使えるようになると思います

Tutorial: Using Amazon ML to Predict Responses to a Marketing Offer - Amazon Machine Learning

Step 1: データをダウンロード、編集、アップロードする(Download, Edit, and Upload Data)

チュートリアルでは銀行のダイレクトマーケティングキャンペーンのデータセットcsvを利用しています。 こちらのリンク先に詳細があります。

UCI Machine Learning Repository: Bank Marketing Data Set

ユーザーの年齢・性別などの情報から、定期預金に申し込んでくれるか(カラム名yなので分かりにくい!)どうかを予測します。 具体的には、過去にアタックしたユーザーのリスト(banking.csv)を学習にかけ、 yの値が分からない新しいユーザーリスト(banking-batch.csv)の人たちが成約するかどうかを判別します。

このcsvを、Amazon S3AWSのストレージサービス)のリポジトリにアップロードし、Step2以降で機械学習にかけていきます。

余談ですが、債務不履行したかどうかのカラム(default)などもあってなかなかエグいです。

Step 2: データソースを作成する(Create a Datasource)

Amazon S3にデータを読み込んでいきます。 ここでの設定で注意すべきなのは三点です。

  1. csvカラム名が存在するかどうか(Does the first line in your CSV contain the column names?)
    • R言語のread.csv()のheader=***と同じですね
  2. 各カラムのデータ型(Data Type)の設定
    • 二値(Binary)、カテゴリ型(Categorical)、連続値(Numeric)に設定すれば良さそうです
    • textというデータ型もあるんですが、予測に使えるんでしょうか?
  3. 予測したいカラムの設定(To select y as the target attribute)
    • 先ほど説明したyというカラム(定期預金に申し込むかどうか)を選択します

Step 3: 学習器を作る(Create an ML Model)

いよいよ学習器にかけていきます。 チュートリアル通りにやれば特に問題はなかったのですが、学習が終わるまで数分時間がかかります。 下の画像のように、設定した項目のstatusがCompletedになるのを待ちましょう。

f:id:takeshi0406:20150923165233p:plain

Step 4: モデルの評価、カットオフの設定(Review the ML Model Predictive Performance and Set a Cut-Off)

まず、AUCの値を基に評価します(Reviewing the AUC Metric)。私はAUCがよく分かってないので同僚に質問したところ、 下のリンクを教えてもらいました(後で勉強しよ…)。

qiita.com

あとこんなメッセージも貰いました。

AUC: area under the curve
https://i.datasciencelab.jp/i/w360h0t4i1175
上図みたいに陰性的中率、陽性的中率を横軸縦軸にプロットしてできた
画像の青線の下部分が、正方形のうちに占める割合。
負例を全部FALSE, 正例をを全部TRUEに判別できたら1になる

とりあえず、AUCの値が1に近ければちゃんと「申し込みする人を全部TRUE、しない人を全部FALSEに判別」できている、ということのようです。 次の画像のようにAUCの値を見て、モデルを評価することができます。

f:id:takeshi0406:20150923173910p:plain

次に、閾値をセットします(Setting a Score Threshold)。

今回のような二値分類の場合、予測結果として0~1の範囲でscoreを割り振ってくれます。 これをyが0か1か(つまり申し込みする/しない)に切り分けるために閾値をセットします (To set a score threshold for your ML model)。 つまり、scoreが設定した閾値以下ならy=0に、閾値より大きければy=1に切り分けられます。

f:id:takeshi0406:20150923171224p:plain

上の画像のように、false positive(偽陽性)とfalse nagative(偽陰性)の値を見ながら閾値を設定することができます。 もちろん両方の数(**% are errors)が小さいほうがいいのですが、どちらの値を重視するかは、解析の目的によって違います(って同僚が言ってました)。 また、デフォルトでは閾値は0.5にセットされています。

Step 5: ML Modelを使って、バッチデータを予測する(Use the ML Model to Create Batch Predictions)

ついにbanking-batch.csvの人たちのyの値を予測します。 データの読み込み方などは、Step 1,2とほぼ同じなので心配ないでしょう。

出力結果はS3のレポジトリ上に、次のように出力されます。 .gzファイルの形に圧縮されているので、一旦ローカルマシンにダウンロードして解凍します。 予測スコア(score)と、step 4で設定した閾値で切り分けた答え(bestAnswer)です。

bestAnswer score
0 0.08163745
0 0.01695196
0 0.02596637
0 0.002294753
0 0.002005484
0 0.0664944
0 0.03059662
1 0.7891263
0 0.4784519

このままでは誰をどのように予測したのかわからないので、利用する際にはbanking-batch.csvとマージする必要がありそうです。

Step 6: 後片付け(Clean Up)

Amazon S3リポジトリからデータを削除し、キレイに後片付けします。

9/24追記

今回のチュートリアルの操作で$1.15くらいの費用がかかっていました。

f:id:takeshi0406:20150924211010p:plain

実際に触ってみる方は、今朝IT Proに投稿された記事が役に立つと思います。 こちらの記事では、各パラメータの更に詳しい話や、連続値の回帰分析についてなども解説されています。

itpro.nikkeibp.co.jp

【Deep Learning】Google Deep Dreamのソースコードが公開される→早速Webインターフェイスを実装した方が現る

最近話題になっている、Google Deep Dreamのソースコードが公開され、早速Webインターフェイスを実装した方が現れました。

https://twitter.com/GoddoSukoupion/status/617596593810731008

psychic-vr-lab.com

 

試しにマッスルな人(多分ビスケット・オリバのモデルの人)を入れたら、めちゃめちゃサイケでカッコいい写真が出来上がりました。

f:id:takeshi0406:20150705165325j:plain

ちなみに元の画像はコレ。

f:id:takeshi0406:20150705165313j:plain

 

私も下の記事を参考に、自前でDeep Dreamを動かそうとしていたのですが、caffeのインストールに手こずってる間にインターフェイスまで実装されちゃいました…。

ローカルのMac Book環境だと面倒そうなので、AWSのEC2でUbuntu環境を用意して試してみようと思います。

amagitakayosi.hatenablog.com

www.hirotakaster.com

 

Deep Dreamって何?って方はこのまとめを見てね。

togetter.com

【機械学習】『続・わかりやすいパターン認識』第2章のベイズ更新(ベイズ学習)のシミュレーション

一回ちゃんと勉強しようと思って『続・わかりやすいパターン認識―教師なし学習入門―』を勉強しています。とりあえず図を本の中で描かれてるグラフを再現しながら勉強しています。

 

from matplotlib.pyplot import *
import numpy as np
np.random.seed(10) #ランダム関数のシード

#ベイズ学習の関数
def bayes_learning(data_list,side):
    if side == "H":
        numerator = prior_prob * head_prob
    elif side == "T":
        numerator = prior_prob * (1 - head_prob)
    else:
        pass
    posterior_prob = numerator / numerator.sum()
    return posterior_prob

#コイントスのシミュレーション
results = ""
prob = 0.6
for i in np.random.random(100):
    if i < prob:
        results += "H"
    else:
        results += "T"
#print(results) #事前学習の初期値 prior_prob = np.array([0.1, 0.4, 0.5]) head_prob = np.array([0.8, 0.6, 0.3]) tmp = np.array([prior_prob])
#コインの裏表を学習 for side in results: prior_prob = bayes_learning(prior_prob,side) tmp = np.append(tmp, prior_prob) tmp = tmp.reshape(101,3) plot(tmp) show()

 

これをすると34ページの図が出ます。

f:id:takeshi0406:20150606171227p:plain

 

詳細の説明はダルいので本を買ってください。

続・わかりやすいパターン認識―教師なし学習入門―

続・わかりやすいパターン認識―教師なし学習入門―

 

 

【引用&メモ】Insight x Insideの『“無限の選択肢”は我々を幸せにするか?』という記事

Insight x Insideというデータ解析者やマーケッター向けのWEBメディアがあります。海外のマーケティング事例や講演映像の日本語訳、エスノグラフィーなど、マーケティング関連の面白い記事がたくさん載せられています。

 

ここに『"無限の選択肢"は我々を幸せにするか? - 選択の科学が教えてくれること』という興味深い記事が掲載されていました。

文化や世代によって「選択」に対する考え方が違う、ということが紹介されています。例えば米国人の著者は「自分の信念に基づき選択することが当たり前」だと考えていたのですが、日本に留学した際「(間違った飲み方だと知りつつ)緑茶に砂糖を入れて飲みたい」という選択を阻止されたそうです。

選択に対する双方の根本的な考え方の違いです。米国人の考え方では、お客さんが好みに基づいた分別ある要求をする限り、叶えてもらう権利があります。バーガーキング曰く、「自己流で召し上がれ。」スタバ曰く、「幸せは選択肢にある。」でも、日本人の考えでは、無知な人を護るのは、我らの務め。

 

また、文化によってはあまりに多い選択肢を嫌っているという話や、

選択肢があることが幸福に繋がっていない例も紹介されています。

機械学習やレコメンド、もっと広くデータ解析の手法、あるいは「何かしらのメディアとして紹介することそのもの」が、ユーザーや自国の文化にとってどういう意味を持つのかなどと考えてみるのも意味のあることだと思います。

例えば、音楽メディアはある意味「このバンド群を聞いていれば間違いないよ」というレコメンドだと思いますが、自分の周りの音楽おたくはよくわからない国の音楽(=選択肢)を探し続けること自体に喜びを感じており、そういうメディアに頼りたがらない人が多い気がします。

 

今回紹介した記事は、この本の著者が2010年に行った講演が基になっているそうです。

選択の科学

選択の科学

 

 

【機械学習】NAVERまとめが趣味なのでディープラーニングについてまとめてみた

NAVER まとめという、他人のコンテンツを引用しまくってアクセス数を荒稼ぎするサイトに「ディープラーニングってどんなの?」みたいな記事をあげてみました。

GoogleやFacebookが注目するディープラーニング(深層学習)についてまとめてみた - NAVER まとめ

 

まとめにも書いてある通り、変な点があればTwitter(@takeshi0406)に教えていただくか、まとめ作成に参加していただけると嬉しいです。

 

機械学習の研究や応用って、多くの人に注目されている割に、エンジニアや研究者以外にわかる説明があまりない気がします。というわけで、フツーの人が見るサイトに記事をおいてみたらどうなるか試してみます。

その割に、いきなりニューラルネットワークについて何の説明もなく書いてしまい、多分エンジニアが見たらショボショボで、フツーの人が見たらわけがわからない、ビミョーな感じになってしまった気もしますが…。

内容は、何で注目されてるのかとか、AlchemyVisionのAPIとか貼ってみました。「理論的に詳しいことは(自分も分かってないので)こことかこことか見ろ!」って感じでボカしてあります。

 

また、NAVERまとめに元々あったディープラーニングの記事がけっこうショボかったというのもあります。

ディープ・ラーニング - NAVER まとめ

ディープラーニングを使った画像認識がすごい! - NAVER まとめ

 

余談ですが、NAVERまとめはスマホやPCのマルチデバイスに対応し、意外に検索順位も高く、うまく使えば普段接点のない人に情報を広めることのできるメディアだと思います。

上のまとめは、「電波ソング」というワードに「+カラオケ」で検索する人が多かったので、その流入キーワードをごっそりいただくために作りました。現在累計で170000 viewいってるので、それなりにうまくいってるといえそうです。

個人ブログだと(いつも読んでくれる人はともかく)よっぽどのブロガーじゃない限り、PV数はそれほど伸びない気がします。もちろんPV数だけじゃないですけど。

【ディープラーニング】AlchemyVisionの画像タグ付けAPIで動物画像をひたすらタグ付けするbotを作りました

タイトルの【ディープラーニング】はちょっと釣りくさいですが;

 

AlchemyVisionという、画像解析やテキスト解析にDeep Learningを利用できるAPIが話題になっています。

AlchemyAPIは米国のコロラド州デンバー発の人工知能系の技術を応用した自然言語処理や文書解析のサービスを、主に法人向けに展開している企業です。設立自体は2005年とすでに9年ほど経っていますが、シリーズAのファンドを受けたのは2013年になってからですし、名前を目にするようになったのは最近になってからです。

 

実際にいろいろな写真をデモに入れて試してみました。特に動物は精度が良く、犬の場合犬種("shiba"など)までタグ付けできるみたいです。一方、学習データに写真が多いのか、アニメのキャラやイラストは殆どタグ付けできませんでした。

 

そして、そのままAlchemyAPIを利用したtwitterbotも作ってみました。twitterを動物関連のワード検索して、画像のあるツイートを抽出、タグ付けしてツイートします。

AlchemyAnimals (AlcAnimals) on Twitter

アルパカは"cat"と"dog"の両方でタグ付けされました。"alpaca"ってタグは用意されていないみたいです。

 

一応コードも載せておきます。AlchemyAPIのPythonモジュールが公式で用意されていますが、使い方がよくわからなかったのでそのままAPIのURLを叩きました。python-twitterの使い方は下の記事を参考にしました。

python-twitterの使い方(1) - 忘れないようにメモっとく

#!/usr/bin/python
#coding:utf-8

import urllib
import json
import twitter
import secret
import random

api = twitter.Api(
    consumer_key = secret.twDict['consumer_key'],
    consumer_secret = secret.twDict['consumer_secret'],
    access_token_key = secret.twDict['access_token_key'],
    access_token_secret = secret.twDict['access_token_secret']
)

alchemykey = "**************" #APIKEYの取得が必要
keywords = [u"animal",u"dog",u"cat",u"animals",u"zoo",
                u"dogs",u"fish",u"bird",u"monkey",u"sheep",u"space+cats",
                u"wildlife",u"猫",u"alpaca",u"pet",u"animal+crazy",
                u"animal+cute",u"rare+animal",u"mountain+animal",u"national+geographic+animal",
                u"aquarium+animal",u"animal+africa",u"species+asia",u"species africa",u"desert+animal"]
random.shuffle(keywords)
keyword = keywords[0]

search = api.GetSearch(keyword,count=100)
random.shuffle(search)
for tw in search:
    if len(tw.media) == 0:
        print "no picture"
    else:
        url = tw.media[0]["url"]
        media_url = tw.media[0]["media_url"]
        break

endpoint = "http://access.alchemyapi.com/calls/url/URLGetRankedImageKeywords?apikey="
access_url = endpoint + alchemykey + "&url=" + media_url + "&outputMode=" + "json"

endpoint = "http://access.alchemyapi.com/calls/url/URLGetImage"

f = urllib.urlopen(access_url)
api_open = f.read()
f.close()
print api_open

api_open = json.loads(api_open)
tags = api_open["imageKeywords"]
tweet = ""
for tag in tags:
    print tag["text"], tag["score"]
    tweet = tweet + tag["text"] + ": " + tag["score"] + """
    """ #なぜか¥nで改行するとエラー

api.PostUpdate(tweet + url)