人工知能してみる

人工知能の中の人が機械学習とか統計とかAI的なことを書き連ねます

Go言語でMeCabを使う

こんにちは。 機械学習系はPythonにライブラリが偏っていることもあり圧倒的にPython一択ではあるのですが処理が遅いのが問題です。 Cythonって手もありますがビジネスで使うってなるとRubyとかGoで使えた方がいいよなーと思ってます。 そこでGoの勉強も兼ねて自然言語処理の基本MeCab分かち書きをしてみました。 結構苦労したので書いておきます。

使ったラッパー

Goで使えるMeCabのラッパーはいくつかあるのですが一番簡単に動かせたのが下記のレポジトリのラッパーです。 github.com

インストール

使い方はGitHubのREADMEに書いてあるとおりなのですが、事前にMeCabが入っていれば下記で終わりです。

$ export CGO_LDFLAGS="`mecab-config --libs`"
$ export CGO_CFLAGS="-I`mecab-config --inc-dir`"
$ go get github.com/bluele/mecab-golang

使い方

READMEそのままだと面白くないのでちょいと関数を小分けにしました。 あとNEologdをインストールしてあるので、それも使ってみました。

package main

import (
    "C"
    "strings"
    "github.com/bluele/mecab-golang"
    "fmt"
)

func main(){
    text := "NEologdが入っているのでDMM.comがディーエムエムドットコムって読めます"
    m := generateMeCab()
    defer m.Destroy()
    node := parseToNode(text, m)
    extractSurface(node)
}


