我正在尝试使用 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'
现在,我寻找了一段时间它可能来自哪里,并相信它与我希望使用的稀疏格式有关。但它是什么,以及如何解决它,我不知道。
我欢迎任何帮助或意见! 非常感谢你
您正在使用 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)
我更喜欢使用 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/stable/python/python_api.html#xgboost.cv https://xgboost.readthedocs.io/en/stable/python/examples/cross_validation.html
这里有更多示例https://github.com/dmlc/xgboost/tree/master/demo/guide-python
希望这有帮助。
X_csr = csr_matrix(X)
具有许多与 X
相同的属性,包括 .shape
。 但它不是一个子类,也不是替代品。 代码需要具有“稀疏意识”。 sklearn
符合资格;事实上,它添加了许多自己的快速稀疏实用函数。
但我不知道
xgb
处理稀疏矩阵的效果如何,也不知道它如何与 sklearn
一起使用。
假设问题出在
xgtrain
,您需要查看它的类型和属性。 和用xgb.DMatrix(X, label = y )
做的相比怎么样?
如果您需要尚未成为
xgboost
用户的帮助,您必须提供有关代码中对象的更多信息。