Категориальные особенности в млпаке - PullRequest
0 голосов
/ 06 мая 2019

Я пытался реализовать случайный лес в C ++, используя mlpack.Мои данные имеют некоторые особенности как категориальные.Я пытался использовать DatasetInfo из mlpack, но безуспешно.

Код ниже:

#include "pch.h"
#include <iostream>
using namespace arma;
using namespace mlpack;
using namespace mlpack::tree;
using namespace mlpack::cv;

int main()
{
    cout << "[SAMPLE:BEGIN]";

    // (1) Load the dataset
    cout << "\nLoading dataset...";

    mat dataset;
    data::DatasetInfo di;
    di = data::DatasetInfo(0);
    bool loaded = data::Load("data/final.csv", dataset, di);
    if (!loaded)
        return -1;

    di.Type(0) = data::Datatype::numeric;
    di.Type(1) = data::Datatype::categorical;
    di.Type(2) = data::Datatype::categorical;

    Row<size_t> labels;

    // Extract the labels from the last dimension of the training set
    //labels = conv_to<Row<size_t>>::from(dataset.row(dataset.n_rows - 1));
    loaded = data::Load("data/labels.csv", labels);

    // Remove the labels from the training set
    //dataset.shed_row(dataset.n_rows - 1);

    // (2) Training
    cout << "\nTraining...";
    const size_t numClasses = 2;
    const size_t minimumLeafSize = 5;
    const size_t numTrees = 10;

    RandomForest<GiniGain, RandomDimensionSelect> rf; 

    rf = RandomForest<GiniGain, RandomDimensionSelect>(dataset, di, labels,
        numClasses, numTrees, minimumLeafSize);

    Row<size_t> predictions;
    rf.Classify(dataset, predictions);

    const size_t correct = arma::accu(predictions == labels);

    cout << "\nTraining Accuracy: " << (double(correct) / double(labels.n_elem));


    //Save the model
    cout << "\nSaving model...";
    mlpack::data::Save("mymodel.xml", "model", rf, false);

    //Load the model
    cout << "\nLoading model...";
    mlpack::data::Load("mymodel.xml", "model", rf);

    // (6) Classify a new sample
    cout << "\nClassifying a new sample...";
    mat sample("67.00,5812,901");
    mat probabilities;
    rf.Classify(sample, predictions, probabilities);
    u64 result = predictions.at(0);
    cout << "\nClassification result: " << result << " , Probabilities: " <<
        probabilities.at(0) << "/" << probabilities.at(1);
    cout << "\n[SAMPLE:END]\n";
    return 0;
}

Я разбил данные на файлы, которые имеют три функции иВ другом файле есть метки.У final.csv есть функции.

1548.0,5964,812

, где первый столбец должен быть числом, а два других столбца должны рассматриваться как категории.

label.csv имеет метки в виде0 и 1.

В этом примере происходит сбой с исключением из-за нарушения прав чтения, когда я пытаюсь обучить машину.

Я думаю, что я делаю что-то не так, как пытаюсьуказать DatasetInfo.

Может кто-нибудь указать на то, что здесь происходит не так, или указать мне несколько примеров, где я могу увидеть, как можно использовать DatasetInfo.

Спасибо.

...