xgboost进行稀疏数据的处理
当数据及其稀疏的时候,不应该转换为numpy等形式,尤其是点击数据。
商品成千上万,用户点击商品的种类只是其中的某一些类型,但是以此建立起来的点击矩阵的纬度却是庞大而冗余
解决方式1:
将数据转化为libsvm存储的形式, 数据的第一列是label, 第二列之后的是特征
label key1:value1 key2:value2 key3:value3
XGBoost可以加载libsvm格式的文本数据,加载的数据格式可以为Numpy的二维数组和XGBoost的二进制的缓存文件。加载的数据存储在对象DMatrix
中。
- 加载libsvm格式的数据和二进制的缓存文件时可以使用如下方式
-
dtrain = xgb.DMatrix('train.svm.txt') dtest = xgb.DMatrix('test.svm.buffer')
直接将数据导入即可
解决方式2:
- 加载numpy的数组到
DMatrix
对象时,可以用如下方式 - 这种是通常会使用的方法,直接将数据处理成numpy 的形式,然后进行五折交叉验证,直接调包,通过数组的index处理即可(一般情况,比如样本,字段的情况)
data = np.random.rand(5,10) # 5 entities, each contains 10 features
###生成一个5个样本,特征个数为10的训练集
label = np.random.randint(2, size=5) # binary target
####生成训练集对应的标签
dtrain = xgb.DMatrix( data, label=label)
####
通过标签以及训练数据,生成XGBOOST可以处理的形式
- 将
scipy.sparse
格式的数据转化为DMatrix
格式时,可以使用如下方式 - 将稀疏数据如此表示,只表示其中有值的点,将数据表示成三元组,需要行,列,value值,然后将数据放入
csr = scipy.sparse.csr_matrix( (dat, (row,col)) )
dtrain = xgb.DMatrix( csr )