Scala

[scala][advent]Scalaは機械学習に使えるかな? #scalaadvent2011

これはScala Advent Calendar jp 2011の20日目の記事です.今日は12月20日,企画も終盤.ここではScalaと機械学習について書きます.機械学習をあまり知らない人たちのために,そちらの解説も入れておきました.

機械学習について簡単に

詳しい説明は朱鷺の杜に譲るとして,簡単に言うと,私たち人が普通に行なっている「学習」というものを情報屋さん的に扱った学問領域のことです.「情報の中から,有益そうな知識を獲得していく過程」をコンピュータで実現させることを目指してます.実際には,数値・文字・画像・音声などのデータの中から,規則性とか知識とかを発見して役に立てよう〜としています.

こういう領域でデータを扱うには,データをベクトルにして行列とか使ってどうたら…ってやるわけです.なぜかというと,数値はもちろん,画像とか音声というのは全部コンピュータの中ではベクトルで書けてしまうからです.ですので機械学習の処理をどうにかしようと思うと,線形代数のライブラリがあれば,最悪なんとかなるということになります.ですがこの記事ではScalaにおける線形代数のライブラリについては全然調べませんでした,ごめんなさい.この記事の最後に少しだけ補足しました.

個人的にScala+機械学習に期待したいこと

機械学習の話でこっちのデータ使って学習(ここの学習はプログラムを調整する,ぐらいの意味です)して,こっちのデータ使ってテストしてみようってことをやります.このとき,ある集合S=\{data_1,data_2,\dots\}に対して1つずつ○○をして…って計算したり,処理したりするので,こういう処理って地味にfilter/foldLeft/Mapあたりと相性がいいと僕は勝手に思っています.またある集合Sを分割して処理するので,並列処理なんかも相性がいい場合が多いです.

6日目の id: j5ik2o さんのパラレルコレクションの性能測定 – じゅんいち☆かとうの技術日誌 のように,新しめのScalaではパラレルコレクションが使えるってこともありますし,Actorなどもありますので,純粋に最近良く使われているPython+numpy/scipy+matplotlib+scikits.learnみたいなセットよりも高速な処理系が書けるのでは,と期待してます.

またPythonと比べると,型の情報が使えるのは大きいですね.計算の途中でこの途中式はベクトルだから…とか行列だから…とかちゃんと分かりますし(笑)

使ってる環境,ライブラリなど一覧

