追記 2020/09/28
この記事は古いです。こちらにまとめなおしました。
https://qiita.com/jashika/items/d7c86dd8053379fd909f
##前置き
いろいろ思うところもあるが、文句だけ言っていても始まらない。
むしろ俺がこれ作るからOracleが俺を雇え。ください。
##資料について
元ネタはこちらを参照してください。
日本語が必要ならこちらを参照してください。
データのダウンロードはこちらを参照してください。
##どうにかして動かす
bezdekIris.dataをダウンロードします。
マニュアルGatting Startedに記載のサンプルコードをJavaファイルに転記します。
今に始まったことではないので、何も驚きません。そんな変数は定義されていないとエラーで怒られます。
DataSourceをirisDataと変数定義したのに、引数で渡すときには、irisesSourceに名称が変わってしまったのでしょう。おそらくirisDataのことでしょう。~~絶対テストやってない。~~irisDataを引数に渡します。ついでにそんなところにあるコメントは邪魔なので削除します。
MutableDataset(testData)には、MutableDataset#get()メソッドなど無いと怒られます。Oracleクラスともなれば、メソッドなど無くても呼び出せるのでしょう。絶対にテストry
testData#hoge#get(0)とつながりそうなのは、#getData()あたりでしょうか。とりあえずgetData()を使ってみます。
LabelEvaluation#evaluate(Model,MutableDataset)メソッドなど無いと怒られます。今に始まったことではry
しかし、引数でModel, MutableDatasetを受け取り、Evaluationを返却する似た名前のメソッドすらありません。これで呼び出せるとか天才だと思うわ。さすがオラクryおそらくですが、LabelEvaluationのインスタンスを生成するのではなく、LabelEvaluatorのインスタンスを生成しないといけないですね。きっと。勘ですけど。引数もメソッド名も返却値の型も合いますしおすし。
うーん。キャストしておけ適当。
これで一応エラーは消えました。
/**
*
*/
package org.project.eden.adam;
import java.io.IOException;
import java.nio.file.Paths;
import org.tribuo.DataSource;
import org.tribuo.Model;
import org.tribuo.MutableDataset;
import org.tribuo.Prediction;
import org.tribuo.classification.Label;
import org.tribuo.classification.LabelFactory;
import org.tribuo.classification.dtree.CARTClassificationTrainer;
import org.tribuo.classification.evaluation.LabelEvaluation;
import org.tribuo.classification.evaluation.LabelEvaluator;
import org.tribuo.classification.sgd.linear.LogisticRegressionTrainer;
import org.tribuo.data.csv.CSVLoader;
import org.tribuo.evaluation.Evaluation;
import org.tribuo.evaluation.TrainTestSplitter;
/**
* @author jashika
*
*/
public class TribuoSample {
/**
* @param args mainメソッドの引数。
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// ラベル付きアヤメ(アイリス)データを読み込む
var irisHeaders = new String[] { "sepalLength", "sepalWidth", "petalLength", "petalWidth", "species" };
DataSource<Label> irisData = new CSVLoader<>(new LabelFactory()).loadDataSource(Paths.get("/Users/admin/Downloads/bezdekIris.data"),irisHeaders[4],irisHeaders);
// アヤメ(アイリス)データをトレーニングセット(70%)とテストセット(30%)に分割
var splitIrisData = new TrainTestSplitter<>(irisData, 0.7, 1L);
var trainData = new MutableDataset<>(splitIrisData.getTrain());
var testData = new MutableDataset<>(splitIrisData.getTest());
// 決定木を学習する
var cartTrainer = new CARTClassificationTrainer();
Model<Label> tree = cartTrainer.train(trainData);
// ロジスティック回帰
var linearTrainer = new LogisticRegressionTrainer();
Model<Label> linear = linearTrainer.train(trainData);
// 最終的には、目に見えないデータから予測を行う
// 各予測は、出力名(ラベル)からスコア/確率へのマップ
Prediction<Label> prediction = linear.predict(testData.getData().get(0));
// 完全なテストデータセットを評価して、精度、F1などを計算してもよい。
Evaluation<Label> evaluation = new LabelEvaluator().evaluate(linear, testData);
// 手動での評価を検査する。
double acc = LabelEvaluation.class.cast(evaluation).accuracy();
// フォーマットされた評価文字列を表示する。
System.out.println(evaluation.toString());
}
}
空行・・・。空行無視じゃないの?LF改行だから、何か恨みがあるの?別にこれは無視する対応でよくね?CSVの規約違反でもないし。