7.1 数据接口

7.1.1 数据格式

  1. xgboost 的数据存储在DMatrix 对象中

  2. xgboost 支持直接从下列格式的文件中加载数据:

    • libsvm 文本格式的文件。其格式为:

      1. [label] [index1]:[value1] [index2]:[value2] ...
      2. [label] [index1]:[value1] [index2]:[value2] ...
      3. ...
    • xgboost binary buffer 文件

    1. dtrain = xgb.DMatrix('train.svm.txt') #libsvm 格式
    2. dtest = xgb.DMatrix('test.svm.buffer') # xgboost binary buffer 文件
  3. xgboost 也支持从二维的numpy array 中加载数据

    1. data = np.random.rand(5, 10)
    2. label = np.random.randint(2, size=5)
    3. dtrain = xgb.DMatrix(data, label=label)#从 numpy array 中加载
  4. 你也可以从scipy.sparse array 中加载数据

    1. csr = scipy.sparse.csr_matrix((dat, (row, col)))
    2. dtrain = xgb.DMatrix(csr)

7.1.2 DMatrix

  1. DMatrix: 由xgboost 内部使用的数据结构,它存储了数据集,并且针对了内存消耗和训练速度进行了优化。

    1. xgboost.DMatrix(data, label=None, missing=None, weight=None, silent=False,
    2. feature_names=None, feature_types=None, nthread=None)
    • 参数:

      • data:表示数据集。可以为:

        • 一个字符串,表示文件名。数据从该文件中加载
        • 一个二维的 numpy array, 表示数据集。
      • label:一个序列,表示样本标记。

      • missing: 一个值,它是缺失值的默认值。

      • weight:一个序列,给出了数据集中每个样本的权重。

      • silent: 一个布尔值。如果为True,则不输出中间信息。

      • feature_names: 一个字符串序列,给出了每一个特征的名字

      • feature_types: 一个字符串序列,给出了每个特征的数据类型

      • nthread

  2. 属性:

    • feature_names: 返回每个特征的名字
    • feature_types: 返回每个特征的数据类型
  3. 方法:

    • .get_base_margin(): 返回一个浮点数,表示DMatrixbase margin

      .set_base_margin(margin): 设置DMatrixbase margin

      • 参数:margin: t一个序列,给出了每个样本的prediction margin
    • .get_float_info(field): 返回一个numpy array, 表示DMatrixfloat property

      .set_float_info(field,data): 设置DMatrixfloat property

      .set_float_info_npy2d(field,data): 设置DMatrixfloat property 。这里的data 是二维的numpy array

      • 参数:

        • field: 一个字符串,给出了information 的字段名。注:意义未知。
        • data: 一个numpy array,给出了数据集每一个点的float information
    • .get_uint_info(field): 返回DMatrixunsigned integer property

      .set_unit_info(field,data): 设置DMatrixunsigned integer property

      • 参数:

        • field: 一个字符串,给出了information 的字段名。注:意义未知。
        • data: 一个numpy array, 给出了数据集每个点的uint information
      • 返回值:一个numpy array,表示数据集的unsigned integer information
    • .get_label(): 返回一个numpy array,表示DMatrixlabel

      .set_label(label): 设置样本标记。

      .set_label_npy2d(label): 设置样本标记。这里的label 为二维的numpy array

      • 参数: label: 一个序列,表示样本标记
    • .get_weight(): 一个numpy array,返回DMatrix 的样本权重。

      .set_weight(weight): 设置样本权重。

      .set_weight_npy2d(weight): 设置样本权重。这里的weight 为二维的numpy array

      • 参数:weight:一个序列,表示样本权重
    • .num_col(): 返回DMatrix 的列数

      • 返回值:一个整数,表示特征的数量
    • .num_row(): 返回DMatrix 的行数

      • 返回值:一个整数,表示样本的数量
    • save_binary(fname,silent=True): 保存DMatrix 到一个 xgboost buffer 文件中

      • 参数:

        • fname: 一个字符串,表示输出的文件名
        • silent: 一个布尔值。如果为True,则不输出中间信息。
    • .set_group(group): 设置DMatrix 每个组的大小(用于排序任务)

      • 参数:group: 一个序列,给出了每个组的大小
    • slice(rindex): 切分DMaxtrix ,返回一个新的DMatrix。 该新的DMatrix 仅仅包含rindex

      • 参数:rindex: 一个列表,给出了要保留的index
      • 返回值:一个新的DMatrix 对象
  4. 示例:

    data/train.svm.txt 的内容:

    1. 1 1:1 2:2
    2. 1 1:2 2:3
    3. 1 1:3 2:4
    4. 1 1:4 2:5
    5. 0 1:5 2:6
    6. 0 1:6 2:7
    7. 0 1:7 2:8
    8. 0 1:8 2:9

    测试代码:

    ​x

    1. import xgboost as xgt
    2. import numpy as np
    3. class MatrixTest:
    4. '''
    5. 测试 DMatrix
    6. '''
    7. def __init__(self):
    8. self._matrix1 = xgt.DMatrix('data/train.svm.txt')
    9. self._matrix2 = xgt.DMatrix(data=np.arange(0, 12).reshape((4, 3)),
    10. label=[1, 2, 3, 4], weight=[0.5, 0.4, 0.3, 0.2],
    11. silent=False, feature_names=['a', 'b', 'c'],
    12. feature_types=['int','int','float'], nthread=2)
    13. def print(self,matrix):
    14. print('feature_names:%s'%matrix.feature_names)
    15. print('feature_types:%s' % matrix.feature_types)
    16. def run_get(self,matrix):
    17. print('get_base_margin():', matrix.get_base_margin())
    18. print('get_label():', matrix.get_label())
    19. print('get_weight():', matrix.get_weight())
    20. print('num_col():', matrix.num_col())
    21. print('num_row():', matrix.num_row())
    22. def test(self):
    23. print('查看 matrix1 :')
    24. self.print(self._matrix1)
    25. # feature_names:['f0', 'f1', 'f2']
    26. # feature_types:None
    27. print('\n查看 matrix2 :')
    28. self.print(self._matrix2)
    29. # feature_names:['a', 'b', 'c']
    30. # feature_types:['int', 'int', 'float']
    31. print('\n查看 matrix1 get:')
    32. self.run_get(self._matrix1)
    33. # get_base_margin(): []
    34. # get_label(): [1. 1. 1. 1. 0. 0. 0. 0.]
    35. # get_weight(): []
    36. # num_col(): 3
    37. # num_row(): 8
    38. print('\n查看 matrix2 get:')
    39. self.run_get(self._matrix2)
    40. # get_base_margin(): []
    41. # get_label(): [1. 2. 3. 4.]
    42. # get_weight(): [0.5 0.4 0.3 0.2]
    43. # num_col(): 3
    44. # num_row(): 4
    45. print(self._matrix2.slice([0,1]).get_label())
    46. # [1. 2.]