Xgboost: feature_names tidak cocok saat menggunakan matriks sparse dengan Python

Dibuat pada 31 Mei 2016  ·  51Komentar  ·  Sumber: dmlc/xgboost

Saya mendapatkan ValueError: feature_names mismatch saat melatih xgboost dengan matriks sparse di python.
Versi xgboost terbaru dari git. Versi lama tidak memberikan kesalahan ini. Kesalahan dikembalikan selama waktu prediksi.

kode

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)

Pelacakan balik penuh:

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

Komentar yang paling membantu

Masalah terjadi karena DMatrix..num_col() hanya mengembalikan jumlah kolom bukan nol dalam matriks sparse. Oleh karena itu, jika data latih & uji memiliki jumlah kolom bukan nol yang sama, semuanya berfungsi dengan baik.
Jika tidak, Anda akan mendapatkan daftar nama fitur yang berbeda, karena fungsi validasi memanggil:

    <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 adalah None untuk matriks sparse, dan karena self.num_col() hanya mengembalikan jumlah kolom bukan nol, validasi gagal segera setelah jumlah kolom bukan nol di "to-be- diprediksi" data berbeda dari jumlah kolom bukan nol dalam data pelatihan.

Belum tahu, di mana tempat terbaik untuk memperbaikinya.

Semua 51 komentar

Tampaknya ini hanya berfungsi jika matriks sparse adalah CSC. Ini tidak berfungsi untuk matriks CSR atau COO seperti versi sebelumnya.

Bukankah masalah acak terjadi ketika kolom paling kanan semuanya 0 atau 1? Mungkin sama dengan #1091 dan #1221.

@sinhrks : Bagi saya, itu bukan "acak". Saya sering melatih XGBoost pada data yang sangat jarang (dan itu luar biasa! Biasanya mengalahkan semua model lain, dan dengan margin yang cukup lebar).

Kemudian, setelah model terlatih berjalan dalam produksi, tentu saja saya ingin membuat prediksi pada data baru yang masuk. Data itu, tentu saja, sangat mungkin jarang dan tidak memiliki nilai untuk kolom apa pun yang kebetulan menjadi kolom terakhir. Jadi XGBoost sekarang sering rusak untuk saya, dan saya mendapati diri saya beralih ke model lain (kurang akurat), hanya karena mereka mendapat dukungan yang lebih baik untuk data yang jarang.

Adakah yang tahu persis mengapa kesalahan ini sekarang muncul dan bagaimana cara mengatasinya? Ini adalah titik sakit bagi saya karena skrip saya yang ada gagal.

Saya mencoba xgboost sebagai bagian dari pipa sklearn dan mengalami masalah yang sama. Apakah ada solusi sampai diperbaiki?

Ya, saat Anda memanggil predict, gunakan fungsi toarray() dari sparse array. Ini sangat tidak efisien dengan memori, tetapi bisa diterapkan dengan irisan kecil.

dikirim dari iPhone saya

Pada 26 Agustus 2016, pukul 22:44, Pedro Rodriguez [email protected] menulis:

Saya mencoba xgboost sebagai bagian dari pipa sklearn dan mengalami masalah yang sama. Apakah ada solusi sampai diperbaiki?


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub, atau matikan utasnya.

Untuk beberapa alasan kesalahan tidak terjadi jika saya menyimpan dan memuat model terlatih:

    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 Saya dapat menemukan pekerjaan yang lebih baik dengan tocsc . Mungkin ada beberapa penalti kinerja tetapi tidak seburuk membuatnya menjadi matriks yang padat.

Termasuk ini dalam pipa sklearn saya tepat sebelum xgboost berfungsi

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 {}

Baik format CSC maupun penambahan entri bukan nol ke dalam kolom terakhir tidak memperbaiki masalah di versi terbaru xgboost. Mengembalikan kembali ke versi 0.4a30 adalah satu-satunya hal yang bisa saya lakukan untuk membuatnya bekerja, pertimbangkan tweak berikut (dengan seed yang dapat direproduksi) pada contoh aslinya:

>>> 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

