Weka

目次

Wekaとは

  • JAVA製の総合機械学習ツール
  • GUI上で(比較的)わかりやすいインタフェース
  • モチーフアイコンの鳥 (ニュージーランドクイナ = "WEKA") がかわいい
    • 学習中はこの鳥が動いて癒してくれる
  • 機械学習に便利なツールが集まっている
  • 学習データさえ用意すれば様々な機械学習を試すことができる
  • 例えば,liblinear (SVM) の学習データでC4.5 (決定木) 学習が行えたりもする

分類をしてみる

  • 「エクスプローラ」を起動
  • 「ファイルを開く」から学習データを選択
  • 「適切なローダが~」と出たら,学習データの種類を選ぶ(libSVMとか)
    • Wekaは恐らく拡張子でデータを判定しているため,LibSVMなら「*.libsvm」という拡張子でないと自動で判定してくれない
  • 「分類」タブの「分類器」→「選択」を選び,好きな学習器を選ぶ
    • 学習データによっては,すべての学習器が選択できないかもしれない
    • 筆者の見つけた例: ローダー選択画面で「SVMLight」を選ぶと「libSVM」を選んだときより多くの学習器を選べる.
      LibSVMとか,liblinearとか,TinySVMとか,SVMLightなど,基本的な学習データの書き方は同じなので大きな問題は生じない・・・はず.
  • 「テストオプション」では,ここではデフォルトの「交差検証 (Cross Validation)」を選ぶ
  • あとは「開始」を押せば学習と評価を自動的に行ってくれる
    • PrecisionやRecall,Confusion Matrixなども表示してくれる

「供給テストセット」を指定したときにうまくいかない例

  • 「データに統一性がありません」(だっけ?)といったエラーが出る
  • 解決策1: 供給テストセットと学習データを同じ形式にする
    • 筆者のよくやる方法は,2つのファイルをそれぞれ「前処理」タブで開く→そのまま「保存」で任意の形式のファイルに保存する(svmlight形式の「*.dat」とか).これで同じ形式に統一できる
  • 解決策2: 供給テストセットと学習データの素性の対応がとれていないから合わせる
    • 「前処理」タブでいらない素性を削除し保存,をテストセットと学習データの両方で行う

クラスと素性の分布を見る

  • 「あの素性値はどちらのクラスに多く分布しているんだろう?」とか
  • ファイルを開いて「ビジュアル化」タブから見られる
  • デフォルトでは変化の幅が小さすぎて見づらいので,「ポイントサイズ」「振動幅」を大きくすることをオススメする

有効な素性を厳選する (i.e., 属性選択)

  • サンプル数に対し次元数が多すぎると過学習の恐れがある
    • すなわち,少ないデータで細かすぎるパターン認識を行っているため,未知のデータに対する汎化性が失われる
    • 例) ある人の好みのタイプの女性:年齢が15才,身長が160cm, 体重が40kg,スリーサイズが上から70,58,69,黒髪,明るい性格,京都弁,得意料理はきんぴらごぼう,早起きは苦手,趣味はサッカー が半径100m以内 にいるわけはない
      これでは彼女はできない
  • そこで,あまり効果のないと思われる素性を削除することによって汎化性能を上げる
    • 好みのタイプを「黒髪で明るい性格」にすると彼女ができやすくなる
  • ファイルを開き,「属性選択」タブ
  • 「属性検証」グループ→「選択」→好きなアルゴリズムを選択
  • 「検索方法」グループ→「選択」→好きなアルゴリズムを選択
  • 検索方法にもよるが,検証したい素性IDをプルダウンから選択して「開始」

クラスのサンプリングを行う

  • 別の記事でも話題にしているが,クラスのサンプル数に大きな差があると学習に影響がある (データの不均衡)
  • その際行うべきことは以下が挙げられる
    • 少ない方のクラスを人工的に増やす
    • 多い方のクラスをランダムに減らす (アンダーサンプリング)
  • 前者については,SMOTEアルゴリズムが有名 (see http://www.slideshare.net/sfchaos/ss-11307051)
  • 後者については適当に削除しても良いが,理にかなった(?)方法で選別するSpreadSubsampleアルゴリズムもある

SMOTE

  • 執筆中

SpreadSubsample

  • ファイルを開く
  • 「前処理」タブで「フィルター」グループ→「選択」→「Weka -> filters -> supervised -> instances -> SpreadSubsample」
  • 「選択」の右のフィールド (SpreadSubsample -M 0.0…と書かれている)をクリックし「maxCount」に統一させたいサンプル数を入力
  • 「適応」ボタンを押すとアンダーサンプリングが実施される
  • さいごに「保存」ボタンで学習データを保存

LibSVMLoader と SVMLightLoader

筆者の環境では,前者とClassifierの相性が悪い

  • 例: SVM形式のデータセットをLibSVMLoaderで読み込み,ClassifierはRandomForestを選択
  • するとこんなエラー
    Cannot handle numeric class!
    • データの記述に問題があるときに出る

同様のデータセットをSVMLightLoaderで読み込み,RandomForestで分類させるとエラーは出ず 同じデータ形式なのになぜ

コマンドラインからWekaを使う

流れとしては,(a) ローダーでデータセットを読み込む (ARFFじゃない場合) (b) 学習データのモデルファイルを作成する (c) モデルファイルにもとづいて評価データの予測を行い,予測結果も出力する の3つ. 例では,SVM形式のデータセットを用いて,RandomForestで分類してみる.

ローダーでデータセットを読み込む

供給テストセットがある場合:

java -cp <weka_directory>/weka.jar weka.core.converters.SVMLightLoader train.dat > train.arff
java -cp <weka_directory>/weka.jar weka.core.converters.SVMLightLoader test.dat > test.arff

Cross Validationを行う場合: 上の方だけ行えば良い

学習データのモデルファイルを作成する

供給テストセットがある場合:

java -cp <weka_directory>/weka.jar weka.classifiers.trees.RandomForest -no-cv -t train.arff -d out.model

Cross Validationを行う場合:

java -cp <weka_directory>/weka.jar weka.classifiers.trees.RandomForest -i -k -t train.arff -d out.model
# これで10-fold CV結果が表示される

モデルファイルにもとづいて評価データの予測を行う

ポイントはWekaの3.7.x系列を用いること.stable versionとして提供されている3.6.x系列では以下のオプションは使えない.

java -cp (略) weka.classifiers.trees.RandomForest -classifications weka.classifiers.evaluation.output.prediction.PlainText -l out.model -T test.arff > result.txt
# これで result.txt に答えと予測結果が表のような形で出力される.必要に応じてConfusion Matrixオプションや,CSV/XMLなどで出力できるオプションを用いること.

参考

wekaコマンドラインからRandomForest/J48実行メモ(モデルファイル作成) - Pineport TMZ の日記 : http://d.hatena.ne.jp/mazda77/20120706/1341729386


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-07-24 (木) 04:56:52 (3556d)