深い線形代数の知識を使わずに,機械学習で遊ぶにはJavaさんの力を借りるのがいいですね(偏見).Java界隈にはWekaという機械学習/データマイニングの機能をたくさーん実装してまとめてライブラリにしちゃったよ(´∀`)ってライブラリ(本当はGUIツールですが…)があります.せっかくなのでそれを借りてきましょう.

Weka 3 – Data Mining with Open Source Machine Learning Software in Java
Wekaの日本語情報@weka-jp.info

公式サイトからweka-3.6.6.zipをダウンロードしてきて,中に入ってるはずのweka.jarを作業ディレクトリのlibとかに置いておきます.sbtで管理出来るならどこでもいいです.僕はこんな感じでやってます.zipを解凍したらdataってディレクトリもあるので,一緒にコピーしておきます.遊ぶため.

~/ (作業ディレクトリのルート) 
 ├ target - sbtに管理してもらう
 ├ lib - weka.jar
 ├ data - wekaのdataファイル(.arff)を置いた
 └ Main.scala - 今回遊んでたソースファイル(笑)

遊んでみたこと

weka.jarとweka用のデータファイルである.arffファイルの詰め合わせ,dataディレクトリをコピーしてきたので,普通にJavaからwekaを使うように遊べるはずです.実際に遊んでみます.

import weka.associations._
import weka.core._
import java.io._

object Main extends App{

  override def main(args: Array[String]){

    // Arffファイルを読んで扱える形にする                                                                                
    val reader = new FileReader("data/supermarket.arff")
    val instances = new Instances(reader)

    // 相関ルール発見の初期設定                                                                                          
    val apriori = new Apriori()
    apriori.setDelta(0.1)
    apriori.setNumRules(20)

    // 発見                                                                                                              
    apriori.buildAssociations(instances)
    println(apriori)
  }
}

出力結果
Best rules found:

 1. biscuits=t frozen foods=t party snack foods=t fruit=t vegetables=t total=high 510 ==> bread and cake=t 478    conf:(0.94)
 2. biscuits=t frozen foods=t cheese=t fruit=t total=high 495 ==> bread and cake=t 463    conf:(0.94)
 3. biscuits=t cheese=t fruit=t vegetables=t total=high 513 ==> bread and cake=t 479    conf:(0.93)
 4. baking needs=t biscuits=t party snack foods=t fruit=t total=high 557 ==> bread and cake=t 520    conf:(0.93)
 5. baking needs=t cheese=t fruit=t vegetables=t total=high 519 ==> bread and cake=t 483    conf:(0.93)

もっとたくさん出力されます.上のソースで試しているのは相関ルール分析というデータマイニングの手法です.そんなに難しい手法でもないのでネット上の解説記事を読めばよく分かるのですが,購買履歴が収まったテーブルが与えられたとき,どんな商品の組がよく買われているとか,どんな購買の癖が現れるかを発見する手法です.

例えば上の出力結果の1番を見てみると「ビスケットとフローズンフード(って何だ?)と,パーティースナック菓子とフルーツと野菜を買ってトータルがhigh(なんだこれ)なとき(条件),パンとケーキも買う(矢印の右側)」っていう謎のルールになっていて(これを相関ルールと呼ぶ),その信頼度は0.94ぐらいだよ〜と言ってます.

もう少し詳しい説明はここにありました.
アソシエーション分析 - @IT情報マネジメント用語事典

もう少しだけ

さすがにこれだけだとタイトルに対して釣りになっているような気がしてきたので,もう少しだけ書こうと思います.上ではJavaのライブラリWekaを使っています.せっかくなのでJavaのライブラリ的な話をもう少し,あとScalaオンリーの話も少しだけやります.

まずJavaの話ですが,Wekaは速度はよく知らないですが,GUIとしてもギリギリ普通に使える設計になっていると僕は思っています.なんだかんだで機械学習のある程度確立されているようなアルゴリズムはたぶん全部実装されています.ですので,ちょっと機械学習の手法を使いたいという場面で問題になることはあんまりないのでは…と思ってます(だからあまりScalaネイティブを真面目に調べなかった).また同じくJava関係ではMahoutと呼ばれるパッケージ(パッケージ群?)があります.このあたりもScalaから使えると過ごそうだな…と.おそらく使えます.いやぁ,Scalaは幸せだなぁ.コードが書きやすいし短めだしライブラリも豊かだなぁ(この際,ネイティブかどうかは捨てる)

Apache Mahout: Scalable machine learning and data mining
Apache Mahout の紹介
機械学習/MacでMahoutを使う – とうごろうぃき

Scalaオンリーだと,一応Scalaで書かれている機械学習ライブラリがあります.あまり多くのアルゴリズムは準備されていないようですが….今回は試していないのであまりわかりません.内部ではscalalaという線形代数ライブラリを使ってます.
scala-recog – A machine learning library in Scala – Google Project Hosting

そういえばPythonには集合知プログラミングという悪名高い本(機械学習関係)があるのですが,それをScalaで書いちゃう〜ってのをやっている方も見つけました.こう見るとScalaも全然イケますね!(お前は何を言っているんだ)
Scalaで集合知プログラミング まとめ – Reinvention of the Wheel

集合知プログラミング
Toby Segaran
オライリージャパン
売り上げランキング: 97234

おわりに

本当はもう少し準備して書くつもりもあったのですが,直前に体調を崩してしまったので残念な感じになりました.もう少しScalaネイティブの環境が整ってきてもいいかなぁーというか,あると思ったのですが,いざ調べてみるとあまり見当たらなかったですね.残念…(´・ω・`)

機械学習について知ってみたい方は,以前僕が書いた記事もあります.(宣伝)
[まとめ] 機械学習/データマイニングに興味がある人が読むといいかも?な本をまとめた

なんだかんだで長文になりましたね.申し訳ないです.

オマケ: Scalaで線形代数ライブラリ?

真面目に線形代数を使っていろんなことがやりたい場合は,真面目にライブラリを探すか,Javaの数値計算用ライブラリを借りてくることになると思います.Scalaの話を言うと,一応scalalaというライブラリはありました.tensorが実装されているようなので,注目ですね.

scalala – Scala Linear Algebra library – Google Project Hosting
scalala/Scalala – GitHub

要注目と思います.一応Python系よりも高速になる可能性があると僕は思っているので,注目したいです.ベンチマークとかもすればよかったかしらね.Tensorの処理系が用意されているのは珍しいと思いました.実際にgit cloneしてきて使ってみると,僕の手元のscala 2.9.1+sbt 0.11ですごく長い時間コンパイルしてJavaのheap errorが出ました.設定が悪いな….

本当におしまい.せっかくWekaのことを書いたので,今年中に決定木アルゴリズムについて書きます.Scala版.たぶん.今日書けなかったのは大人の事情です.ごめんなさい.

決定木 – Wikipedia

[scala][advent]Scalaは機械学習に使えるかな? #scalaadvent2011” への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です