sklearn StandardScaler не работает должным образом - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь нормализовать свои данные, чтобы они нормально распределялись, что необходимо для более поздней проверки гипотезы. Данные, которые я пытаюсь нормализовать, points, таковы:

      P100m   Plj  Psp  Phj  P400m  P110h   Ppv  Pdt  Pjt  P1500
0       938  1061  773  859    896    911   880  732  757    752
1       839   975  870  749    887    878   880  823  863    741
2       814   866  841  887    921    939   819  778  884    691
3       872   898  789  878    848    879   790  790  861    804
4       892   913  742  803    816    869  1004  789  854    699
 ...   ...  ...  ...    ...    ...   ...  ...  ...    ...
7963    755   760  604  714    812    794   482  571  539    780
7964    830   845  524  767    786    783   601  573  562    535
7965    819   804  653  840    791    699   659  461  448    632
7966    804   720  539  758    830    782   731  487  425    729
7967    687   809  692  714    565    741   804  527  738    523

Я использую sklearn.preprocessing.StandardScaler(), и мой код выглядит следующим образом:

scaler = preprocessing.StandardScaler()
scaler.fit(points)
points_norm = scaler.transform(points)
points_norm_df = pd.DataFrame(points_norm, columns = ['P100m', 'Plj', 'Psp', 'Phj', 'P400m', 
'P110h', 'Ppv', 'Pdt', 'Pjt','P1500'])

Странная часть является то, что я запускаю тест нормальности Андерсона-Дарлинга с scipy.stats.anderson, и в результате он очень далек от нормального распределения.

Я не самый опытный статистик. Я неправильно понимаю, что я здесь делаю, или это проблема с моим кодом / данными?

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

1 голос
/ 05 января 2020

StandardScaler не претендует на то, чтобы данные имели нормальное распределение, а не Стандартизировал , так что ваши данные будут иметь нулевое среднее значение и единичную дисперсию.

Из документация :

Стандартизация функций путем удаления среднего значения и масштабирования до дисперсии единиц

Стандартная оценка для выборки x рассчитывается как z = (x - u) / s, где u - среднее значение обучающих выборок или ноль, если with_mean=False, а s - стандартное отклонение обучающих выборок или единица, если with_std=False.

.
0 голосов
/ 06 января 2020

Как уже отмечал Гилад, StnadardScaler стандартизирует ваши данные.

Здесь вы можете найти список методов для предварительной обработки: https://scikit-learn.org/stable/modules/preprocessing.html

Вы ищете для:

6.3.2.1. Сопоставление с равномерным распределением

QuantileTransformer и quantile_transform обеспечивают непараметрическое преобразование для сопоставления данных с равномерным распределением со значениями от 0 до 1

, это будет работать примерно так:

quantile_transformer = preprocessing.QuantileTransformer(random_state=0)
points_norm = quantile_transformer.fit_transform(points)
...