【问题标题】:XGBoost and sparse matrixXGBoost 和稀疏矩阵
【发布时间】:2018-10-08 11:44:05
【问题描述】:

我正在尝试使用 xgboost 运行 - 使用 python - 处理分类问题,其中我有 numpy 矩阵 X 中的数据(行 = 观察和列 = 特征)和标签numpy 数组 y。 因为我的数据是稀疏的,所以我想让它使用 X 的稀疏版本运行,但似乎在发生错误时我遗漏了一些东西。

这是我的工作:

# Library import

import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from scipy.sparse import csr_matrix

# Converting to sparse data and running xgboost

X_csr = csr_matrix(X)
xgb1 = XGBClassifier()
xgtrain = xgb.DMatrix(X_csr, label = y )      #to work with the xgb format
xgtest = xgb.DMatrix(Xtest_csr)
xgb1.fit(xgtrain, y, eval_metric='auc')
dtrain_predictions = xgb1.predict(xgtest)   

等等……

现在尝试拟合分类器时出现错误:

File ".../xgboost/python-package/xgboost/sklearn.py", line 432, in fit
self._features_count = X.shape[1]

AttributeError: 'DMatrix' object has no attribute 'shape'

现在,我研究了它的来源,并相信它与我希望使用的稀疏格式有关。但它是什么,以及如何解决它,我不知道。

我欢迎任何帮助或 cmets ! 非常感谢

【问题讨论】:

  • 这是否适用于Xxgb 对使用稀疏矩阵有什么看法?它们通常不会被替换掉。

标签: python numpy scipy sparse-matrix xgboost


【解决方案1】:

您正在使用 xgboost scikit-learn API (http://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn),因此您无需将数据转换为 DMatrix 以适应 XGBClassifier()。只是删除线

xgtrain = xgb.DMatrix(X_csr, label = y )

应该有效:

type(X_csr) #scipy.sparse.csr.csr_matrix
type(y) #numpy.ndarray
xgb1 = xgb.XGBClassifier()
xgb1.fit(X_csr, y)

哪个输出:

XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1,
   gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=3,
   min_child_weight=1, missing=None, n_estimators=100, nthread=-1,
   objective='binary:logistic', reg_alpha=0, reg_lambda=1,
   scale_pos_weight=1, seed=0, silent=True, subsample=1)

【讨论】:

  • 这意味着我们可以用稀疏数组训练模型正确吗?
【解决方案2】:

X_csr = csr_matrix(X) 具有许多与X 相同的属性,包括.shape。但它不是子类,也不是替代品。代码需要“稀疏感知”。 sklearn 符合条件;事实上,它添加了许多自己的快速稀疏实用功能。

但我不知道xgb 处理稀疏矩阵的效果如何,也不知道它如何与sklearn 配合使用。

假设问题出在xgtrain,您需要查看它的类型和属性。它与使用xgb.DMatrix(X, label = y ) 制作的相比如何?

如果您想从不是xgboost 用户的人那里获得帮助,您必须提供有关代码中对象的更多信息。

【讨论】:

    【解决方案3】:

    我更喜欢使用 XGBoost 训练包装器,而不是 XGBoost sklearn 包装器。您可以按如下方式创建分类器:

    params = {
        # I'm assuming you are doing binary classification
        'objective':'binary:logistic'
        # any other training params here
        # full parameter list here https://github.com/dmlc/xgboost/blob/master/doc/parameter.md
    }
    booster = xgb.train(params, xgtrain, metrics=['auc'])
    

    此 API 还具有内置的交叉验证 xgb.cv,与 XGBoost 配合使用效果更好。

    https://xgboost.readthedocs.io/en/latest/get_started/index.html#python

    这里有更多示例https://github.com/dmlc/xgboost/tree/master/demo/guide-python

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 2018-01-19
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多