Masalah yang sama di sini, pasti ada yang rusak di rilis terakhir. Tidak memiliki masalah ini sebelumnya dengan dataset dan pemrosesan yang sama. Saya mungkin salah, tetapi sepertinya saat ini tidak ada unit test dengan sparse csr arrays di Python menggunakan sklearn API. Apakah mungkin untuk menambahkan contoh @dmcgarry di atas ke tests/python/tests_with_sklearn.py ?

Saya mencoba mengatasinya menggunakan .toarray() dengan array CSR yang jarang, tetapi ada sesuatu yang rusak parah. Jika saya memuat model yang disimpan dan mencoba menggunakannya untuk membuat prediksi dengan .toarray(), saya tidak mendapatkan pesan kesalahan tetapi hasilnya salah. Saya memutar kembali ke 0.4a30 dan berfungsi dengan baik. Saya tidak punya waktu untuk mengejar akar masalahnya, tetapi itu tidak baik.

Masalah terjadi karena DMatrix..num_col() hanya mengembalikan jumlah kolom bukan nol dalam matriks sparse. Oleh karena itu, jika data latih & uji memiliki jumlah kolom bukan nol yang sama, semuanya berfungsi dengan baik.
Jika tidak, Anda akan mendapatkan daftar nama fitur yang berbeda, karena fungsi validasi memanggil:

    <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 adalah None untuk matriks sparse, dan karena self.num_col() hanya mengembalikan jumlah kolom bukan nol, validasi gagal segera setelah jumlah kolom bukan nol di "to-be- diprediksi" data berbeda dari jumlah kolom bukan nol dalam data pelatihan.

Belum tahu, di mana tempat terbaik untuk memperbaikinya.

Saya juga khawatir, bahwa ada masalah mendasar dengan penanganan matriks yang jarang, karena apa yang dilaporkan @bryan-woods: Katakanlah, kami memiliki x kolom nol baik di kereta maupun dalam pengujian, tetapi dengan indeks yang berbeda => Akan ada tidak ada kesalahan, karena "feature_names(self)" mengembalikan daftar fitur yang sama untuk kedua set, tetapi prediksinya mungkin salah, karena indeks kolom bukan nol yang cocok antara kereta dan pengujian.

Apakah ada yang bekerja pada masalah ini? Adakah yang setidaknya memiliki unit test yang dikembangkan yang dapat kita gunakan untuk mengembangkannya?

Saya belum mengerjakannya tetapi contoh @dmcgarry di atas dapat digunakan sebagai awal dari unit test, saya pikir,

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)

Saya membuat beberapa tes array jarang baru di garpu repo saya. Bagi yang berminat :
https://github.com/bryan-woods/xgboost/blob/sparse_test/tests/python/test_scipy_sparse.py

Untuk menjalankan tes dari direktori root checkout:
python -m tes hidung/python/test_scipy_sparse.py

Anda akan melihat bahwa kedua tes gagal. Ini setidaknya akan memberikan ujian untuk dikembangkan.

Saya juga mengalami masalah ini, tetapi saya tidak dapat menemukan cara terbaik untuk memperbaikinya sampai akhirnya diselesaikan di lib.

Anda dapat menambahkan fitur ke daftar fitur Anda dengan indeks fitur maksimal, seperti maxid:0

melewati kerangka data memecahkan masalah bagi saya

bagaimana saya bisa kembali ke versi 0.4?

instal pip --upgrade xgboost==0.4a30

Semua jenis matriks jarang tidak berfungsi untuk saya (saya bekerja dengan data tf-idf). Saya harus kembali ke versi sebelumnya. Terima kasih atas tipnya!

Anda semua yang masih mengalami masalah: apakah kode yang Anda gunakan menyertakan perbaikan di #1606 ?

Ya, saya telah menginstal xgboost versi terakhir dan saya masih mengalami masalah ini.

Ini masih ada dan mudah direproduksi. Jika Anda menggunakan kumpulan data yang cukup besar, hal ini kecil kemungkinannya terjadi, tetapi jika Anda membungkusnya dalam objek pencarian kisi, hal ini hampir pasti terjadi dalam pemisahan cv di mana fitur yang tersedia di kumpulan pengujian train/cv berbeda.

