【问题标题】:Predicting how long an scikit-learn classification will take to run预测 scikit-learn 分类运行需要多长时间
【发布时间】:2014-04-21 23:45:17
【问题描述】:

有没有办法根据参数和数据集预测从 sci-kit learn 运行分类器需要多长时间?我知道,漂亮的元数据,对吧?

有些分类器/参数组合非常快,有些需要很长时间,以至于我最终只是终止了该过程。我想要一种方法来提前估计需要多长时间。

或者,我会接受一些关于如何设置常用参数以减少运行时间的建议。

【问题讨论】:

  • 看看算法的时间复杂度,看看小样本需要多少时间?
  • 感谢您的建议。我尝试这样做,但似乎有些算法随着数据的增长呈线性扩展,而有些算法则呈指数增长。这是一个很好的建议,当然总比没有好,但我想知道是否有比猜测和检查更简单或更自动化的方法。

标签: python machine-learning classification scikit-learn


【解决方案1】:

有非常具体的分类器或回归器类别可以直接报告算法的剩余时间或进度(迭代次数等)。其中大部分可以通过将verbose=2(任何大于 1 的高数)选项传递给单个模型的构造函数来打开。 注意:此行为是根据 sklearn-0.14 进行的。早期版本的详细输出略有不同(但仍然有用)。

最好的例子是ensemble.RandomForestClassifier 或 ensemble.GradientBoostingClassifier`,它会打印到目前为止构建的树的数量和剩余时间。

clf = ensemble.GradientBoostingClassifier(verbose=3)
clf.fit(X, y)
Out:
   Iter       Train Loss   Remaining Time
     1           0.0769            0.10s
     ...

或者

clf = ensemble.RandomForestClassifier(verbose=3)
clf.fit(X, y)
Out:
  building tree 1 of 100
  ...

此进度信息对于估计总时间非常有用。

然后还有其他模型,比如 SVM,打印完成的优化迭代次数,但不直接报告剩余时间。

clf = svm.SVC(verbose=2)
clf.fit(X, y)
Out:
   *
    optimization finished, #iter = 1
    obj = -1.802585, rho = 0.000000
    nSV = 2, nBSV = 2
    ...

据我所知,线性模型等模型不提供此类诊断信息。

查看此线程以了解有关详细级别含义的更多信息:scikit-learn fit remaining time

【讨论】:

  • 谢谢,这很有帮助!我看到了冗长,但没有连接它报告剩余时间。
【解决方案2】:

如果你使用的是IPython,可以考虑使用%time%timeit等内置的魔法命令

%time - Python 语句或表达式的时间执行。打印 CPU 和挂钟时间,并返回表达式的值(如果有)。 请注意,在 Win32 下,系统时间总是报告为 0,因为它无法测量。

%timeit - 使用 timeit 模块计时执行 Python 语句或表达式。

例子:

In [4]: %timeit NMF(n_components=16, tol=1e-2).fit(X)
1 loops, best of 3: 1.7 s per loop

参考文献:

https://ipython.readthedocs.io/en/stable/interactive/magics.html

http://scikit-learn.org/stable/developers/performance.html

【讨论】:

    【解决方案3】:

    我们实际上正在开发一个package,它可以提供 scikit-learn 拟合的运行时估计。

    您基本上会在运行 algo.fit(X, y) 之前运行它以获取运行时估计。

    这是一个简单的用例:

    from scitime import Estimator 
    estimator = Estimator() 
    rf = RandomForestRegressor()
    X,y = np.random.rand(100000,10),np.random.rand(100000,1)
    # Run the estimation
    estimation, lower_bound, upper_bound = estimator.time(rf, X, y)
    

    请随意看看!

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2015-01-12
      • 2012-03-23
      • 2015-08-01
      • 1970-01-01
      • 2018-01-09
      • 2011-02-20
      • 2020-08-08
      • 2019-06-05
      相关资源
      最近更新 更多