检查对象属性酸洗大小

时间:2017-10-27 17:34:20

标签: python scikit-learn pickle

我的对象泡菜转储意外巨大。我想调查哪个属性导致了这个问题。我该怎么做?

我已经尝试了sys.getsizeofpympler.asizeof,他们没有给我答案。

这个问题更多的是一般方法,但如果你真的想知道,我的目标是一个sklearn训练的逻辑回归模型。我的pickle转储是500MB,但dir(model)中没有一个属性反映它:

import sys
from pympler.asizeof import asizeof
for a in dir(clf):
    print('%25s\t%10d\t%10d' %(a, sys.getsizeof(getattr(clf, a)), asizeof(getattr(clf, a))))

                    C           28          32
            __class__         1464           0
          __delattr__           56          56
             __dict__          648        8944
              __dir__           72           0
              __doc__         8359        8360
               __eq__           56          56
           __format__           72           0
               __ge__           56          56
     __getattribute__           56          56
         __getstate__           64           0
               __gt__           56          56
             __hash__           56          56
             __init__           64           0
    __init_subclass__           72           0
               __le__           56          56
               __lt__           56          56
           __module__           78          80
               __ne__           56          56
              __new__           72           0
           __reduce__           72           0
        __reduce_ex__           72           0
             __repr__           64           0
          __setattr__           56          56
         __setstate__           64           0
           __sizeof__           72           0
              __str__           56          56
     __subclasshook__           72           0
          __weakref__           16          16
      _estimator_type           59          64
     _get_param_names           64           0
    _predict_proba_lr           64           0
         class_weight           16          16
             classes_         6536        6536
                coef_          112         112
    decision_function           64           0
              densify           64           0
                 dual           24          24
                  fit           64           0
        fit_intercept           28          32
           get_params           64           0
           intercept_           96          96
    intercept_scaling           28          32
             max_iter           28          32
          multi_class           52          56
              n_iter_          100         104
               n_jobs           28          32
              penalty           51          56
              predict           64           0
    predict_log_proba           64           0
        predict_proba           64           0
         random_state           16          16
                score           64           0
           set_params           64           0
               solver           58          64
             sparsify           64           0
                  tol           24          24
              verbose           24          24
           warm_start           24          24

我的训练数据大约在500MB左右,所以我猜它是在某处不必要地捕获的,我想在保存到文件时删除它。请注意,它并不那么明显,因为在将结果输入分类器(不是管道的一部分)之前,我确实有一些预处理sklearn管道

更新2:

一些代码,简化了我的实际公司代码:

clf = LogisticRegression(penalty="l2", C=100)
clf.fit(X, target)
with open(filepath, 'wb') as f:
    pickle.dump(clf, f)

让我知道您认为可能有用的其他信息。

0 个答案:

没有答案