Sejujurnya, saya tidak begitu mengerti mengapa DMatrix mengabaikan petunjuk bentuk yang disediakan oleh matriks scipy sparse. Itu harus mengatur ukuran berdasarkan informasi itu alih-alih menghitungnya.

Saya menggunakan API asli Xgboost Python (0.6) dan saya mendapatkan kesalahan yang sama saat memuat DMatrix dari file format LIBSVM [jarang], jika ada baris yang berisi kolom terakhir yang ditentukan. Solusi saya adalah mendefinisikan kolom dummy di baris pertama :(

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

Jika sangat mudah untuk direproduksi, apakah ada yang mau memberikan contoh yang dapat direproduksi? Sebaiknya, tanpa lapisan sklearn (untuk mengisolasi kemungkinan penyebab).

@gabrielspmoreira : Saya mengerti maksud Anda tentang memuat dari file LIBSVM yang memiliki beberapa kolom terakhir yang benar-benar jarang... Metode konstruksi DMatrix itu akan mendapat manfaat dari petunjuk num_col juga.

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

Setiap kali DMatrix baru dibuat pada subsampel baris/kolom, ada kemungkinan hal ini terjadi (jumlah kolom berkurang meskipun kami secara eksplisit memberi tahu DMatrix berapa banyak kolom yang ada). Hal ini sering terjadi untuk kumpulan data yang lebih kecil atau kolom yang sangat jarang karena kemungkinan besar subset semuanya nol.

Setelah ini terjadi di antara rangkaian kereta/pengujian, model tidak dapat mengevaluasi rangkaian pengujian karena mengharapkan jumlah fitur yang berbeda dan mengeluarkan ValueError.

Saya mencoba menemukan tes di mana ini berfungsi/tidak berfungsi dalam xgboost core dan sklearn-wrapper karena saya yakin apa yang terjadi, tetapi saya tidak tahu di mana itu terjadi.

@l3link : kode Anda sepertinya sudah ketinggalan zaman. Inilah yang saya dapatkan:

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

Hah,

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

Tampaknya aneh bahwa versi .6 saya memiliki instruksi XGDMatrixCreateFromCSR alih-alih XGDMatrixCreateFromCSREx, yang tidak berbentuk.
Apakah mungkin distribusi osx berbeda?

Saya juga khawatir, bahwa ada masalah mendasar dengan penanganan matriks yang jarang, karena apa yang dilaporkan @bryan-woods: Katakanlah, kami memiliki x kolom nol baik di kereta maupun dalam pengujian, tetapi dengan indeks yang berbeda => Akan ada tidak ada kesalahan, karena "feature_names(self)" mengembalikan daftar fitur yang sama untuk kedua set, tetapi prediksinya mungkin salah, karena indeks kolom bukan nol yang cocok antara kereta dan pengujian.

Bisakah seseorang tolong jawab pertanyaan ini? Saya kembali ke versi 0,4 dan sekarang tampaknya berfungsi tetapi saya khawatir jika itu berfungsi dengan baik karena saya masih menggunakan matriks yang sangat jarang.

@l3link tidak ada yang aneh tentang itu: nomor versi (atau paket pypi) terkadang tidak diperbarui untuk waktu yang lama. Misalnya, file https://github.com/dmlc/xgboost/blob/master/python-package/xgboost/VERSION pada hari ini terakhir diubah pada 29 Juli, dan paket pypi terakhir https://pypi.python. org/pypi/xgboost/ tertanggal 9 Agustus. Sedangkan perbaikannya diserahkan pada 23 September #1606. Silakan periksa kode terbaru dari github.

Saya mengalami masalah ini ketika saya menggunakan pandas DataFrame (representasi tidak jarang).
Saya mengonversinya menjadi numpy ndarray melalui df.as_matrix() , dan saya menghilangkan kesalahan.

Saya juga menghilangkan kesalahan ini setelah mengonversi kerangka data ke array.

Menata ulang kolom di set-tes dalam urutan yang sama dengan set kereta memperbaikinya untuk saya.
Saya menggunakan kerangka data Pandas. Tanpa ini, menggunakan .as_matrix() menimbulkan masalah yang sama.

Ya:

test = test[train.columns]

Saya mencoba solusi @warpuv dan berhasil. Data saya besar, saya tidak dapat memuatnya ke memori untuk menyusun ulang kolom.

Mengonversi matriks csr kereta/tes ke csc berhasil untuk saya

Xtrain = scipy.sparse.csc_matrix(Xtrain)

Mengonversi ke csc_matrix berfungsi, diuji pada 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'>

Matriks sparse asli saya adalah output dari sklearn tf-idf vectorizer dalam format csr_matrix .

Apakah ada perbaikan belum?

Baru saja membuat versi terbaru (0.7.post3) di python3 dan saya dapat mengonfirmasi bahwa masalah ini masih ada. Setelah mengadaptasi @dmcgarry contoh di atas, saya masih melihat masalah dengan csr_matrix dan 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__)

