### Navigation

- index
- next |
- previous |
- OpenCV 2.4.12.3 documentation »
- OpenCV API Reference »
- ml. Machine Learning »

# MLData

For the machine learning algorithms, the data set is often stored in a file of the `.csv`-like format. The file contains a table of predictor and response values where each row of the table corresponds to a sample. Missing values are supported. The UC Irvine Machine Learning Repository (http://archive.ics.uci.edu/ml/) provides many data sets stored in such a format to the machine learning community. The class `MLData` is implemented to easily load the data for training one of the OpenCV machine learning algorithms. For float values, only the `'.'` separator is supported.

## CvMLData

class `CvMLData`

Class for loading the data from a `.csv` file.

    class CV_EXPORTS CvMLData
    {
    public:
        CvMLData();
        virtual ~CvMLData();

        int read_csv(const char* filename);

        const CvMat* get_values() const;
        const CvMat* get_responses();
        const CvMat* get_missing() const;

        void set_response_idx( int idx );
        int get_response_idx() const;

        void set_train_test_split( const CvTrainTestSplit * spl);
        const CvMat* get_train_sample_idx() const;
        const CvMat* get_test_sample_idx() const;
        void mix_train_and_test_idx();

        const CvMat* get_var_idx();
        void change_var_idx( int vi, bool state );

        const CvMat* get_var_types();
        void set_var_types( const char* str );

        int get_var_type( int var_idx ) const;
        void change_var_type( int var_idx, int type);

        void set_delimiter( char ch );
        char get_delimiter() const;

        void set_miss_ch( char ch );
        char get_miss_ch() const;

        const std::map<std::string, int>& get_class_labels_map() const;

    protected:
        ...
    };

## CvMLData::read_csv

Reads the data set from a `.csv`-like `filename` file and stores all read values in a matrix.

C++:`` int `CvMLData::``read_csv`(const char* filename)

  Parameters: | filename – The input file name

While reading the data, the method tries to define the type of variables (predictors and responses): ordered or categorical. If a value of the variable is not numerical (except for the label for a missing value), the type of the variable is set to `CV_VAR_CATEGORICAL`. If all existing values of the variable are numerical, the type of the variable is set to `CV_VAR_ORDERED`. So, the default definition of variables types works correctly for all cases except the case of a categorical variable with numerical class labels. In this case, the type `CV_VAR_ORDERED` is set. You should change the type to `CV_VAR_CATEGORICAL` using the method `CvMLData::change_var_type()`. For categorical variables, a common map is built to convert a string class label to the numerical class label. Use `CvMLData::get_class_labels_map()` to obtain this map.

Also, when reading the data, the method constructs the mask of missing values. For example, values are equal to ‘?’.

## CvMLData::get_values

Returns a pointer to the matrix of predictors and response values

C++:`` const CvMat* `CvMLData::``get_values`()`const`

The method returns a pointer to the matrix of predictor and response `values` or `0` if the data has not been loaded from the file yet.

The row count of this matrix equals the sample count. The column count equals predictors `+ 1` for the response (if exists) count. This means that each row of the matrix contains values of one sample predictor and response. The matrix type is `CV_32FC1`.

## CvMLData::get_responses

Returns a pointer to the matrix of response values

C++:`` const CvMat* `CvMLData::``get_responses`()

The method returns a pointer to the matrix of response values or throws an exception if the data has not been loaded from the file yet.

This is a single-column matrix of the type `CV_32FC1`. Its row count is equal to the sample count, one column and .

## CvMLData::get_missing

Returns a pointer to the mask matrix of missing values

C++:`` const CvMat* `CvMLData::``get_missing`()`const`

The method returns a pointer to the mask matrix of missing values or throws an exception if the data has not been loaded from the file yet.

This matrix has the same size as the `values` matrix (see `CvMLData::get_values()`) and the type `CV_8UC1`.

## CvMLData::set_response_idx

Specifies index of response column in the data matrix

C++:`` void `CvMLData::``set_response_idx`(int idx)

The method sets the index of a response column in the `values` matrix (see `CvMLData::get_values()`) or throws an exception if the data has not been loaded from the file yet.

The old response columns become predictors. If `idx < 0`, there is no response.

## CvMLData::get_response_idx

Returns index of the response column in the loaded data matrix

C++:`` int `CvMLData::``get_response_idx`()`const`

The method returns the index of a response column in the `values` matrix (see `CvMLData::get_values()`) or throws an exception if the data has not been loaded from the file yet.

If `idx < 0`, there is no response.

## CvMLData::set_train_test_split

Divides the read data set into two disjoint training and test subsets.

C++:`` void `CvMLData::``set_train_test_split`(const CvTrainTestSplit* spl)

This method sets parameters for such a split using `spl` (see `CvTrainTestSplit`) or throws an exception if the data has not been loaded from the file yet.

## CvMLData::get_train_sample_idx

Returns the matrix of sample indices for a training subset

C++:`` const CvMat* `CvMLData::``get_train_sample_idx`()`const`

The method returns the matrix of sample indices for a training subset. This is a single-row matrix of the type `CV_32SC1`. If data split is not set, the method returns `0`. If the data has not been loaded from the file yet, an exception is thrown.

## CvMLData::get_test_sample_idx

Returns the matrix of sample indices for a testing subset

C++:`` const CvMat* `CvMLData::``get_test_sample_idx`()`const`

## CvMLData::mix_train_and_test_idx

Mixes the indices of training and test samples

C++:`` void `CvMLData::``mix_train_and_test_idx`()

The method shuffles the indices of training and test samples preserving sizes of training and test subsets if the data split is set by `CvMLData::get_values()`. If the data has not been loaded from the file yet, an exception is thrown.

## CvMLData::get_var_idx

Returns the indices of the active variables in the data matrix

C++:`` const CvMat* `CvMLData::``get_var_idx`()

The method returns the indices of variables (columns) used in the `values` matrix (see `CvMLData::get_values()`).

It returns `0` if the used subset is not set. It throws an exception if the data has not been loaded from the file yet. Returned matrix is a single-row matrix of the type `CV_32SC1`. Its column count is equal to the size of the used variable subset.

## CvMLData::change_var_idx

Enables or disables particular variable in the loaded data

C++:`` void `CvMLData::``change_var_idx`(int vi, bool state)

By default, after reading the data set all variables in the `values` matrix (see `CvMLData::get_values()`) are used. But you may want to use only a subset of variables and include/exclude (depending on `state` value) a variable with the `vi` index from the used subset. If the data has not been loaded from the file yet, an exception is thrown.

## CvMLData::get_var_types

Returns a matrix of the variable types.

C++:`` const CvMat* `CvMLData::``get_var_types`()

The function returns a single-row matrix of the type `CV_8UC1`, where each element is set to either `CV_VAR_ORDERED` or `CV_VAR_CATEGORICAL`. The number of columns is equal to the number of variables. If data has not been loaded from file yet an exception is thrown.

## CvMLData::set_var_types

Sets the variables types in the loaded data.

C++:`` void `CvMLData::``set_var_types`(const char* str)

In the string, a variable type is followed by a list of variables indices. For example: `"ord[0-17],cat[18]"`, `"ord[0,2,4,10-12], cat[1,3,5-9,13,14]"`, `"cat"` (all variables are categorical), `"ord"` (all variables are ordered).

## CvMLData::get_var_type

Returns type of the specified variable

C++:`` int `CvMLData::``get_var_type`(int var_idx)`const`

The method returns the type of a variable by the index `var_idx` ( `CV_VAR_ORDERED` or `CV_VAR_CATEGORICAL`).

## CvMLData::change_var_type

Changes type of the specified variable

C++:`` void `CvMLData::``change_var_type`(int var_idx, int type)

The method changes type of variable with index `var_idx` from existing type to `type` ( `CV_VAR_ORDERED` or `CV_VAR_CATEGORICAL`).

## CvMLData::set_delimiter

Sets the delimiter in the file used to separate input numbers

C++:`` void `CvMLData::``set_delimiter`(char ch)

The method sets the delimiter for variables in a file. For example: `','` (default), `';'`, `' '` (space), or other characters. The floating-point separator `'.'` is not allowed.

## CvMLData::get_delimiter

Returns the currently used delimiter character.

C++:`` char `CvMLData::``get_delimiter`()`const`

## CvMLData::set_miss_ch

Sets the character used to specify missing values

C++:`` void `CvMLData::``set_miss_ch`(char ch)

The method sets the character used to specify missing values. For example: `'?'` (default), `'-'`. The floating-point separator `'.'` is not allowed.

## CvMLData::get_miss_ch

Returns the currently used missing value character.

C++:`` char `CvMLData::``get_miss_ch`()`const`

## CvMLData::get_class_labels_map

Returns a map that converts strings to labels.

C++:`` const std::map<std::string, int>& `CvMLData::``get_class_labels_map`()`const`

The method returns a map that converts string class labels to the numerical class labels. It can be used to get an original class label as in a file.

## CvTrainTestSplit

struct `CvTrainTestSplit`

Structure setting the split of a data set read by `CvMLData`.

    struct CvTrainTestSplit
    {
        CvTrainTestSplit();
        CvTrainTestSplit( int train_sample_count, bool mix = true);
        CvTrainTestSplit( float train_sample_portion, bool mix = true);

        union
        {
            int count;
            float portion;
        } train_sample_part;
        int train_sample_part_mode;

        bool mix;
    };

There are two ways to construct a split:

- Set the training sample count (subset size) `train_sample_count`. Other existing samples are located in a test subset.
- Set a training sample portion in `[0,..1]`. The flag `mix` is used to mix training and test samples indices when the split is set. Otherwise, the data set is split in the storing order: the first part of samples of a given size is a training subset, the second part is a test subset.

## Help and Feedback

You did not find what you were looking for?

- Ask a question on the Q&A forum.
- If you think something is missing or wrong in the documentation, please file a bug report.

### Navigation

- index
- next |
- previous |
- OpenCV 2.4.12.3 documentation »
- OpenCV API Reference »
- ml. Machine Learning »