func generateMeCab() *mecab.MeCab {
    m, err := mecab.New("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
    if err != nil {
        panic(err)
    }
    return m
}

func parseToNode(text string, m *mecab.MeCab) *mecab.Node {
    tg, err := m.NewTagger()
    if err != nil {
        panic(err)
    }
    lt, err := m.NewLattice(text)
    if err != nil {
        panic(err)
    }
    node := tg.ParseToNode(lt)
    return node
}

func extractSurface(node *mecab.Node){
    for {
        features := strings.Split(node.Feature(), ",")
        if features[0] == "名詞" {
            fmt.Println(fmt.Sprintf("%s %s", node.Surface(), node.Feature()))
        }
        if node.Next() != nil {
            break
        }
    }
}

結果は↓

NEologd 名詞,固有名詞,一般,*,*,*,NEologd,ネオログディー,ネオログディー
DMM.com 名詞,固有名詞,一般,*,*,*,DMM.com,ディーエムエムドットコム,ディーエムエムドットコム
ディーエムエムドットコム 名詞,固有名詞,一般,*,*,*,DMM.com,ディーエムエムドットコム,ディーエムエムドットコム

感想

始めてGo書いたんですが中々仕様に慣れなくて苦労しました。特に型はPythonだと意識しないので大変でしたね。でも型があるとエラーがスグ分かって良いです。
Pythonのゆるさもいいですが、ちゃんと開発するならGoのシッカリした感じはとても良さそうです。 サーバーサイドなんかはGoの方が楽だと思うのでGoでも機械学習できるパッケージ出てほしい。

メルカリがKaggleでコンペ始めたみたい

こんにちはGrahamianです。

昨日からメルカリがKaggleで機械学習コンペティションを始めたみたいです。
mercan.mercari.com

テーマ課題は Mercari SuggestPrice ということでメルカリのプライシング(価格査定)です。
データを見ると説明文、タグ、ブランド、商品状態なんかが説明変数にありました。
自然言語処理も必要で結構難易度高く楽しみがいがありそうです。

いままで謎に包まれていたメルカリのデータが見られるのはとてもたのしいですね。
世界中のデータサイエンティストが挑戦していると思いますが、私も挑戦してみようと思います。

SCAN: 視覚概念による抽象的な階層構成の学習

こんにちは、Grahamianです。
先日発表されたDeep Mindの論文がなかなかに衝撃的なのでザックリと紹介を書いてみます。
深く読めていないので誤りがあったら指摘願います。

SCAN: Learning Abstract Hierarchical Compositional Visual Concepts
deepmind.com

概要

Deep Mindが新しいニューラルネットワークコンポーネント SCAN(Symbol-Concept Association Network)を発表した。
SCANは人間の視覚と単語の獲得を模倣したモデルである。
これにより視覚と単語の概念を結びつけ、それらを階層化して学ぶことができる。
かつてのモデルに比べて少量の学習データから学習することが可能。
そして経験したことの無い概念でも、その概念に対応する視覚例を想像することができる。

新規性

少量の画像と単語の組み合わせから学習できる
概念を階層化し経験の無い概念でも視覚例を想像させることができる

やってることは?

壁、床、オブジェクトのの3つが存在する画像とそれを見るカメラが存在する。
この画像は色や回転などで変化が生じる。
f:id:Grahamian:20170716212247g:plain
これは赤ちゃんの視覚を単純化したものである。
この画像に対して言語入力を行う。
"red suitcase, yellow wall"
このような入力を繰り返すことでSCANは次第に"red", "suitcase", "yellow", "wall" の概念を覚えていく。

これを利用して"AND", "IS", "IN COMMON"のような論理演算子を覚えさせることもできる。
例えば"golden delicious"(黄色いリンゴのこと)のイメージと"golden delicious IS yellow AND apple"という言語入力と画像を与える。

このようにして学んだ単語概念をもとに似た概念を結合したりして新しい概念を作るように指示することができる。
これによって経験したことの無い概念でも視覚例を想像させることができる。
たとえば、青いりんごは"blue AND apple"、Granny Smith(青りんご)は"granny smith IS golden delicious IGNORE yellow, AND green"といった具合だ。

何が嬉しいの?

既存の概念を再構築することで新しい概念を学ぶことができる。
これはまさに人間の学習方法である。
人間のように教師なしで様々な物事を学ぶアルゴリズム開発の大きな一歩といえる。

いやーDeep Mindの進化は凄まじいですね。
世界の技術力に対して2歩は先を行っていると言っても過言ではないですね。
さらなる進化に注目です。

予測精度はKPI足り得るのか?

こんにちはGrahamianです。
今日は予測精度について話します。

プロダクト開発においてKPIの設計は非常に重要です。
最近のWEBプロダクト開発ではKPI設計が成否を分けているといっても過言ではありません。
しかし機械学習を用いるとKPIの設定が非常に難しくなります。

例えば...

レコメンドエンジンや工業的なものは評価が簡単ですね。
これはアウトプットがCTPや不良率など分かりやすい数字として現れるからです。
もちろん、これらも実際に機械学習がどのように影響を与えているのか評価する必要がありますが影響は割りと直接的です。

しかし、実際のwebプロダクトなどでは評価するのが難しくKPIの設定が難しいです。
プロダクト中の何かの精度が10%上がったとしてプロダクトとして性能がどのくらい上がったと言えるのでしょうか?
10%の上昇がユーザー体験をどれほど向上させるのかは評価が非常に難しいです。
コホート分析や利用率などである程度分析できますが、影響が直接的でないため評価しにくいといえるでしょう。

つまり...

KPI設定が難しいことはROI評価が難しいことにつながります。
導入することはエイヤっとやってしまってもよいのですが、そこからイテレーションするにあたってどのくらい投資すれば良いのかが難しいです。
80%から90%に上げてどのくらいリターンがあるのか。
これは重要な要素ですがその評価が困難です。
「作りっぱなしではなく精度向上したい、でも機能の追加にリソースを割きたい」
そんな悩みを抱えてる企業は多いのではないでしょうか?

解決策は?

確実な判断方法はありません。
プロダクトのステータスによっても変わるでしょうし、リソースにもよると思います。
それがコア技術であるなら精度をあげる重要度が変わるかもしれないし、重要でも精度向上がUXに大きな影響を与えないかもしれません。
もしかしたら10%では全然変わらないけど20%あげたら革命的に変化するかもしれません。
ここらへんは確実なやり方が無い領域だと思います。
個人的には新機能をバンバン開発したいのですけどね(笑)

なぜ機械学習を使ったプロジェクトは失敗するのか

おはようございます。Grahamianです。
世間では猫も杓子も機械学習ですね。
あちこちで機械学習を使ったhogehogeが出ていますが成果はパッとしない印象を受けます。
それは何故なのかを考えたので書いてみます。

機械学習は得意不得意がある

機械学習はなんでも出来るわけじゃなくて得意分野があります。
というか機械学習って基本は線形分類器なので"分ける”は得意ですが何かを生み出すのは苦手です。
ここ数年はGANが流行っているのでそこらへんも進んでいますが技術的に高度ですね。
なので機械学習が得意な分野に沿って課題設定する必要があります。
この切り口をミスると解けなくて微妙な結果に終わります。

価値あるサービスを提供する意識がない

技術ファーストでサービスを作るとこうなります。
サービスは価値を届けるところが第一で、そのソリューションとして機械学習を使うのが正しい順番なはずです。
しかし世間では逆に「機械学習を使ってなにかやる」でスタートしているプロジェクトが多いように見えます。
顧客の何を解決するのかちゃんと考え抜く姿勢が必要です。
「エンジニアだから知ったこっちゃない」って姿勢が通用したのは昔の話で今は機械学習コモディティ化しているのでそんなんでは置いて行かれます。
技術を使って課題を解決する、これを技術側から考えることができるのがエンジニアの特権のはずです。
逆に企画側も「技術はわからんけどAIって付けたら売れるんだろ」みたいな姿勢もダメですね。
企画側もなるべく技術へ読み取る姿勢をもちましょう。

エンジニアとビジネスをつなぐ人材がいない

実はこれが一番重要なのかもしれないと最近感じています。
エンジニア側はビジネスが不明瞭、ビジネス側は技術が不明瞭。
この2種類の人間がそろっても間に大きな溝があるのが現状です。
機械学習で出来ることは今までの技術とくらべて違う発想が必要なため両方を理解する歩み寄ることが必要になっています。
機械学習だからこそできるビジネスを考えるためにはこの間を取り持つ誰かが必要です。
いわば人工知能プロダクトマネージャーが必要なのですが、しかしその人材は非常に少ないです。
機械学習を使ってプロダクトを作ったことのある人間が少ないので知見も足りていないからです。
この部分を担える人材は今後は価値が上がりそうですね。

まとめ

機械学習だからってなんでもかんでも上手くいくわけではありません。
銀の弾丸ではないということを肝に命じてちゃんとサービスを考えることが重要です。
そしてエンジニアとビジネス側がお互いに議論を尽くして考えることが大事だと感じています。
とはいえ、簡単なことではないのでアウトプットと改善を繰り返していくしか無いのかな、とも思います。
まだまだ機械学習の活用は始まったばかりなので失敗を重ねていきましょう!

Azure Machine Learningを使ってみたら思ったよりよかった

Grahamianです。 タイトルどおりです。

数年前からクラウド機械学習サービスがでてきていましたが、そのときは全然興味ありませんでした。
データサイエンスって前処理が面倒なんで機械学習だけクラウドで出来てもなーって感じ。
とか思っていたんですが、つい先日、ちょっとクラウド機械学習を調べてた思ったより良かった…舐めてた…
azure.microsoft.com

Summary

GoogleとかAmazonも触ったけどデータサイエンスという文脈なら、圧倒的にAzure最強でした。

どこが?

Azureのよいところはプログラミングできなくても大体の処理ができてしまうところ。
PythonとかRはプログラミング初心者でもわりと書きやすいのですが、それでも細かいところでハマります。
環境構築とか、ちょっとした記法のミスとか。
そこらへんがGUI上でサクサク作れてしまうのはいいですね。
やっぱりプログラマー以外にはCUIって結構ツライです。
Azureならブロックをつなげていくだけで基本的な処理ができてしまうので簡単。

分析の結果もVisualizationしてくれ分かりやすいです。
自動でいい感じにROC曲線とか決定木を書いてくれるのが最高。
前処理が面倒って話に隠れちゃいますが、実はこの後処理ってのも結構面倒です。
Azureなら自動でカッコいい絵にしてくれるので、このままレポート作れますね。
便利。最高。

とは言え、簡単な処理は出来るけど凝った処理になると途端に面倒になるサービスって多いんですよね。
おもちゃ的なサービスは取っ掛かりとしてはいいけど、やっぱり業務には使えなかったりして。
Azureはそこも考えられていてSQLPython、Rを書いて処理に使えるようです。
これが非常に便利そう。
内部にAnacondaを持ってるらしくて大体のことができる様子。
細かいとこはコード書けば処理できるし、基本はGUIで処理できる。
コードはブロック化できるので可読性高くできる点は非常に良いです。

GoogleとかAmazonは?

Google機械学習のリソースとして使う仮想マシンって感じです。
データサイエンスの文脈では使いにくいです。
機械学習をガッツリやるエンジニア向けですね。
Deep Learningとかガリガリやるならいいかも。

AmazonはAzureと同じで基本的な分析ができます。
AWSと連携できるので便利。
ウィザード形式で進み、予測したいデータの属性で勝手に分類器を選んでくれます。
ただ、これが非常に使いにくかったです。
慣れたら違うかもしれないけど自由度も低そうだし要らないかな?

ってことで

Azure Machine Learningはいいぞ。

pandasでiterrowsしようとしてハマった話

お早うございます。grahamianです。
タイトルどおりです。

DBからデータを取ってきてpandasのdataframeに入れてrowごとに処理するってことをやろうとしてました。
よくある処理だと思います。
で、最初は何も考えないで

for row in df:
   foo = bar(row['data'])

ってやろうとしたら動かないんですね。
ちょっと考えたら当たり前で、pandasは行列を扱っているので行か列を明示的に書いてやる必要があります。
そのために、iterrowsとiteritemsってメソッドがあります。
それぞれ行、列にイテレートするメソッドです。

それを調べた私は次のように書ききました

for row in df.iterrows():

で、とりあえずfooの中身を見るとrowが入ってるから「ヨシ」と思って作業をしてました。
しかし、どうも動作がおかしい。
なのでいろんなサイトを見ていて気がついたのが、同時にindexもfor文で回しているのです

for i, row in df.iterrows():

こうすることで思ったとおりに行の中身だけ取り出すことができました。
思わぬところでハマったのでメモ程度にここに書いておきます。
pandasはヘンなとこでハマるのでちゃんと勉強しないといけないなーと感じた事件でした。