Javaによるロジスティック回帰アルゴリズム

はじめに

回帰分析とは、予測目的で従属変数と独立変数の関係を決定するために使用される手法です。データモデリングやデータ分析に有効なツールです。

回帰分析には様々な手法があります。ここでは、ロジスティック回帰に焦点を当てます。

ロジスティック回帰は、データ集合の中に複数の独立変数がある場合に適しています。この手法は、標本サイズが小さいと最尤推定値が通常の最小2乗法よりも小さくなるため、大きな標本サイズが必要です。

今回は、JavaとGridDBを使ってロジスティック回帰を実装する方法を紹介します。目標は、気象条件に基づいて遊べるかどうかを予測することです。

GridDBにデータを格納する

データは “play.csv “というCSVファイルに格納されています。このデータセットには、4つの独立変数(outlook, temperature, humidity, windy)と、1つの従属変数(play)があります。このデータセットをGridDBに書き込みましょう。そうすることで、クエリパフォーマンスの向上などの様々な恩恵を受けることが期待できます。

まず、このために使用するライブラリをインポートしましょう。

import java.io.IOException;
import java.util.Collection;
import java.util.Properties;
import java.util.Scanner;
import java.io.File;

import com.toshiba.mwcloud.gs.Collection;
import com.toshiba.mwcloud.gs.GSException;
import com.toshiba.mwcloud.gs.GridStore;
import com.toshiba.mwcloud.gs.GridStoreFactory;
import com.toshiba.mwcloud.gs.Query;
import com.toshiba.mwcloud.gs.RowKey;
import com.toshiba.mwcloud.gs.RowSet;

では、使用する GridDB コンテナを表す静的な Java クラスを作成します。

public static class Weather {
     @RowKey String outlook;
     String temperature; 
     String humidity;
     String windy;
     String play;
}  

上のクラスを5つのカラムを持つSQLテーブルと見なしてください。5つの変数は、単にGridDBコンテナのカラムを表しています。

これで、Java から GridDB コンテナに接続できるようになりました。以下のコードがその例です。


        Properties props = new Properties();
        props.setProperty("notificationAddress", "239.0.0.1");
        props.setProperty("notificationPort", "31999");
        props.setProperty("clusterName", "defaultCluster");
        props.setProperty("user", "admin");
        props.setProperty("password", "admin");
        GridStore store = GridStoreFactory.getInstance().getGridStore(props);

使用するGridDBコンテナは Weather という名前です。それを選択してみましょう。

Collection<String, Weather> coll = store.putCollection("col01", Weather.class);

Weather コンテナを使用する場合は、そのインスタンス名として coll を使用します。

これで、play.csv ファイルからデータを読み込んで、GridDB コンテナに書き込むことができるようになりました。


                File file1 = new File("play.csv");
                Scanner sc = new Scanner(file1);
                String data = sc.next();
 
                while (sc.hasNext()){
                        String scData = sc.next();
                        String dataList[] = scData.split(",");
                        String outlook = dataList[0];
                        String temperature = dataList[1];
                        String humidity = dataList[2];
                        String windy = dataList[3];
                        String play = dataList[4];
                        
                        Weather wt = new Weather();
                        wt.outlook = outlook;
                        wt.temperature = temperature;
                        wt.humidity = humidity;
                        wt.windy = windy;
                        wt.play = play;
                        
                        coll.append(wt);
                }

データを取得する

ロジスティック回帰モデルを構築するためにデータを使用するには、GridDBコンテナからデータを取得する必要があります。以下のコードで実現できます。


                Query query = coll.query("select *");
                RowSet rs = query.fetch(false);
                RowSet res = query.fetch();

select *クエリにより、GridDBコンテナに格納されているデータを全て取得することができました。

ロジスティック回帰モデルの実装

データの準備ができたので、それを使ってロジスティック回帰モデルを実装してみましょう。このモデルの目的は、天気によって遊べるか遊べないかを判断できるようにすることです。

まず、モデルの実装に役立つライブラリをインポートしましょう。

import java.io.IOException;

import weka.classifiers.Evaluation;
import weka.classifiers.Classifier;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ArffLoader; 

import java.io.BufferedReader;
import java.io.FileReader;

データセット用のバッファードリーダーとインスタンスを作成しましょう。


            BufferedReader bufferedReader
                = new BufferedReader(
                    new FileReader(res));
 
            // Create dataset instances
            Instances datasetInstances
                = new Instances(bufferedReader);

Weka API の Logistic() 関数を呼び出して、このデータセットを使ってロジスティック回帰モデルを構築することができるようになりました。

datasetInstances.setClassIndex(datasetInstances.numAttributes()-1);

Classifier classifier = new weka.classifiers.functions.Logistic();

classifier.buildClassifier(datasetInstances);
System.out.println(classifier);

予測をする

上記のモデルを使って、予測を行うことができます。以下に示すように、データセットの最後のインスタンスを使って予測を行うことにします。


        Instance pred = datasetInstances.lastInstance();
        double answer = classifier.classifyInstance(pred);
        System.out.println(answer);

モデルのコンパイルと実行

モデルをコンパイルして実行するには、Weka API が必要です。以下のURLからダウンロードしてください。

http://www.java2s.com/Code/Jar/w/weka.htm

次に、gsadm ユーザでログインします。作成した .java ファイルを以下のパスにあるGridDBの bin フォルダに移動します。

/griddb_4.6.0-1_amd64/usr/griddb-4.6.0/bin

Linux端末で以下のコマンドを実行し、gridstore.jarファイルのパスを設定します。

export CLASSPATH=$CLASSPATH:/home/osboxes/Downloads/griddb_4.6.0-1_amd64/usr/griddb-4.6.0/bin/gridstore.jar

次に、次のコマンドを使用して .java ファイルをコンパイルします。

javac -cp weka-3-7-0/weka.jar WeatherPlay.java

以下のコマンドを実行して生成された .class ファイルを実行します。

java -cp .:weka-3-7-0/weka.jar WeatherPlay

モデルは予測値として「1.0」を返し、これは遊べることを意味します。

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *