0

問題: 分類する特定のデータ セットがあります - 役に立つ (1)/役に立たない (0)。分類器のトレーニング目的の入力として、完全なデータセットを提供します。異なるデータセットでテストします。

このために、データを LIBSVM 形式に変換しようとしています。何かをする前に、1 つのベクトルの数値入力を提供し、結果を確認することを考えました。

入力:

トレーニング: 1 1 2 (最初の 1 はこのベクトルで有用なクラスを示し、その後に数値入力が続く) テスト: 1 1 2 (入力データ形式がわからない)

出力:

(0:0.9982708183417436)(1:0.0017291816582564153)(実際:1.0 予測:0.0)

トレーニング セットにクラス 0 はありませんが、クラス 0 の probEstimated があります。

データを数値ベクトル入力に変換し、数値テスト データ セットから提供された同等のデータにデータを取得する方法がよくわかりません。この点に関して、どんな助けも高く評価されています。

予定されているタスク: 1. すべてのデータをハッシュ テーブルにロードし、それぞれの分類子である USEFUL(1) を使用してデータ セットに保存するキーを取得します。2. データセットを svmTrain に提供し、モデルを取得します。3. テスト データ セットを準備します (見つかった場合は、各単語/フレーズをそれぞれの数値保存トレーニング セットに変換します。そうでない場合は、新しい値を割り当てます)。4. テスト セットとモデルを SVM の EVALUATE メソッドに提供します。5. USEFUL クラスから結果のベクトルを取得し、データに再マップします。

コード: さまざまなソースから使用されます。

public class Datatosvmformat {

static double[][] train = new double[1000][3];

public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashMap<String, Integer> dataSet = new HashMap<String, Integer>();

    double[][] test = new double[10][3];

    train[1][0] = 1;
    train[1][1] = 1;
    train[1][2] = 2;

    svm_model model =  svmTrain();
            //Test Data Set  
    double[] test1 = new double[3];
    test1[0] = 1;
    test1[1] = 1;
    test1[2] = 2;
    evaluate(test1,model);

    }

    private static svm_model svmTrain() {
        svm_problem prob = new svm_problem();
        int dataCount = train.length;
        prob.y = new double[dataCount];
        prob.l = dataCount;
        prob.x = new svm_node[dataCount][];     

        for (int i = 0; i <dataCount; i++){             
            double[] features = train[i];
            //ystem.out.println("Features "+features[i]);
            prob.x[i] = new svm_node[features.length-1];
            for (int j = 1; j < features.length; j++){
                svm_node node = new svm_node();
                node.index = j;
                node.value = features[j];
                prob.x[i][j-1] = node;
            }           
            prob.y[i] = features[0];

        }               

        svm_parameter param = new svm_parameter();
        param.probability = 1;
        param.gamma = 0.5;
        param.nu = 0.5;
        param.C = 1;
        param.svm_type = svm_parameter.C_SVC;
        param.kernel_type = svm_parameter.LINEAR;       
        param.cache_size = 20000;
        param.eps = 0.001;      

        svm_model model = svm.svm_train(prob, param);

        return model;
    }

    public static double evaluate(double[] features, svm_model model) 
    {
        svm_node[] nodes = new svm_node[features.length-1];
        for (int i = 1; i < features.length; i++)
        {
            svm_node node = new svm_node();
            node.index = i;
            node.value = features[i];

            nodes[i-1] = node;
        }

        int totalClasses = 2;       
        int[] labels = new int[totalClasses];
        svm.svm_get_labels(model,labels);

        double[] prob_estimates = new double[totalClasses];
        double v = svm.svm_predict_probability(model, nodes, prob_estimates);

        for (int i = 0; i < totalClasses; i++){
            System.out.print("(" + labels[i] + ":" + prob_estimates[i] + ")");
        }
        System.out.println("(Actual:" + features[0] + " Prediction:" + v + ")");
        return v;
    }


}
4

1 に答える 1