機械学習といえばPythonな世の中.
scikit−learnみたいに,多くのアルゴリズムがすでに実装されていて,使うのも楽です.
自分でアルゴリズムを実装したければ,numpyなどの高速な数値計算ライブラリを使うこともできます.
そう,アルゴリズム部分はPythonでも十分.
しかし,前処理後処理部分は遅いと思います.
こういう部分は他のコンパイル言語に任せた方がいいような気がします.
でも,前処理後処理だけ他の言語で,機械学習部分はPythonみたいになんかごちゃごちゃしてしまう問題もあります.
今回は,一つの選択肢としてJavaで機械学習をしてみます.
Javaの機械学習系ライブラリはいくつかありますが,今回は有名なWekaを使ってみます.
本当に日本語の「使ってみた」と言うページが少なくて驚きました.
というわけで,この記事が少しでも役に立てば幸いです.
今回扱うのは分類問題で,交差検定でパラメータを決めることもします.
まず,WekaではInstancesを作成する必要があります.
これは,データセットに対応するもので,Instanceのリストみたいなものです.
これをうまく作る方法を模索したのですが,あまり良い方法は思いつきませんでした.
というのも,Instancesを作る際に,次元数などを事前に決めてやる必要があるのです.
言語処理などでは,データを読み込んでいく過程で,次元数が徐々に膨れ上がってくるものですが,こういうのが表現できません.
なので,最初はRaw dataとして,MapなりListなりで生のデータを保存していきます.
data.csvからRaw dataを生成するには,例えば以下のようになります.
ラベルはStringしか対応していないようです(多分).
こんな感じで,scikit-learnを使うときみたいに,Xとyを生成したら,以下の関数にこれを渡してInstancesを得ます.
さて,これでInstancesができました.
あとはこれを学習アルゴリズムに渡して学習させます.
今回はweka.classifiers.functions.SGDを使います.ただ,これだけだとマルチクラスに対応できないので,weka.classifiers.meta.MultiClassClassifierで包みます.
交差検定でパラメータを調整して,最終的なモデルを作ります.この際,numpy.linspace, numpy.logspaceなどのメソッドがあると便利なので,以下のように自前実装します.
これで準備は整ったので,以下のように交差検定によるパラメータ調整を実装します.
今回調整するのは,正則化パラメータのみです.
これで学習は完了です.
次に予測ですが,適当なinstanceを作って,以下のようにすればラベルと確率値を得ることができます.
もし,このモデルを保存したければ,weka.core.SerializationHelperを使って以下のようにするといいです.
また,バイナリ化してデータベースに保存することもできます.
MultiClassClassifierの所は適宜指定してください.
基本的な使い方は以上になります.
Wekaを使えば意外と簡単にJavaで機械学習ができることがわかりました.