规范scipy csr矩阵列

时间:2018-12-05 06:14:14

标签: python numpy scikit-learn sparse-matrix normalize

我的数据包含一堆分类特征。我想对分类特征进行一次热编码,但是由于分类特征的级别过多,因此出现了内存错误。我发现的解决方案是使用csr格式,并且我理解了为什么它可以提高内存效率。

df['gender'].value_counts()

>> male      68208
   female    68089
   unknown    13703
   Name: gender, dtype: int64

from pandas.core.categorical import Categorical
from scipy.sparse import csr_matrix

categories = Categorical(df['gender']) # male, female, and unknown
N = len(df['gender'])
row_numbers = np.arange(N, dtype=np.int)
ones = np.ones((N,))
dummies = csr_matrix( (ones, (row_numbers, categories.codes)) )
dummies.todense()

>> matrix([[1., 0., 0.],
           [0., 1., 0.],
           [1., 0., 0.],
            ...,
           [1., 0., 0.],
           [0., 0., 1.],
           [0., 0., 1.]])

问题是,我必须像使用KNN算法那样对特征进行规范化。我曾尝试使用scikit-learn的normalize对类别特征进行归一化,但未按我期望的方式进行。

from sklearn.preprocessing import normalize
dummies = normalize(dummies, axis=0, norm='l2')
dummies.todense()

>> matrix([[0.00382897, 0.        , 0.        ],
          [0.        , 0.00854264, 0.        ],
          [0.00382897, 0.        , 0.        ],
          ...,
          [0.00382897, 0.        , 0.        ],
          [0.        , 0.        , 0.00383232],
          [0.        , 0.        , 0.00383232]])

矩阵中的非零值太小,因此显然它们不是由(x-mean(X))/ std(X)产生的。我怀疑上面的规范化是通过这种方式执行的,因为scikit-learn不希望矩阵丢失其稀疏形式。

我想了解上述矩阵是如何归一化的。更具体地说,我想知道sklearn.preprocessing.normalize如何以scipy的csr格式归一化稀疏矩阵。

感谢您的提前帮助!

添加:通过归一化,我期望像这样:

import numpy as np

array = np.array([1, 1, 1, 0])

mean = array.mean()
std = array.std()
normalized_array = (array-mean)/std

由于我们有两个唯一的值,一个和零,在归一化之后,应将它们替换为一个正数,而将零替换为一个负数。

normalized_array
>> array([ 0.57735027,  0.57735027,  0.57735027, -1.73205081])

0 个答案:

没有答案