Xgboost: Pythonでスパヌス行列を䜿甚しおいるずきにfeature_namesが䞀臎しない

䜜成日 2016幎05月31日  Â·  51コメント  Â·  ゜ヌス: dmlc/xgboost

Pythonでスパヌス行列を䜿甚しおxgboostをトレヌニングしおいるずきに、ValueErrorfeature_namesの䞍䞀臎が発生したす。
xgboostバヌゞョンはgitから最新のものです。 叀いバヌゞョンではこの゚ラヌは発生したせん。 予枬時間䞭に゚ラヌが返されたす。

コヌド

from scipy import sparse
import xgboost as xgb
from random import *
randBinList = lambda n: [randint(0,1) for b in range(1,n+1)]

train = sparse.rand(100,500)
test = sparse.rand(10, 500)
y = randBinList(100)
clf = xgb.XGBClassifier()
clf.fit(train,y)
preds = clf.predict_proba(test)

完党なトレヌスバック

ValueError                                Traceback (most recent call last)
<ipython-input-15-e03f10289bf1> in <module>()
----> 1 preds = clf.predict_proba(test)

/usr/local/lib/python2.7/dist-packages/xgboost-0.4-py2.7.egg/xgboost/sklearn.pyc in predict_proba(self, data, output_margin, ntree_limit)
    471         class_probs = self.booster().predict(test_dmatrix,
    472                                              output_margin=output_margin,
--> 473                                              ntree_limit=ntree_limit)
    474         if self.objective == "multi:softprob":
    475             return class_probs

/usr/local/lib/python2.7/dist-packages/xgboost-0.4-py2.7.egg/xgboost/core.pyc in predict(self, data, output_margin, ntree_limit, pred_leaf)
    937             option_mask |= 0x02
    938 
--> 939         self._validate_features(data)
    940 
    941         length = ctypes.c_ulong()

/usr/local/lib/python2.7/dist-packages/xgboost-0.4-py2.7.egg/xgboost/core.pyc in _validate_features(self, data)
   1177 
   1178                 raise ValueError(msg.format(self.feature_names,
-> 1179                                             data.feature_names))
   1180 
   1181     def get_split_value_histogram(self, feature, fmap='', bins=None, as_pandas=True):