Kode di atas menghasilkan output berikut:

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

tolong bantu

Mengapa masalah ini ditutup?

Saya menemukan masalah ini dua kali baru-baru ini. Untuk satu kasus, saya cukup mengubah kerangka data input menjadi array dan berfungsi. Untuk yang kedua, saya harus menyelaraskan kembali nama kolom dari kerangka data pengujian menggunakan test_df = test_df[train_df.columns]. Dalam kedua kasus, train_df dan test_df memiliki nama kolom yang persis sama.

Saya kira saya tidak mengerti komentar Anda @CathyQian , apakah train_df / test_df jarang? Juga, versi xgboost mana yang Anda jalankan ketika Anda mengalami masalah ini?

@CathyQian xgboost bergantung pada _order_ kolom, dan itu tidak terkait dengan masalah ini.

@ewellinger WRT contoh Anda: model yang dilatih pada data dengan 10 fitur tidak boleh menerima data dengan 500 fitur untuk prediksi, oleh karena itu kesalahan terjadi. Juga, membuat DMatrices dari semua matriks Anda dan memeriksa num_col dan num_row mereka menghasilkan hasil yang diharapkan.

Status "masalah sparsity" saat ini adalah:

  • Pembuatan DMatrix dari CSR dan penggunaannya dalam model harus bekerja dengan benar. Masalah ini ditutup karena itu adalah subjek dari masalah ini.
  • Pembuatan DMatrix dari CSC menghasilkan objek dengan dimensi yang benar, tetapi mungkin memberikan hasil yang salah selama pelatihan atau prediksi ketika baris terakhir benar-benar jarang #2630. Saya belum punya waktu untuk memperbaiki bagian itu dengan benar.
  • Parameter untuk menentukan jumlah kolom yang telah ditentukan sebelumnya saat memuat data libsvm ke DMatrix belum diterapkan. Relawan untuk berkontribusi dipersilakan.

@warpuv bekerja untuk saya, terima kasih banyak.

Memiliki kesalahan yang sama, dengan matriks padat. ( xgboost v.0.6 dari anaconda terbaru.)
Kesalahan terjadi ketika saya menjalankan beberapa regresi pada subset fitur yang berbeda dari sampel pelatihan.
Membuat instance model baru setiap kali sebelum memasang regresi berikutnya memperbaiki masalah.

  • Parameter untuk menentukan jumlah kolom yang telah ditentukan sebelumnya saat memuat data libsvm ke DMatrix belum diterapkan. Relawan untuk berkontribusi dipersilakan.

Sampai 0.8, ini masih belum ada kan?

Pembuatan DMatrix dari CSC menghasilkan objek dengan dimensi yang benar, tetapi mungkin memberikan hasil yang salah selama pelatihan atau prediksi ketika baris terakhir benar-benar jarang #2630. Saya belum punya waktu untuk memperbaiki bagian itu dengan benar.

@khotilov #3553 memperbaiki masalah ini.

Parameter untuk menentukan jumlah kolom yang telah ditentukan sebelumnya saat memuat data libsvm ke DMatrix belum diterapkan. Relawan untuk berkontribusi dipersilakan.

@MonsieurWave Untuk fitur ini, permintaan tarik kecil ke dmlc-core harus berhasil. Biarkan aku melihatnya.

@hcho3 Terima kasih banyak.

Untuk saat ini, saya menghindari masalah ini dengan membuat baris pertama libsvm saya tidak terlalu jarang, yaitu .: menyimpan bahkan kolom dengan nilai 0.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat