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