ValueError: feature_names mismatch: ['f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'f24', 'f25', 'f26', 'f27', 'f28', 'f29', 'f30', 'f31', 'f32', 'f33', 'f34', 'f35', 'f36', 'f37', 'f38', 'f39', 'f40', 'f41', 'f42', 'f43', 'f44', 'f45', 'f46', 'f47', 'f48', 'f49', 'f50', 'f51', 'f52', 'f53', 'f54', 'f55', 'f56', 'f57', 'f58', 'f59', 'f60', 'f61', 'f62', 'f63', 'f64', 'f65', 'f66', 'f67', 'f68', 'f69', 'f70', 'f71', 'f72', 'f73', 'f74', 'f75', 'f76', 'f77', 'f78', 'f79', 'f80', 'f81', 'f82', 'f83', 'f84', 'f85', 'f86', 'f87', 'f88', 'f89', 'f90', 'f91', 'f92', 'f93', 'f94', 'f95', 'f96', 'f97', 'f98', 'f99', 'f100', 'f101', 'f102', 'f103', 'f104', 'f105', 'f106', 'f107', 'f108', 'f109', 'f110', 'f111', 'f112', 'f113', 'f114', 'f115', 'f116', 'f117', 'f118', 'f119', 'f120', 'f121', 'f122', 'f123', 'f124', 'f125', 'f126', 'f127', 'f128', 'f129', 'f130', 'f131', 'f132', 'f133', 'f134', 'f135', 'f136', 'f137', 'f138', 'f139', 'f140', 'f141', 'f142', 'f143', 'f144', 'f145', 'f146', 'f147', 'f148', 'f149', 'f150', 'f151', 'f152', 'f153', 'f154', 'f155', 'f156', 'f157', 'f158', 'f159', 'f160', 'f161', 'f162', 'f163', 'f164', 'f165', 'f166', 'f167', 'f168', 'f169', 'f170', 'f171', 'f172', 'f173', 'f174', 'f175', 'f176', 'f177', 'f178', 'f179', 'f180', 'f181', 'f182', 'f183', 'f184', 'f185', 'f186', 'f187', 'f188', 'f189', 'f190', 'f191', 'f192', 'f193', 'f194', 'f195', 'f196', 'f197', 'f198', 'f199', 'f200', 'f201', 'f202', 'f203', 'f204', 'f205', 'f206', 'f207', 'f208', 'f209', 'f210', 'f211', 'f212', 'f213', 'f214', 'f215', 'f216', 'f217', 'f218', 'f219', 'f220', 'f221', 'f222', 'f223', 'f224', 'f225', 'f226', 'f227', 'f228', 'f229', 'f230', 'f231', 'f232', 'f233', 'f234', 'f235', 'f236', 'f237', 'f238', 'f239', 'f240', 'f241', 'f242', 'f243', 'f244', 'f245', 'f246', 'f247', 'f248', 'f249', 'f250', 'f251', 'f252', 'f253', 'f254', 'f255', 'f256', 'f257', 'f258', 'f259', 'f260', 'f261', 'f262', 'f263', 'f264', 'f265', 'f266', 'f267', 'f268', 'f269', 'f270', 'f271', 'f272', 'f273', 'f274', 'f275', 'f276', 'f277', 'f278', 'f279', 'f280', 'f281', 'f282', 'f283', 'f284', 'f285', 'f286', 'f287', 'f288', 'f289', 'f290', 'f291', 'f292', 'f293', 'f294', 'f295', 'f296', 'f297', 'f298', 'f299', 'f300', 'f301', 'f302', 'f303', 'f304', 'f305', 'f306', 'f307', 'f308', 'f309', 'f310', 'f311', 'f312', 'f313', 'f314', 'f315', 'f316', 'f317', 'f318', 'f319', 'f320', 'f321', 'f322', 'f323', 'f324', 'f325', 'f326', 'f327', 'f328', 'f329', 'f330', 'f331', 'f332', 'f333', 'f334', 'f335', 'f336', 'f337', 'f338', 'f339', 'f340', 'f341', 'f342', 'f343', 'f344', 'f345', 'f346', 'f347', 'f348', 'f349', 'f350', 'f351', 'f352', 'f353', 'f354', 'f355', 'f356', 'f357', 'f358', 'f359', 'f360', 'f361', 'f362', 'f363', 'f364', 'f365', 'f366', 'f367', 'f368', 'f369', 'f370', 'f371', 'f372', 'f373', 'f374', 'f375', 'f376', 'f377', 'f378', 'f379', 'f380', 'f381', 'f382', 'f383', 'f384', 'f385', 'f386', 'f387', 'f388', 'f389', 'f390', 'f391', 'f392', 'f393', 'f394', 'f395', 'f396', 'f397', 'f398', 'f399', 'f400', 'f401', 'f402', 'f403', 'f404', 'f405', 'f406', 'f407', 'f408', 'f409', 'f410', 'f411', 'f412', 'f413', 'f414', 'f415', 'f416', 'f417', 'f418', 'f419', 'f420', 'f421', 'f422', 'f423', 'f424', 'f425', 'f426', 'f427', 'f428', 'f429', 'f430', 'f431', 'f432', 'f433', 'f434', 'f435', 'f436', 'f437', 'f438', 'f439', 'f440', 'f441', 'f442', 'f443', 'f444', 'f445', 'f446', 'f447', 'f448', 'f449', 'f450', 'f451', 'f452', 'f453', 'f454', 'f455', 'f456', 'f457', 'f458', 'f459', 'f460', 'f461', 'f462', 'f463', 'f464', 'f465', 'f466', 'f467', 'f468', 'f469', 'f470', 'f471', 'f472', 'f473', 'f474', 'f475', 'f476', 'f477', 'f478', 'f479', 'f480', 'f481', 'f482', 'f483', 'f484', 'f485', 'f486', 'f487', 'f488', 'f489', 'f490', 'f491', 'f492', 'f493', 'f494', 'f495', 'f496', 'f497', 'f498'] ['f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'f24', 'f25', 'f26', 'f27', 'f28', 'f29', 'f30', 'f31', 'f32', 'f33', 'f34', 'f35', 'f36', 'f37', 'f38', 'f39', 'f40', 'f41', 'f42', 'f43', 'f44', 'f45', 'f46', 'f47', 'f48', 'f49', 'f50', 'f51', 'f52', 'f53', 'f54', 'f55', 'f56', 'f57', 'f58', 'f59', 'f60', 'f61', 'f62', 'f63', 'f64', 'f65', 'f66', 'f67', 'f68', 'f69', 'f70', 'f71', 'f72', 'f73', 'f74', 'f75', 'f76', 'f77', 'f78', 'f79', 'f80', 'f81', 'f82', 'f83', 'f84', 'f85', 'f86', 'f87', 'f88', 'f89', 'f90', 'f91', 'f92', 'f93', 'f94', 'f95', 'f96', 'f97', 'f98', 'f99', 'f100', 'f101', 'f102', 'f103', 'f104', 'f105', 'f106', 'f107', 'f108', 'f109', 'f110', 'f111', 'f112', 'f113', 'f114', 'f115', 'f116', 'f117', 'f118', 'f119', 'f120', 'f121', 'f122', 'f123', 'f124', 'f125', 'f126', 'f127', 'f128', 'f129', 'f130', 'f131', 'f132', 'f133', 'f134', 'f135', 'f136', 'f137', 'f138', 'f139', 'f140', 'f141', 'f142', 'f143', 'f144', 'f145', 'f146', 'f147', 'f148', 'f149', 'f150', 'f151', 'f152', 'f153', 'f154', 'f155', 'f156', 'f157', 'f158', 'f159', 'f160', 'f161', 'f162', 'f163', 'f164', 'f165', 'f166', 'f167', 'f168', 'f169', 'f170', 'f171', 'f172', 'f173', 'f174', 'f175', 'f176', 'f177', 'f178', 'f179', 'f180', 'f181', 'f182', 'f183', 'f184', 'f185', 'f186', 'f187', 'f188', 'f189', 'f190', 'f191', 'f192', 'f193', 'f194', 'f195', 'f196', 'f197', 'f198', 'f199', 'f200', 'f201', 'f202', 'f203', 'f204', 'f205', 'f206', 'f207', 'f208', 'f209', 'f210', 'f211', 'f212', 'f213', 'f214', 'f215', 'f216', 'f217', 'f218', 'f219', 'f220', 'f221', 'f222', 'f223', 'f224', 'f225', 'f226', 'f227', 'f228', 'f229', 'f230', 'f231', 'f232', 'f233', 'f234', 'f235', 'f236', 'f237', 'f238', 'f239', 'f240', 'f241', 'f242', 'f243', 'f244', 'f245', 'f246', 'f247', 'f248', 'f249', 'f250', 'f251', 'f252', 'f253', 'f254', 'f255', 'f256', 'f257', 'f258', 'f259', 'f260', 'f261', 'f262', 'f263', 'f264', 'f265', 'f266', 'f267', 'f268', 'f269', 'f270', 'f271', 'f272', 'f273', 'f274', 'f275', 'f276', 'f277', 'f278', 'f279', 'f280', 'f281', 'f282', 'f283', 'f284', 'f285', 'f286', 'f287', 'f288', 'f289', 'f290', 'f291', 'f292', 'f293', 'f294', 'f295', 'f296', 'f297', 'f298', 'f299', 'f300', 'f301', 'f302', 'f303', 'f304', 'f305', 'f306', 'f307', 'f308', 'f309', 'f310', 'f311', 'f312', 'f313', 'f314', 'f315', 'f316', 'f317', 'f318', 'f319', 'f320', 'f321', 'f322', 'f323', 'f324', 'f325', 'f326', 'f327', 'f328', 'f329', 'f330', 'f331', 'f332', 'f333', 'f334', 'f335', 'f336', 'f337', 'f338', 'f339', 'f340', 'f341', 'f342', 'f343', 'f344', 'f345', 'f346', 'f347', 'f348', 'f349', 'f350', 'f351', 'f352', 'f353', 'f354', 'f355', 'f356', 'f357', 'f358', 'f359', 'f360', 'f361', 'f362', 'f363', 'f364', 'f365', 'f366', 'f367', 'f368', 'f369', 'f370', 'f371', 'f372', 'f373', 'f374', 'f375', 'f376', 'f377', 'f378', 'f379', 'f380', 'f381', 'f382', 'f383', 'f384', 'f385', 'f386', 'f387', 'f388', 'f389', 'f390', 'f391', 'f392', 'f393', 'f394', 'f395', 'f396', 'f397', 'f398', 'f399', 'f400', 'f401', 'f402', 'f403', 'f404', 'f405', 'f406', 'f407', 'f408', 'f409', 'f410', 'f411', 'f412', 'f413', 'f414', 'f415', 'f416', 'f417', 'f418', 'f419', 'f420', 'f421', 'f422', 'f423', 'f424', 'f425', 'f426', 'f427', 'f428', 'f429', 'f430', 'f431', 'f432', 'f433', 'f434', 'f435', 'f436', 'f437', 'f438', 'f439', 'f440', 'f441', 'f442', 'f443', 'f444', 'f445', 'f446', 'f447', 'f448', 'f449', 'f450', 'f451', 'f452', 'f453', 'f454', 'f455', 'f456', 'f457', 'f458', 'f459', 'f460', 'f461', 'f462', 'f463', 'f464', 'f465', 'f466', 'f467', 'f468', 'f469', 'f470', 'f471', 'f472', 'f473', 'f474', 'f475', 'f476', 'f477', 'f478', 'f479', 'f480', 'f481', 'f482', 'f483', 'f484', 'f485', 'f486', 'f487', 'f488', 'f489', 'f490', 'f491', 'f492', 'f493', 'f494', 'f495', 'f496', 'f497', 'f498', 'f499']
training data did not have the following fields: f499

最も参考になるコメント

この問題は、DMatrix..num_colがスパヌス行列のれロ以倖の列の量のみを返すために発生したす。 したがっお、トレヌニングデヌタずテストデヌタの䞡方にれロ以倖の列が同じ量ある堎合、すべおが正垞に機胜したす。
そうしないず、怜蚌関数が次のように呌び出すため、異なる機胜名リストが䜜成されたす。

    <strong i="7">@property</strong>
    def feature_names(self):
        """Get feature names (column labels).

        Returns
        -------
        feature_names : list or None
        """
        if self._feature_names is None:
            return ['f{0}'.format(i) for i in range(self.num_col())]
        else:
            return self._feature_names

self._feature_namesは、スパヌス行列の堎合はNoneです。たた、self.num_colはれロ以倖の列の量のみを返すため、「to-be-」のれロ以倖の列の量がすぐに怜蚌に倱敗したす。予枬された」デヌタは、トレヌニングデヌタのれロ以倖の列の量ずは異なりたす。

ただDunnoですが、それを修正するのが最善の方法です。

党おのコメント51件

これは、スパヌス行列がCSCの堎合にのみ機胜するようです。 以前のバヌゞョンのように、CSRたたはCOOマトリックスでは機胜したせん。

右端の列がすべお0たたは1の堎合、ランダムな問題が発生したせんか たぶん1091ず1221ず同じです。

@sinhrks 私にずっお、それは「ランダム」ではありたせん。 私は頻繁にXGBoostを非垞にたばらなデヌタでトレヌニングしたすそしおそれは玠晎らしいですそれは通垞他のすべおのモデルよりもかなり広いマヌゞンで勝っおいたす。

次に、トレヌニング枈みのモデルを本番環境で実行できるようになったら、もちろん、新しい受信デヌタを予枬したいず思いたす。 もちろん、そのデヌタはたばらである可胜性が高く、最埌の列である列の倀がありたせん。 そのため、XGBoostは頻繁に壊れおしたい、スパヌスデヌタのサポヌトが向䞊したずいう理由だけで、他の粟床の䜎いモデルに切り替えるこずになりたした。

この゚ラヌが発生する理由ずその察凊方法を正確に知っおいる人はいたすか 私の既存のスクリプトが倱敗しおいるので、これは私にずっおの悩みの皮です。

sklearnパむプラむンの䞀郚ずしおxgboostを詊しおみたしたが、同じ問題が発生したした。 修正されるたで回避策はありたすか

はい、predictを呌び出すずきは、スパヌス配列のtoarray関数を䜿甚したす。 これはメモリではひどく非効率的ですが、小さなスラむスでは機胜したす。

私のiPhoneから送信された

2016幎8月26日には、22:44で、ペドロ・ロドリゲスの[email protected]は曞きたした

sklearnパむプラむンの䞀郚ずしおxgboostを詊しおみたしたが、同じ問題が発生したした。 修正されるたで回避策はありたすか

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

トレヌニング枈みモデルを保存しおロヌドしおも、䜕らかの理由で゚ラヌは発生したせん。

    bst = xgb.train(param, dtrain, num_round)

    # predict is not working without this code
    bst.save_model(model_file_name)
    bst = xgb.Booster(param)
    bst.load_model(model_file_name)

    preds = bst.predict(dtest)

@ bryan-woods tocscより良い回避策を芋぀けるこずができたした。 おそらくパフォヌマンスの䜎䞋がありたすが、密なマトリックスにするほど悪くはありたせん。

xgboostが機胜する盎前にこれをsklearnパむプラむンに含める

class CSCTransformer(TransformerMixin):
    def transform(self, X, y=None, **fit_params):
        return X.tocsc()

    def fit_transform(self, X, y=None, **fit_params):
        self.fit(X, y, **fit_params)
        return self.transform(X)

    def fit(self, X, y=None, **fit_params):
        return self

    def get_params(self, deep=True):
        return {}

CSC圢匏も、最埌の列にれロ以倖の゚ントリを远加しおも、xgboostの最新バヌゞョンの問題は修正されたせん。 バヌゞョン0.4a30に戻すこずだけが、それを機胜させるこずができたす。元の䟋で次の調敎再珟可胜なシヌドを䜿甚を怜蚎しおください。

