Нормализовать столбцы матрицы scipy csr - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть данные, которые содержат кучу категориальных функций.Я хочу горячо закодировать категориальные функции, но у меня ошибка памяти, потому что у категориальных функций слишком много уровней.Решение, которое я нашел, состояло в том, чтобы использовать формат 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, но это не было сделано так, как я ожидал.

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-среднее (X)) / стандартное (X).Я подозреваю, что приведенная выше нормализация была выполнена таким образом, потому что scikit-learn не хочет, чтобы матрица теряла свою разреженную форму.

Я хочу понять, как нормализовалась матрица выше.Более конкретно, я хочу знать, как sklearn.preprocessing.normalize нормализует разреженные матрицы в формате csr для scipy.

Заранее благодарен за вашу помощь!

ДОБАВЛЕНО: При нормализации я ожидал что-то вроде этого:

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])
...