情報利得(Information Gain)の計算 Javaプログラム

ネット小説に限らず,多くの文書の素性を抽出するとき,膨大かつスパースな素性空間となってしまって,機械学習の際にそのままではメモリーにのらないことがあります.

そういったとき(に限らずですが),素性選択という,分類に有効なものを上位から選択するという作業によって,分類器のコンパクト化を図ります.

素性選択の手法は結構あるみたいですが,僕は情報利得(Information Gain, 以下IG)による処理を選択したいと思いました.

1から計算式をプログラムしていたのですが,どうもきれいではないし,間違っていた(笑)ので,wekaのフィルターとして装備されているweka.attributeSelection.InfoGainAttributeEvalをnetbeansから使うようにしました.

当然,私のレベルではうまくかけないので色々ググったところ,中国語のサイトにそれらしきものを見つけました.

普段英語のサイトならば,自動翻訳しない方が分かるけど,中国語に関してはそのままでは欠片もわからないので,自動翻訳をGoogle先生にしてもらいました.アジア言語間での自動翻訳はかなり高精度と聞いていましたし.

おかげで何が書いてあるのか大体わかりましたし,きちんとフィルターを使うことが出来ました.(実際に思っている計算だけをしているのかは,もう少し調べる必要がありますが,おおよそ大丈夫そう.)

以下.コードを記載します.
崩れてしまいますが,そこはすいません,

import java.io.File;
import weka.attributeSelection.InfoGainAttributeEval;
import weka.attributeSelection.Ranker;
import weka.core.Instances;
import weka.core.converters.ArffLoader;

public class IGonWEKA {
public static void main(String args) {
Instances trainIns = null;
try{
File file= new File("(読ませたいarffファイル)");
ArffLoader loader = new ArffLoader();
loader.setFile(file);
trainIns = loader.getDataSet();
trainIns.setClassIndex(trainIns.numAttributes()-1);
Ranker rank = new Ranker();
InfoGainAttributeEval eval = new InfoGainAttributeEval();
eval.buildEvaluator(trainIns);
//System.out.println(rank.search(eval, trainIns));
int
attrIndex = rank.search(eval, trainIns);
StringBuilder attrIndexInfo = new StringBuilder();
StringBuilder attrInfoGainInfo = new StringBuilder();
attrIndexInfo.append("Selected attributes:");
attrInfoGainInfo.append("Ranked attributes:\n");
for(int i = 0; i < attrIndex.length; i ++){
attrIndexInfo.append(attrIndex[i]);
attrIndexInfo.append(",");
attrInfoGainInfo.append(eval.evaluateAttribute(attrIndex[i]));
attrInfoGainInfo.append("\t");
attrInfoGainInfo.append*1;
System.out.println(attrInfoGainInfo.toString());
}catch(Exception e){
}
}
}

*1:trainIns.attribute(attrIndex[i]).name())); attrInfoGainInfo.append("\n"); } System.out.println(attrIndexInfo.toString(