XGBoost, создайте DMatrix из одной строки данных в формате CSR - PullRequest
0 голосов
/ 19 мая 2018

Я читаю документацию для XGBoost и, в частности, создаю DMatrix в формате CSR / CSC.Документация не очень полезна:

To load sparse matrix in CSR/CSC format is a little complicated, 
the usage is like : suppose a sparse matrix : 1 0 2 0 4 0 0 3 3 1 2 0

Не ясно, что подразумевается под предположением выше, также неясно, как это соотносится со стандартными векторами Йельского формата A, IA, JA.Поэтому я попытался загрузить первую строку из набора тестовых данных Agaricus (в формате libSVM)

0 1:1 9:1 19:1 21:1 24:1 34:1 36:1 39:1 42:1 53:1 56:1 65:1 69:1 77:1 86:1 88:1 92:1 95:1 102:1 106:1 117:1 122:1        

Я создал DMatrix следующим образом:

DMatrix dMatrix = new DMatrix(new long[] {0}, 
   new int[] {1, 9, 19, 21, 24, 34, 36, 39, 42, 53, 56, 65, 69, 77, 86, 88, 92, 95, 102, 106, 117, 122}, 
   new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f},
   DMatrix.SparseType.CSC, 1);

Но это не дает никакого видаразумного ответа должно быть около 4.941254E-4, но он дает 0.5.

Что я здесь не так делаю, и как мне представить одну строку в XGBoost в виде разреженной DMatrix?

1 Ответ

0 голосов
/ 19 мая 2018

Отвечая на мой собственный вопрос:

Это будет работать:

DMatrix dMatrix = new DMatrix(new long[] {0, 22},
    new int[] {1, 9, 19, 21, 24, 34, 36, 39, 42, 53, 56, 65, 69, 77, 86, 88, 92, 95, 102, 106, 117, 122}, 
    new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f},
    DMatrix.SparseType.CSR, 123);

Другими словами, для классификации одного наблюдения headers должно иметь 2 записи, 0 и количествоненулевые индексы (IA), indices - список индексов (JA), data - список ненулевых значений (A), тип - CSR в этом случае, а shapeParam - общее количество столбцов.(123 в данном случае agaricus.txt).

...