预测scikit-learn分类器运行所需时间
有没有办法根据参数和数据集来预测运行一个sci-kit learn分类器需要多长时间?我知道,这个问题听起来有点复杂,对吧?
有些分类器和参数组合运行得很快,而有些则慢得让我最后只能强制结束这个过程。我希望能提前估算一下需要多长时间。
另外,如果能给我一些建议,告诉我怎么设置常见的参数来缩短运行时间,我也会很感激。
3 个回答
我们实际上正在开发一个工具包,它可以估算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)
欢迎随时查看!
如果你在使用IPython,可以考虑使用一些内置的魔法命令,比如%time和%timeit。
%time - 这个命令可以用来测量一段Python代码执行的时间。它会显示CPU时间和实际经过的时间,并返回这段代码的结果(如果有的话)。需要注意的是,在Win32系统下,系统时间总是显示为0,因为无法测量。
%timeit - 这个命令也是用来测量Python代码执行时间的,不过它是通过timeit模块来实现的。
示例:
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
有一些特定类型的分类器或回归模型可以直接告诉你算法的剩余时间或进度,比如迭代次数等。大多数情况下,你只需要在创建模型的时候加上 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