预测scikit-learn分类模型的运行时间

31

有没有一种方法可以根据参数和数据集预测从sci-kit learn运行分类器需要多长时间?我知道,这很抽象,对吧?

某些分类器/参数组合非常快,而有些则需要很长时间,以至于我最终只能终止该进程。我希望有一种方法可以预先估计所需时间。

或者,我愿意接受一些指针,以便设置常见参数以减少运行时间。


2
看一下算法的时间复杂度,然后针对一个较小的样本观察它需要多少时间? - gizgok
1
谢谢您的建议。我尝试过这样做,但似乎有些算法随着数据增长呈线性增长,而有些则呈指数级增长。这是一个好建议,肯定比没有好,但我想知道是否有比猜测和检查更简单或更自动化的方法。 - ntaggart
3个回答

39

有一些非常特定的分类器或回归器可以直接报告算法的剩余时间或进度(迭代次数等)。大多数情况下,通过将高于1的任何数字作为选项verbose=2传递给各个模型的构造函数即可启用此功能。注意:此行为是根据sklearn-0.14版本的要求执行的。早期版本具有略有不同的详细输出(尽管仍然有用)。

最好的例子是ensemble.RandomForestClassifierensemble.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


谢谢,这非常有帮助!我看到了冗长的输出,但没有意识到它报告了剩余时间。 - ntaggart

1
如果您正在使用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


0

我们正在开发一个,用于给出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)

欢迎随时查看!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接