我的数据包含一堆分类特征。我想对分类特征进行一次热编码,但是由于分类特征的级别过多,因此出现了内存错误。我发现的解决方案是使用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])