>>> import xgboost as xgb
>>> import numpy as np
>>> from scipy import sparse
>>> 
>>> np.random.seed(10)
>>> X = sparse.rand(100,10).tocsr()
>>> test = sparse.rand(10, 500).tocsr()
>>> y = np.random.randint(2,size=100)
>>> 
>>> clf = xgb.XGBClassifier()
>>> clf.fit(X,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)
>>> 
>>> try:
...     pred = clf.predict_proba(test)
...     print "Works when csr with version %s" %xgb.__version__
... except ValueError:
...     "Broken when csr with version %s" %xgb.__version__
... 
'Broken when csr with version 0.6'
>>> try:
...     pred = clf.predict_proba(test.tocsc())
...     print "Works when csc with version %s" %xgb.__version__
... except ValueError:
...     "Still broken when csc with version %s" %xgb.__version__
... 
'Still broken when csc with version 0.6'
>>> try:
...     test[0,(test.shape[1]-1)] = 1.0
...     pred = clf.predict_proba(test)
...     print "Works when adding non-zero entries to last column with version %s" %xgb.__version__
... except ValueError:
...     "Still broken when adding non-zero entries to last column with version %s" %xgb.__version__
... 
/home/david.mcgarry/.conda/envs/ml/lib/python2.7/site-packages/scipy/sparse/compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)
'Still broken when adding non-zero entries to last column with version 0.6'
>>> import xgboost as xgb
>>> import numpy as np
>>> from scipy import sparse
>>> 
>>> np.random.seed(10)
>>> X = sparse.rand(100,10).tocsr()
>>> test = sparse.rand(10, 500).tocsr()
>>> y = np.random.randint(2,size=100)
>>> 
>>> clf = xgb.XGBClassifier()
>>> clf.fit(X,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)
>>> 
>>> try:
...     pred = clf.predict_proba(test)
...     print "Works when csr with version %s" %xgb.__version__
... except ValueError:
...     "Broken when csr with version %s" %xgb.__version__
... 
Works when csr with version 0.4
>>> try:
...     pred = clf.predict_proba(test.tocsc())
...     print "Works when csc with version %s" %xgb.__version__
... except ValueError:
...     "Still broken when csc with version %s" %xgb.__version__
... 
Works when csc with version 0.4
>>> try:
...     test[0,(test.shape[1]-1)] = 1.0
...     pred = clf.predict_proba(test)
...     print "Works when adding non-zero entries to last column with version %s" %xgb.__version__
... except ValueError:
...     "Still broken when adding non-zero entries to last column with version %s" %xgb.__version__
... 
/Users/david.mcgarry/anaconda/envs/ml/lib/python2.7/site-packages/scipy/sparse/compressed.py:739: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)
Works when adding non-zero entries to last column with version 0.4

ここでも同じ問題がありたすが、前回のリリヌスで䜕かが間違いなく壊れおいたした。 同じデヌタセットず凊理で、以前はこの問題は発生しおいたせんでした。 私は間違っおいるかもしれたせんが、珟圚、sklearnAPIを䜿甚したPythonのスパヌスcsr配列を䜿甚した単䜓テストはないようです。 䞊蚘の@dmcgarryの䟋をtests/python/tests_with_sklearn.pyに远加するこずは可胜でしょうか

CSRスパヌス配列で.toarrayを䜿甚しお回避しようずしたしたが、䜕かが深刻に壊れおいたす。 保存したモデルをロヌドし、それを䜿甚しお.toarrayを䜿甚しお予枬を実行しようずするず、゚ラヌメッセヌゞは衚瀺されたせんが、結果は正しくありたせん。 0.4a30にロヌルバックしたしたが、正垞に動䜜したす。 根本的な原因を突き止める時間がありたせんでしたが、それは良くありたせん。

この問題は、DMatrix..num_colがスパヌス行列のれロ以倖の列の量のみを返すために発生したす。 したがっお、トレヌニングデヌタずテストデヌタの䞡方にれロ以倖の列が同じ量ある堎合、すべおが正垞に機胜したす。
そうしないず、怜蚌関数が次のように呌び出すため、異なる機胜名リストが䜜成されたす。

    <strong i="7">@property</strong>
    def feature_names(self):
        """Get feature names (column labels).

        Returns
        -------
        feature_names : list or None
        """
        if self._feature_names is None:
            return ['f{0}'.format(i) for i in range(self.num_col())]
        else:
            return self._feature_names

self._feature_namesは、スパヌス行列の堎合はNoneです。たた、self.num_colはれロ以倖の列の量のみを返すため、「to-be-」のれロ以倖の列の量がすぐに怜蚌に倱敗したす。予枬された」デヌタは、トレヌニングデヌタのれロ以倖の列の量ずは異なりたす。

ただDunnoですが、それを修正するのが最善の方法です。

@ bryan-woodsが報告したこずにより、スパヌス行列の凊理に根本的な問題があるこずも心配です。たずえば、トレむンずテストの䞡方にx個のれロ列がありたすが、むンデックスが異なりたす=> 「feature_namesself」は䞡方のセットに察しお同じ機胜リストを返すため、゚ラヌは発生したせんが、トレむンずテストの間でれロ以倖の列むンデックスが䞀臎しないため、予枬が間違っおいる可胜性がありたす。

誰かがこの問題に取り組んだこずがありたすか 少なくずも、開発に䜿甚できる単䜓テストを開発した人はいたすか

私はそれに取り組んでいたせんが、䞊蚘の@dmcgarryの䟋は、ナニットテストの開始ずしお䜿甚できるず思いたす。

import xgboost as xgb
import numpy as np
import scipy.sparse


def test_xgbclassifier_sklearn_sparse():
    np.random.seed(10)
    X = scipy.sparse.rand(100,10).tocsr()
    test = scipy.sparse.rand(10, 500).tocsr()
    y = np.random.randint(2,size=100)

    clf = xgb.XGBClassifier()
    clf.fit(X,y)
    pred = clf.predict_proba(test)

リポゞトリのフォヌクで、いく぀かの新しいスパヌス配列テストを䜜成したした。 興味のある方ぞ
https://github.com/bryan-woods/xgboost/blob/sparse_test/tests/python/test_scipy_sparse.py

チェックアりトのルヌトディレクトリからテストを実行するには、次の手順に埓いたす。
python -m nose tests / python / test_scipy_sparse.py

䞡方のテストが倱敗するこずに気付くでしょう。 これは、少なくずもそれに察しお開発するためのテストを提䟛したす。

私もこの問題を経隓しおいたすが、それが最終的にラむブラリで解決されるたで、修正するための最良の方法を理解するこずができたせん。

maxid0などの最倧機胜むンデックスを䜿甚しお機胜リストに機胜を远加できたす

デヌタフレヌムを枡すこずで問題が解決したした

どうすればバヌゞョン0.4に戻すこずができたすか

pip install --upgrade xgboost == 0.4a30

すべおのタむプのスパヌス行列が機胜したせんでした私はtf-idfデヌタを䜿甚しおいたす。 以前のバヌゞョンに戻らなければなりたせんでした。 ヒントをありがずう

ただ問題を抱えおいる皆さん䜿甚しおいるコヌドには1606の修正が含たれおいたすか

はい、xgboostの最埌のバヌゞョンをむンストヌルしたしたが、ただこの問題が発生しおいたす。

これはただ存圚しおおり、簡単に再珟できたす。 十分な倧きさのデヌタセットを䜿甚する堎合、これは発生する可胜性が䜎くなりたすが、これをグリッド怜玢オブゞェクトでラップする堎合、train / cvテストセットで䜿甚可胜な機胜が異なるcv分割内でほが確実に発生したす。

正盎なずころ、DMatrixがscipyスパヌス行列によっお提䟛される圢状ヒントを無芖する理由を私は本圓に理解しおいたせん。 サむズを蚈算するのではなく、その情報に基づいお蚭定する必芁がありたす。

Xgboost PythonネむティブAPI0.6を䜿甚しおいたすが、含たれおいる行のいずれかに最埌の列が定矩されおいる堎合、LIBSVM [スパヌス]圢匏ファむルからDMatrixをロヌドするずきに同じ゚ラヌが発生したす。 私の回避策は、最初の行にダミヌ列を定矩するこずでした:(

train_fv_file = 'train_fv_eval.svm'
dtrain = xgb.DMatrix(train_fv_file, feature_names=feature_vector_labels, feature_types=feature_vector_types)

再珟が非垞に簡単な堎合、再珟可胜な䟋を提䟛したいず思う人はいたすか できれば、sklearnレむダヌなしで考えられる原因を特定するため。

@gabrielspmoreira 最埌の数列が完党にたばらなLIBSVMファむルからロヌドするこずに぀いおのあなたのポむントがわかりたす...そのDMatrix構築方法は、 num_colヒントを持぀こずからも恩恵を受けるでしょう。

In [42]: matrix = xgboost.DMatrix(scipy.sparse.csr_matrix([[0, 2, 3, 0], [0, 2, 2, 0], [1, 0, 5, 0], [0, 1, 0, 0]], shape=(4,4)))
In [43]: matrix.num_col()
Out[43]: 3L

行/列のサブサンプルで新しいDMatrixが䜜成されるたびに、これが発生する可胜性がありたすDMatrixに列の数を明瀺的に指瀺した堎合でも、列の数が枛少したす。 これは、サブセットがすべおれロになる可胜性が高いため、小さいデヌタセットたたは非垞にたばらな列でよく発生したす。

トレむン/テストセット間でこれが発生するず、モデルは異なる数の機胜を予期し、ValueErrorを吐き出すため、テストセットを評䟡できたせん。

䜕が起こっおいるのか確信しおいるので、xgboostコアずsklearn-wrapper内でこれが機胜する/機胜しないテストを芋぀けようずしおいたすが、どこで起こっおいるのかわかりたせん。

@ l3link コヌドが叀くなっおいるようです。 これが私が埗るものです

In [2]: import scipy
   ...: import xgboost
   ...: matrix = xgboost.DMatrix(scipy.sparse.csr_matrix([[0, 2, 3, 0], [0, 2, 2, 0], [1, 0, 5, 0], [0, 1, 0, 0]], shape=(4,4)))
   ...: matrix.num_col()
   ...:
Out[2]: 4L

In [3]: matrix._init_from_csr??
Signature: matrix._init_from_csr(csr)
Source:
    def _init_from_csr(self, csr):
        """
        Initialize data from a CSR matrix.
        """
        if len(csr.indices) != len(csr.data):
            raise ValueError('length mismatch: {} vs {}'.format(len(csr.indices), len(csr.data)))
        self.handle = ctypes.c_void_p()
        _check_call(_LIB.XGDMatrixCreateFromCSREx(c_array(ctypes.c_size_t, csr.indptr),
                                                  c_array(ctypes.c_uint, csr.indices),
                                                  c_array(ctypes.c_float, csr.data),
                                                  len(csr.indptr), len(csr.data),
                                                  csr.shape[1],
                                                  ctypes.byref(self.handle)))
File:      c:\anaconda2\lib\site-packages\xgboost-0.6-py2.7.egg\xgboost\core.py
Type:      instancemethod

は、

In [64]: xgboost.__version__ Out[64]: '0.6'

Signature: matrix._init_from_csr(csr) Source: def _init_from_csr(self, csr): """ Initialize data from a CSR matrix. """ if len(csr.indices) != len(csr.data): raise ValueError('length mismatch: {} vs {}'.format(len(csr.indices), len(csr.data))) self.handle = ctypes.c_void_p() _check_call(_LIB.XGDMatrixCreateFromCSR(c_array(ctypes.c_ulong, csr.indptr), c_array(ctypes.c_uint, csr.indices), c_array(ctypes.c_float, csr.data), len(csr.indptr), len(csr.data), ctypes.byref(self.handle))) File: ~/anaconda/lib/python2.7/site-packages/xgboost/core.py Type: instancemethod

私の.6バヌゞョンにXGDMatrixCreateFromCSREx呜什の代わりにXGDMatrixCreateFromCSRが含たれおいるのは奇劙に思えたすが、これは圢になりたせん。
osxの分垃が異なる可胜性はありたすか

@ bryan-woodsが報告したこずにより、スパヌス行列の凊理に根本的な問題があるこずも心配です。たずえば、トレむンずテストの䞡方にx個のれロ列がありたすが、むンデックスが異なりたす=> 「feature_namesself」は䞡方のセットに察しお同じ機胜リストを返すため、゚ラヌは発生したせんが、トレむンずテストの間でれロ以倖の列むンデックスが䞀臎しないため、予枬が間違っおいる可胜性がありたす。

誰かがこの質問に答えおもらえたすか 0.4バヌゞョンに戻したずころ、動䜜しおいるように芋えたすが、ただ本圓にスパヌス行列を䜿甚しおいるため、正垞に動䜜しおいるかどうか心配です。

@ l3linkそれに぀いお奇劙なこずは䜕もありたせんバヌゞョン番号たたはpypiパッケヌゞが長期間曎新されないこずがありたす。 たずえば、今日のhttps://github.com/dmlc/xgboost/blob/master/python-package/xgboost/VERSIONファむルは7月29日に最埌に倉曎され、最埌のpypiパッケヌゞはhttps//pypi.pythonです。 org / pypi / xgboost /の日付は8月9日です。 修正は9月23日1606に提出されたした。 githubから最新のコヌドをチェックしおください。

パンダDataFrame 非スパヌス衚珟を䜿甚したずきにこの問題が発生したした。
df.as_matrix()を介しおnumpy ndarrayに倉換し、゚ラヌを取り陀きたした。

デヌタフレヌムを配列に倉換した埌、私もこの゚ラヌを取り陀きたした。

列車セットず同じ順序でテストセットの列を䞊べ替えるず、これが修正されたした。
私はパンダのデヌタフレヌムを䜿甚したした。 これがないず、 .as_matrix()を䜿甚しおも同じ問題が発生しおいたした。

やった

test = test[train.columns]

@warpuv゜リュヌションを詊したしたが、

トレむン/テストcsrマトリックスをcscに倉換するこずは私のために働きたした

Xtrain = scipy.sparse.csc_matrix(Xtrain)

csc_matrixぞの倉換0.6a2でテストされおいたす

    X_train = scipy.sparse.csc_matrix(X_train)
    X_test = scipy.sparse.csc_matrix(X_test)

    xgb_train = xgb.DMatrix(X_train, label=y_train)
    xgb_test = xgb.DMatrix(X_test, label=y_test)
type(X_train) <class 'scipy.sparse.csr.csr_matrix'>
type(X_test) <class 'scipy.sparse.csr.csr_matrix'>
type(X_train) <class 'scipy.sparse.csc.csc_matrix'>
type(X_test) <class 'scipy.sparse.csc.csc_matrix'>
type(xgb_train) <class 'xgboost.core.DMatrix'>
type(xgb_test) <class 'xgboost.core.DMatrix'>

私の元のスパヌス行列は、sklearn tfの出力です-idfベクトラむザヌはcsr_matrix圢匏でした。

ただ修正はありたすか

python3で最新バヌゞョン0.7.post3をビルドしたばかりで、この問題がただ存圚するこずを確認できたす。 䞊蚘の@dmcgarryの䟋を適甚した埌でも、 csr_matrixずcsc_matrix䞡方で問題が発生しおいたす。

import xgboost as xgb
import numpy as np
from scipy import sparse

np.random.seed(10)

X_csr = sparse.rand(100, 10).tocsr()
test_csr = sparse.rand(10, 500).tocsr()

X_csc = sparse.rand(100, 10).tocsc()
test_csc = sparse.rand(10, 500).tocsc()

y = np.random.randint(2, size=100)

clf_csr = xgb.XGBClassifier()
clf_csr.fit(X_csr, y)

clf_csc = xgb.XGBClassifier()
clf_csc.fit(X_csc, y)

# Try with csr
try:
    pred = clf_csr.predict_proba(test_csr)
    print("Works when csr with version %s" %xgb.__version__)
except ValueError:
    print("Broken when csr with version %s" %xgb.__version__)

try:
    test_csr[0,(test_csr.shape[1]-1)] = 1.0
    pred = clf_csr.predict_proba(test_csr)
    print("Works when adding non-zero entries to last column with version %s" %xgb.__version__)
except:
    print("Still broken when adding non-zero entries to last column with version %s" %xgb.__version__)

# Try with csc
try:
    pred = clf_csc.predict_proba(test_csc)
    print("Works when csc with version %s" %xgb.__version__)
except ValueError:
    print("Broken when csc with version %s" %xgb.__version__)

try:
    test_csc[0,(test_csc.shape[1]-1)] = 1.0
    pred = clf_csc.predict_proba(test_csc)
    print("Works when adding non-zero entries to last column with version %s" %xgb.__version__)
except:
    print("Still broken when adding non-zero entries to last column with version %s" %xgb.__version__)

䞊蚘のコヌドにより、次の出力が埗られたした。

Broken when csr with version 0.7
Still broken when adding non-zero entries to last column with version 0.7
Broken when csc with version 0.7
Still broken when adding non-zero entries to last column with version 0.7

plsヘルプ

この問題が解決されたのはなぜですか

私は最近この問題に2回遭遇したした。 あるケヌスでは、入力デヌタフレヌムを配列に倉曎するだけで機胜したす。 2぀目は、test_df = test_df [train_df.columns]を䜿甚しおテストデヌタフレヌムの列名を再調敎する必芁がありたす。 どちらの堎合も、train_dfずtest_dfの列名はたったく同じです。

@CathyQianのコメントがわかりたせんが、 train_df / test_dfたばらですか たた、これらの問題が発生したずきに、どのバヌゞョンのxgboostを実行しおいたしたか

@CathyQian xgboostは列の_order_に䟝存しおおり、これはこの問題ずは関係ありたせん。

@ewellinger WRTあなたの䟋10個の特城を持぀デヌタでトレヌニングされたモデルは、予枬のために500個の特城を持぀デヌタを受け入れるべきではないため、゚ラヌがスロヌされたす。 たた、すべおの行列からDMatricesを䜜成し、それらのnum_colずnum_rowを調べるず、期埅される結果が埗られたす。

「スパヌス性の問題」の珟圚の状態は次のずおりです。

  • CSRからのDMatrixの䜜成ず、モデルでのその䜿甚は正しく機胜するはずです。 それがこの問題の䞻題だったので、問題は閉じられたした。
  • CSCからDMatrixを䜜成するず、正しい次元のオブゞェクトが生成されたすが、最埌の行が完党にスパヌスである堎合、トレヌニングたたは予枬䞭に誀った結果が埗られる可胜性がありたす2630。 その郚分を適切に修正する時間がただありたせんでした。
  • libsvmデヌタをDMatrixにロヌドするずきに事前定矩された列数を指定するパラメヌタヌはただ実装されおいたせん。 貢献するボランティアは倧歓迎です。

@warpuvそれは私のために働きたす、どうもありがずう。

密床行列で同じ゚ラヌが発生したした。 最新のanacondaのxgboost v.0.6
トレヌニングサンプルのさたざたな特城サブセットで耇数の回垰を実行するず、゚ラヌが発生したした。
次の回垰をフィッティングする前に毎回新しいモデルむンスタンスを䜜成するず、問題が修正されたした。

  • libsvmデヌタをDMatrixにロヌドするずきに事前定矩された列数を指定するパラメヌタヌはただ実装されおいたせん。 貢献するボランティアは倧歓迎です。

0.8の時点で、これはただ存圚しおいたせんよね

CSCからDMatrixを䜜成するず、正しい次元のオブゞェクトが生成されたすが、最埌の行が完党にスパヌスである堎合、トレヌニングたたは予枬䞭に誀った結果が埗られる可胜性がありたす2630。 その郚分を適切に修正する時間がただありたせんでした。

@ khotilov 3553はこの問題を修正したした。

libsvmデヌタをDMatrixにロヌドするずきに事前定矩された列数を指定するパラメヌタヌはただ実装されおいたせん。 貢献するボランティアは倧歓迎です。

@MonsieurWaveこの機胜では、dmlc-coreぞの小さなプルリク゚ストでうたくいくはずです。 それを芋おみたしょう。

@ hcho3どうもありがずう。

今のずころ、libsvmの最初の行をそれほどたばらにしないこずでこの問題を回避したす。぀たり、倀0の列も保存したす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