Enjoy Data Mining!

データマイニング手法やデータマイニングツールの使用法などの備忘録

CSVデータの読み込みと書き出し

WekaをMicrosoft Excelなどの表計算ソフトと連携するとき,ファイル形式の不一致が問題になることがあります.
少しずつですが,Wekaで扱えるファイル形式も増えてきていますが,現在のところExcelなどの商用ソフトの独自形式は直接読み込めません.
この場合,CSV(Comma Sepalated Values)ファイルを用いるのが一般的ですので,その方法を紹介します.

準備

以下,用いる記号の意味を列挙します.

  • $…コマンドラインの始まり
  • …weka.jarまでのパス
  • CSVファイル名とファイルまでのパス
  • …出力とするArff形式のファイル

また,コマンドライン(シェル)からJVMであるjavaが起動することを確認してください.

Weka3.6以上では,SunのJava1.5以上が必要です.以下のように確認してみてください.

$ java -version

CSVファイル→Arffファイルへの変換

CSVファイルからArffファイルへの変換はweka.core.converters.CSVLoaderクラスを用います.
同じパッケージには,WekaのGUIで読み込めるファイル形式のローダーとArffを任意の形式で保存するセーバー(*Saver)の各クラスが用意されています.


このパッケージのクラスは共通で,第一引数にファイル名を必要とし,変換後のファイルは標準出力に出力されます.
そのため,コマンドラインから用いる場合は,リダイレクションを用いて出力ファイルの保存を行います.
コマンドラインでの実行は以下のようになります.

$ java -cp <weka.jar> weka.core.converters.CSVLoader <input.csv> > <output.arff>

Arffファイルの属性情報の調整

CSVファイルを単純にArffファイルに変換しただけでは,特に半角数字だけで表された名義属性(質的な変数)がnumeric(数値属性)として扱われてしまいます.
Arffファイルは,プレーンテキストのファイルなので,テキストエディタやWordで変更が可能です.

しかし,名義属性の値の数がとても多い場合,あるいは全て全自動でスクリプトとした処理に手作業を挟むことは困難です.
そこで,数値属性をweka.filters.unsupervised.attribute.NumericToNominalフィルタを用いて,名義属性に変換します.
このとき,-Rオプションで変換を行う属性番号*1,あるいは属性番号の範囲(1を'first',最後の属性番号を'last'とすることも可能)を指定します.

例えば,属性番号2の属性が数値属性となっている場合は,以下のように指定します.

  • …変換前のArffファイル(上の
  • …変換後のArffファイル
$ java -cp <weka.jar> weka.filters.unsupervised.attribute.NumericToNominal\
 -R 2 -i <input.arff> -o <output2.arff>

複数の属性を変換する必要がある場合は,-Rの値としてカンマ区切りで属性番号(あるいは'-'の前後で属性番号を指定した範囲)を指定します.
例えば,属性番号”2”と”4から7”の場合は,2,4-7が-Rの引数となります.
または,とすることで,逐次変換を行うことも可能です.

全ての属性を範囲として場合は,以下のコマンドです.

$ java -cp <weka.jar> weka.filters.unsupervised.attribute.NumericToNominal\
 -R first-last -i <input.arff> -o <output2.arff>

ただし,全ての変換がうまくいったかどうかは,コマンドの実行主体(ユーザやスクリプト)で判断する必要があります.
また,入力ファイルの状態によって数値属性になってしまうCSVファイルでの変数(列)も生じますので,スクリプト化の際は十分なテストを行う必要があります.

*1:属性番号は1からとなります.