如何在sklearn的preprocessing.scale中使用Python的map函数?

时间:2017-06-04 10:14:35

标签: python mapreduce scikit-learn sklearn-pandas

我正在尝试在数据列表中使用函数(preprocessing.scale)。我是Python中mapreduce / parallelism的新手 - 我想在一大堆数据上处理这个以提高性能。

示例:

X = [1,2,3,4]

使用语法:

list(map(preprocessing.scale, X))

我收到此错误:

TypeError: Singleton array array(1.0) cannot be considered a valid collection.

我认为这是因为该函数的返回类型,但我不知道如何解决这个问题。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您不需要/想要使用地图功能,因为它是for loop

几乎所有的sklearn方法都是矢量化的,它们接受列表相似的对象(列表,numpy数组等),与map(...)方法相比,这种方法的工作速度要快得多

演示:

In [121]: from sklearn.preprocessing import scale

In [122]: X = [1,2,3,4]

In [123]: scale(X)
Out[123]: array([-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079])

使用numpy数组的相同演示:

In [39]: x = np.array(X)

In [40]: x
Out[40]: array([1, 2, 3, 4])

In [41]: scale(x)
DataConversionWarning: Data with input dtype int32 was converted to float64 by the scale function.
  warnings.warn(msg, _DataConversionWarning)
Out[41]: array([-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079])

它期望float dtype,所以我们可以轻松地将我们的numpy数组转换为float dtype:

In [42]: scale(x.astype('float64'))
Out[42]: array([-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079])

答案 1 :(得分:0)

执行list(map(preprocessing.scale, X))相当于执行[preprocessing.scale(a) for a in X]

鉴于此,你目前正在做的是缩放单例(一个观察)。您无法缩放单个项目,这是该功能中断的位置。尝试preprocessing.scale(X[0]),你会得到同样的错误。

尝试像这样运行它的目的是什么,而不是仅仅传递数组X preprocessing.scale(X)