使用列表子集在sklearn拟合中以令人难以置信的10倍速度加速

时间:2013-11-25 22:14:02

标签: python scikit-learn

我做了一个可重复的例子,说明了我真正想要做的事情,问题是同一个维度。

任何人都可以向我解释这些时间差异,我在拟合阶段所做的更改是X[:,:](变量的数量为504)我使用X[:,range(0,504)]

from sklearn import linear_model
import numpy as np
y = np.random.normal(0,1,15000)
X = np.random.normal(0,1,15000*504)
X = np.reshape(X, (15000, 504))

Z = X.copy()
Z = X[:, range(0,504)]
np.allclose(Z,X)
# True

linear_model.Ridge(alpha=100).fit(X,y)
# Timing: 54.45 seconds

linear_model.Ridge(alpha=100).fit(Z,y)
# Timing: 5.89 seconds

np.allclose(Z,X)
# True

通过在这里选择一系列变量(所有变量),如何加速几乎10倍?当我使用Z = X[:, :]时,时间也约为54秒。

那么以这种方式选择范围真是太神奇了?

根据DSM的要求:

OS: Ubuntu 13.04
>>> sklearn.__version__
'0.14.1'
>>> np.__version__
'1.7.0'

>>> X.__array_interface__ 
{'data': (139670867165200, False), 'shape': (15000, 504), 'descr': [('', '<f8')],
      'version': 3, 'strides': None, 'typestr': '<f8'}
>>> Z.__array_interface__ 
{'data': (139670746202128, False), 'shape': (15000, 504), 'descr': [('', '<f8')],
      'version': 3, 'strides': (8, 120000), 'typestr': '<f8'}
>>> y.__array_interface__ 
{'data': (23622352, False), 'shape': (15000,), 'descr': [('', '<f8')], 'version': 
      3, 'strides': None, 'typestr': '<f8'}

1 个答案:

答案 0 :(得分:2)

在我的盒子上,我得到了:

>>> X.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  ...
>>> Z.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  ...

这意味着由基于列的花式索引引起的内存复制会影响Z阵列的内部内存布局。您也可以尝试:

>>> Z2 = np.asfortranarray(X)

一些numpy例程可能无法将正确的标志传递给BLAS / LAPACK例程,以针对C连续内存布局进行优化。我正在运行numpy的开发版本,我无法观察到任何性能差异。自1.7.0发布以来,该问题可能已得到解决。