LoginSignup
1
0

More than 3 years have passed since last update.

Oracleから公開されたTribuoを気を取り直してやってみた。Tribuo - A Java prediction library (v4.0)

Last updated at Posted at 2020-09-26

追記 2020/09/28
この記事は古いです。こちらにまとめなおしました。
https://qiita.com/jashika/items/d7c86dd8053379fd909f

前置き

いろいろ思うところもあるが、文句だけ言っていても始まらない。
むしろ俺がこれ作るからOracleが俺を雇え。ください。

資料について

元ネタはこちらを参照してください。
日本語が必要ならこちらを参照してください。
データのダウンロードはこちらを参照してください。

どうにかして動かす

bezdekIris.dataをダウンロードします。

マニュアルGatting Startedに記載のサンプルコードをJavaファイルに転記します。
今に始まったことではないので、何も驚きません。そんな変数は定義されていないとエラーで怒られます。

image.png

DataSourceをirisDataと変数定義したのに、引数で渡すときには、irisesSourceに名称が変わってしまったのでしょう。おそらくirisDataのことでしょう。絶対テストやってない。irisDataを引数に渡します。ついでにそんなところにあるコメントは邪魔なので削除します。

image.png
MutableDataset(testData)には、MutableDataset#get()メソッドなど無いと怒られます。Oracleクラスともなれば、メソッドなど無くても呼び出せるのでしょう。絶対にテストry

image.png
testData#hoge#get(0)とつながりそうなのは、#getData()あたりでしょうか。とりあえずgetData()を使ってみます。

image.png

LabelEvaluation#evaluate(Model,MutableDataset)メソッドなど無いと怒られます。今に始まったことではry

image.png
しかし、引数でModel, MutableDatasetを受け取り、Evaluationを返却する似た名前のメソッドすらありません。これで呼び出せるとか天才だと思うわ。さすがオラクryおそらくですが、LabelEvaluationのインスタンスを生成するのではなく、LabelEvaluatorのインスタンスを生成しないといけないですね。きっと。勘ですけど。引数もメソッド名も返却値の型も合いますしおすし。

image.png

うーん。キャストしておけ適当
これで一応エラーは消えました。

TribuoSample
/**
 *
 */
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());
    }
}

実行してみます。
151行目が1エレメントしかない?
image.png

空行・・・。空行無視じゃないの?LF改行だから、何か恨みがあるの?別にこれは無視する対応でよくね?CSVの規約違反でもないし。

image.png

データファイルから消したよ。手動で。
image.png

再度実行。それっぽいのが出た。もう少し突っ込んだところは、後で追記します。多分。
image.png

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0