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で分類させるとエラーは出ず 同じデータ形式なのになぜ

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS