Xgboost: feature_names غير متطابق أثناء استخدام المصفوفات المتفرقة في بايثون

تم إنشاؤها على ٣١ مايو ٢٠١٦  ·  51تعليقات  ·  مصدر: dmlc/xgboost

تظهر لي قيمة ValueError: feature_names mismatch أثناء تدريب xgboost باستخدام مصفوفات متفرقة في لغة python.
إصدار 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 لا شيء للمصفوفات المتفرقة ، ولأن self.num_col () يُرجع فقط مقدار الأعمدة غير الصفرية ، يفشل التحقق من الصحة بمجرد أن مقدار الأعمدة غير الصفرية في "to-be- المتوقعة "تختلف البيانات عن كمية الأعمدة غير الصفرية في بيانات التدريب.

Dunno حتى الآن ، حيث أفضل مكان لإصلاح ذلك بالرغم من ذلك.

ال 51 كومينتر

يبدو أن هذا لا يعمل إلا إذا كانت المصفوفات المتفرقة هي CSC. لا يعمل مع مصفوفات CSR أو COO مثل الإصدارات السابقة.

أليست مشكلة عشوائية تحدث عندما تكون الأعمدة الموجودة في أقصى اليمين كلها 0 أو 1؟ ربما هو نفسه # 1091 و # 1221.

sinhrks : بالنسبة لي ، هذا ليس "عشوائي". كثيرًا ما أقوم بتدريب XGBoost على بيانات متفرقة للغاية (وهو أمر رائع! إنه يتفوق عادةً على جميع الطرز الأخرى وبهامش كبير جدًا).

بعد ذلك ، بمجرد تشغيل النموذج المدرب في الإنتاج ، سأرغب بالطبع في عمل تنبؤات بشأن قطعة جديدة من البيانات الواردة. من المحتمل جدًا أن تكون هذه البيانات متفرقة وليس لها قيمة لأي عمود يصادف أن يكون العمود الأخير. لذا ، فإن XGBoost الآن تتعطل كثيرًا بالنسبة لي ، ووجدت نفسي أتحول إلى طرز أخرى (أقل دقة) ، وذلك ببساطة لأن لديهم دعمًا أفضل للبيانات المتفرقة.

هل يعرف أحد بالضبط سبب ظهور هذا الخطأ الآن وكيفية معالجته؟ هذه نقطة ألم بالنسبة لي لأن البرامج النصية الموجودة لدي تفشل.

أقدم تجربة xgboost كجزء من خط أنابيب sklearn وواجهت نفس المشكلة. هل هناك حل حتى يتم إصلاحه؟

نعم ، عند استدعاء التنبؤ ، استخدم الدالة toarray () للمصفوفة المتفرقة. إنه غير فعال بشكل رهيب مع الذاكرة ، لكنه قابل للتطبيق مع شرائح صغيرة.

مرسل من الايفون الخاص بي

في 26 آب (أغسطس) 2016 ، الساعة 10:44 مساءً ، كتب بيدرو رودريغيز [email protected] :

أقدم تجربة xgboost كجزء من خط أنابيب sklearn وواجهت نفس المشكلة. هل هناك حل حتى يتم إصلاحه؟

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو اعرضها على 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 . من المحتمل أن يكون هناك بعض عقوبة الأداء ولكن ليس بالسوء الذي يجعله مصفوفة كثيفة.

بما في ذلك في خط أنابيب sklearn الخاص بي قبل عمل xgboost مباشرة

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

نفس المشكلة هنا ، بالتأكيد تم كسر شيء ما في الإصدار الأخير. لم تواجه هذه المشكلة من قبل مع نفس مجموعة البيانات والمعالجة. قد أكون مخطئًا ، لكن يبدو أنه لا توجد حاليًا اختبارات وحدة مع مصفوفات csr متفرقة في Python باستخدام واجهة برمجة تطبيقات sklearn. هل يمكن إضافة مثال dmcgarry أعلاه إلى tests/python/tests_with_sklearn.py ؟

حاولت حلها باستخدام .toarray () مع مصفوفات CSR المتفرقة ، ولكن هناك شيء ما معطل بشكل خطير. إذا قمت بتحميل نموذج محفوظ وحاولت استخدامه لعمل تنبؤات باستخدام .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 لا شيء للمصفوفات المتفرقة ، ولأن 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 / python / test_scipy_sparse.py

ستلاحظ أن كلا الاختبارين يفشلان. سيوفر هذا على الأقل اختبارًا للتطوير ضده.

أواجه هذه المشكلة أيضًا ، لكنني لم أتمكن من معرفة أفضل طريقة لإصلاحها حتى يتم حلها أخيرًا في lib.

يمكنك إضافة ميزة إلى قائمة الميزات الخاصة بك باستخدام فهرس ميزات بحد أقصى ، مثل maxid: 0

أدى تمرير إطار البيانات إلى حل المشكلة بالنسبة لي

كيف يمكنني العودة إلى الإصدار 0.4؟

تثبيت النقطة - ترقية xgboost == 0.4a30

جميع أنواع المصفوفات المتفرقة لا تعمل معي (أنا أعمل مع بيانات tf-idf). كان علي العودة إلى الإصدار السابق. شكرا على الاكرامية!

جميعكم ممن لا يزالون يواجهون مشكلات: هل يشتمل الرمز الذي تستخدمه على الإصلاحات في # 1606؟

نعم ، لقد قمت بتثبيت الإصدار الأخير من xgboost وما زلت أواجه هذه المشكلة.

لا يزال هذا موجودًا ويمكن استنساخه بسهولة. إذا كنت تستخدم مجموعة بيانات كبيرة بما يكفي ، فمن غير المرجح أن يحدث هذا ، ولكن إذا كنت تقوم بتغليف هذا في كائن بحث شبكي ، فإنه يحدث بشكل شبه مؤكد داخل انقسام السيرة الذاتية حيث تختلف الميزات المتوفرة في مجموعات اختبار القطار / السيرة الذاتية.

بصراحة ، لا أفهم حقًا سبب تجاهل DMatrix تلميح الشكل الذي توفره المصفوفات المتفرقة. يجب أن يحدد الحجم بناءً على تلك المعلومات بدلاً من حسابها.

أنا أستخدم Xgboost Python API الأصلي (0.6) ولدي نفس الخطأ عند تحميل DMatrix من ملف تنسيق LIBSVM [متفرق] ، إذا كان أي من الصفوف يحتوي على آخر عمود محدد. كان الحل البديل لي هو تحديد عمود وهمي في الصف الأول :(

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 core و 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 الخاص بي يحتوي على XGDMatrixCreateFromCSR بدلاً من تعليمات XGDMatrixCreateFromCSREx ، والتي لا تأخذ الشكل.
هل من الممكن أن يختلف توزيع osx؟

أخشى أيضًا أن هناك مشكلة أساسية في معالجة المصفوفة المتفرقة ، بسبب ما ذكره @ bryan-woods: دعنا نقول ، لدينا x صفر أعمدة سواء في القطار أو في الاختبار ، ولكن مع مؤشرات مختلفة => سيكون هناك لا يكون هناك خطأ ، لأن "feature_names (self)" ترجع نفس قائمة الميزات لكلتا المجموعتين ، لكن التنبؤات تكون خاطئة ، بسبب عدم تطابق فهارس الأعمدة غير الصفرية بين القطار والاختبار.

هل يمكن لأحد أن يجيب على هذا السؤال من فضلك؟ لقد عدت إلى الإصدار 0.4 والآن يبدو أنه يعمل ولكن أخشى أنه يعمل بشكل صحيح لأنني ما زلت أستخدم المصفوفات المتناثرة حقًا.

@ l3link لا شيء غريب حيال ذلك: أرقام الإصدارات (أو حزم pypi) لا يتم تحديثها أحيانًا لفترة طويلة. على سبيل المثال ، تم تغيير ملف https://github.com/dmlc/xgboost/blob/master/python-package/xgboost/VERSION اعتبارًا من اليوم آخر مرة في 29 يوليو ، وآخر حزمة pypi https: //pypi.python. org / pypi / xgboost / مؤرخ في 9 أغسطس. بينما تم تقديم الإصلاح في 23 سبتمبر # 1606. يرجى التحقق من أحدث كود من جيثب.

واجهت هذه المشكلة عندما استخدمت الباندا DataFrame (تمثيل غير متفرق).
لقد حولته إلى numpy ndarray عبر df.as_matrix() ، وتخلصت من الخطأ.

لقد تخلصت أيضًا من هذا الخطأ بعد تحويل dataframe إلى مجموعة.

إعادة ترتيب الأعمدة في مجموعة الاختبار بنفس ترتيب مجموعة القطار قد أصلحت هذا الأمر بالنسبة لي.
لقد استخدمت إطارات بيانات Pandas. بدون هذا ، كان استخدام .as_matrix() يطرح نفس المشكلة.

فعلت:

test = test[train.columns]

لقد جربت حل warpuv ونجح . بياناتي كبيرة ، لا يمكنني تحميلها في الذاكرة لإعادة ترتيب الأعمدة.

نجح تحويل مصفوفات تدريب / اختبار المسؤولية الاجتماعية للشركات إلى 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 vectorizer كانت بتنسيق csr_matrix .

هل هناك أي إصلاح حتى الآن؟

لقد قمت للتو ببناء أحدث إصدار (0.7.post3) في python3 ويمكنني أن أؤكد أن هذه المشكلة لا تزال قائمة. بعد تكييف مثال 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

الرجاء المساعدة

لماذا تم إغلاق هذه القضية؟

لقد صادفت هذه المشكلة مرتين مؤخرًا. في حالة واحدة ، أقوم ببساطة بتغيير إطار بيانات الإدخال إلى صفيف وهو يعمل. بالنسبة للثاني ، يجب أن أعيد محاذاة أسماء أعمدة إطار بيانات الاختبار باستخدام test_df = test_df [train_df.columns]. في كلتا الحالتين ، يكون لكل من train_df و test_df نفس أسماء الأعمدة تمامًا.

أعتقد أنني لا أفهم تعليقك CathyQian ، هل تلك train_df / test_df قليلة؟ أيضًا ، ما هو إصدار xgboost الذي كنت تستخدمه عندما واجهت هذه المشكلات؟

يعتمد CathyQian xgboost على _order_ من الأعمدة ، وهذا ليس له علاقة بهذه المشكلة.

ewellinger WRT

الحالة الحالية "لقضايا التفرقة" هي:

  • يجب أن يعمل إنشاء DMatrix من CSR واستخدامه في النموذج بشكل صحيح. تم إغلاق القضية لأن ذلك كان موضوع هذه القضية.
  • ينتج عن إنشاء DMatrix من CSC كائنًا بأبعاد صحيحة ، ولكنه قد يعطي نتائج غير صحيحة أثناء التدريب أو التنبؤ عندما تكون الصفوف الأخيرة متناثرة تمامًا # 2630. لم يكن لدي الوقت بعد لإصلاح هذا الجزء بشكل صحيح.
  • معلمة لتحديد عدد محدد مسبقًا من الأعمدة عند تحميل بيانات libsvm في DMatrix لم يتم تنفيذها بعد. نرحب بالمتطوعين للمساهمة.

warpuv إنه يعمل بالنسبة لي ، شكرًا جزيلاً.

كان لديه نفس الخطأ ، مع مصفوفات كثيفة. (xgboost v.0.6 من أحدث أناكوندا.)
حدث خطأ عندما أجريت العديد من الانحدارات على مجموعات فرعية مختلفة من الميزات في عينة التدريب.
يؤدي إنشاء مثيل نموذج جديد في كل مرة قبل ملاءمة الانحدار التالي إلى إصلاح المشكلة.

  • معلمة لتحديد عدد محدد مسبقًا من الأعمدة عند تحميل بيانات libsvm في DMatrix لم يتم تنفيذها بعد. نرحب بالمتطوعين للمساهمة.

اعتبارًا من 0.8 ، ما زال هذا غير موجود ، أليس كذلك؟

ينتج عن إنشاء DMatrix من CSC كائنًا بأبعاد صحيحة ، ولكنه قد يعطي نتائج غير صحيحة أثناء التدريب أو التنبؤ عندما تكون الصفوف الأخيرة متناثرة تمامًا # 2630. لم يكن لدي الوقت بعد لإصلاح هذا الجزء بشكل صحيح.

@ khotilov # 3553 أصلح هذه المشكلة.

معلمة لتحديد عدد محدد مسبقًا من الأعمدة عند تحميل بيانات libsvm في DMatrix لم يتم تنفيذها بعد. نرحب بالمتطوعين للمساهمة.

MonsieurWave بالنسبة لهذه الميزة ، يجب أن يؤدي طلب سحب صغير إلى dmlc-core الغرض. اسمحوا لي أن أنظر إليها.

@ hcho3 شكرا جزيلا.

في الوقت الحالي ، أقوم بالتحايل على هذه المشكلة عن طريق جعل السطر الأول من libsvm الخاص بي غير متناثر جدًا ، على سبيل المثال: حفظ حتى الأعمدة بالقيمة 0.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات