memorandums

日々の作業ログです。

macでC5.0を使う

といっても普通にビルドして使えるので特に情報はありません。とりあえずメモです。


■経緯

卒業研究の関係で以下の文献を読んでいました。タイトルの通りでプログラムの表層的特徴(インデントの数やカッコ前後の空白など)を機械学習してコードの分野や作者などを推定できるか?という内容でした。コードの特徴を分類するのにC4.5を使っているとのことでした。とりあえず動かしてみようと思ったのがはじまりです。

Link: 機械学習を用いたプログラムの表層的特徴による分類(PDF)


■試行

Mac(10.8)で動かしたいので検索してみました。するとドンピシャなエントリーがありました。

Link: MacでC4.5を使う

このエントリーにしたがってやってみたのですがビルドがダメ。とりあえずccをgccにして、上記エントリーにしたがって2箇所(defns.iとaverage.c)をなおすとビルドが成功しました。golfのデータをいれてc4.5 -f golfとしたものの決定木が出力されません。少し追ってみたのですがなかなか難しい。

で、とりあえず研究室のLinuxマシンでビルドしてみたところ全く問題なく動作しました。とりあえずこれでいいか。。。と思ったのですが、開発者のページにはC5.0がありました


■結果

とりあえずC5.0をダウンロードしてmakeするとファイルを修正することなくビルドに成功しました。golfのサンプルを動かしてみましたがC4.5と同じ結果が出ました。

C4.5やC5.0をよくご存知の方にはどうでもいい情報だと思いますが、とりあえず私と同じように使ったことがない人向けに以下、使い方を書きますね。検索するとヒットする情報ばかりですが。

  • C5.0をダウンロードします。
  • ダウンロードしたC50.tgzをダブクリして展開します。
  • ターミナルを開いてC50の中に入り「make all」と入力します。以上でビルドが完成です。コンパイルしたC5.0などを/usr/local/binなどに移せばどこからでも使えるようになります。とりあえずこのままとして。
  • データを準備します。ゴルフをプレイするかどうかを天気、気温、湿度、風で判断する決定木を訓練データで作ろうというものです。(※こちらからコピしています)
  • C5.0と同じディレクトリにgolf.names(クラス、属性、値の定義)というテキストファイルを作成します。この中に以下をコピペします。
Play, Don't Play.

outlook: sunny, overcast, rain.
temperature: continuous.
humidity: continuous.
windy: true, false.
  • 上記と同じ要領でgolf.data(訓練データ)というテキストファイルを作成します。
sunny, 85, 85, false, Don't Play
sunny, 80, 90, true, Don't Play
overcast, 83, 78, false, Play
rain, 70, 96, false, Play
rain, 68, 80, false, Play
rain, 65, 70, true, Don't Play
overcast, 64, 65, true, Play
sunny, 72, 95, false, Don't Play
sunny, 69, 70, false, Play
rain, 75, 80, false, Play
sunny, 75, 70, true, Play
overcast, 72, 90, true, Play
overcast, 81, 75, false, Play
rain, 71, 80, true, Don't Play

実行結果は以下でした。この情報の見方はこちらに丁寧に書かれています。

(略)
Decision tree:

outlook = overcast: Play (4)
outlook = sunny:
:...humidity <= 75: Play (2)
:   humidity > 75: Don't Play (3)
outlook = rain:
:...windy = true: Don't Play (2)
    windy = false: Play (3)
(略)

実行結果が人間にもわかりやすい。ツイッターなどライフログから情報を抜いてきてうまくいけばその人の日々の意思決定を可視化できるでしょうし、クラスタリングできないとすればその人がいかに気分屋か。。。がわかるかもしれません。

ちなみにC4.5とC5.0の違いが気になるかもしれません(私はそうでした)。とりあえずこちらのページが見つかりました。開発者の会社のページのようですので確かな情報だと思います。分類の正解率も実行速度もメモリ効率も改善されたようです。

以下、関連する情報です。参考まで。

Link: C4.5 Tutorial
Link: Data Mining Tools See5 and C5.0
Link: C5.0 Tutorial Example


■ちょっと追記

ソフトウェア工学の授業で扱っている決定表(日本語にすると。。。イメージわかないなぁ)。C5.0で決定木が作れるか試してみました。以下が問題文。

「映画のチケットは通常1800円です。割引券を持っていると300円引きです。レディースデーは1000円です。これらをもとに決定表を作りなさい。」

とりあえず作ってみたのが以下。

■s.names

1800, 1500, 1000.

coupon: y, n.
sex: m, f.
ladiesday: y, n.

■s.data

n, m, n, 1800
y, m, n, 1500
n, f, n, 1800
y, f, n, 1500
n, m, y, 1800
y, m, y, 1500
n, f, y, 1000
y, f, y, 1000

■実行結果

Decision tree:

coupon = y: 1500 (4/1)
coupon = n: 1800 (4/1)

Evaluation on training data (8 cases):

	    Decision Tree   
	  ----------------  
	  Size      Errors  

	     2    2(25.0%)   <<


	   (a)   (b)   (c)    <-classified as
	  ----  ----  ----
	     3                (a): class 1800
	           3          (b): class 1500
	     1     1          (c): class 1000

決定木が割引券の有無しか反映されていません。分類のエラーは25%。エントロピーで分割する基準を決定するようですが。。。