StandardScaler дает неоднородное стандартное отклонение - PullRequest
2 голосов
/ 20 июня 2020

Моя проблема выглядит следующим образом: Python 3.7, Pandas версия 1.0.3 и sklearn версия 0.22.1. Я обычно применяю StandardScaler (к каждому столбцу матрицы с плавающей запятой). Однако столбцы, которые я получил, не имеют стандартного отклонения = 1, в то время как их средние значения (приблизительно) равны 0.

Я не уверен, что здесь происходит не так, я проверил, есть ли scaler запутался и стандартизировал строки, но, похоже, это не так.

from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
np.random.seed(1)
row_size = 5
n_obs = 100
X = pd.DataFrame(np.random.randint(0,1000,n_obs).reshape((row_size,int(n_obs/row_size)))

scaler = StandardScaler()
scaler.fit(X)
X_out = scaler.transform(X)
X_out = pd.DataFrame(X_out)

Все столбцы имеют стандартное отклонение 1.1180... вместо 1.

X_out[0].mean()
>>Out[2]: 4.4408920985006264e-17
X_out[0].std()
>>Out[3]: 1.1180339887498947

РЕДАКТИРОВАТЬ: Я понял, когда увеличиваю row_size выше, например, от 5 до 10 и 100, стандартное отклонение столбцов приближается к 1. Так что, возможно, это связано с тем, что смещение оценки дисперсии становится меньше с увеличением n (?). Однако не имеет смысла, что я могу получить дисперсию единиц, вручную реализовав (col[i]- col[i].mean() )/ col[i].std(), но StandardScaler борется ...

1 Ответ

1 голос
/ 20 июня 2020

Numpy и Pandas используют разные определения стандартного отклонения (смещенный или несмещенный). Sklearn использует определение numpy, поэтому результат scaler.transform(X).std(axis=1) приводит к 1 s.

Но затем вы переносите стандартизованные значения X_out в pandas DataFrame и запрашиваете pandas на даст вам стандартное отклонение для тех же значений, которое затем приведет к вашему наблюдению.

В большинстве случаев вы заботитесь только о всех столбцах с одинаковым разбросом, поэтому различия не важны. Но если вы действительно хотите получить объективное стандартное отклонение, вы не можете использовать StandardScaler из sklearn.

...