Может кто-нибудь объяснить мне StandardScaler?

Ответы:

114

Идея StandardScalerзаключается в том, что он преобразует ваши данные таким образом, что их распределение будет иметь среднее значение 0 и стандартное отклонение 1.
В случае многомерных данных это делается по функциям (другими словами, независимо для каждого столбца данных) .
Учитывая распределение данных, из каждого значения в наборе данных будет вычтено среднее значение, а затем разделено на стандартное отклонение всего набора данных (или функции в многомерном случае).

user6903745
источник
4
Я считаю, что это неверный ответ. each value in the dataset will have the sample mean value subtracted-- это неправда. Среднее значение КАЖДОГО признака / столбца будет вычтено из значений конкретного столбца. Это делается по столбцам. Нет sample mean value subtracted- см. Мой ответ ниже
seralouk
@makis Я отредактировал свой ответ после предложенного вами пояснения.
user6903745
111

Введение: я предполагаю, что у вас есть матрица, в Xкоторой каждая строка / строка является образцом / наблюдением, а каждый столбец - переменной / функцией ( sklearnкстати, это ожидаемый ввод для любой функции ML - X.shapeдолжен быть [number_of_samples, number_of_features]).


Суть метода : основная идея состоит в том, чтобы нормализовать / стандартизировать, т. Е. μ = 0И σ = 1ваши характеристики / переменные / столбцы X, индивидуально , прежде чем применять любую модель машинного обучения.

StandardScaler()будет нормализовать функции , то есть каждый столбец X, ИНДИВИДУАЛЬНО , так что каждый столбец / функция / переменная будет иметь μ = 0и σ = 1.


PS: Я считаю неправильным ответ, получивший наибольшее количество голосов на этой странице. Я цитирую «из каждого значения в наборе данных будет вычтено среднее значение выборки» - это не верно и не правильно.


См. Также: Как и зачем стандартизировать данные: учебник по Python


Пример:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print(data)
[[0, 0],
 [1, 0],
 [0, 1],
 [1, 1]])

print(scaled_data)
[[-1. -1.]
 [ 1. -1.]
 [-1.  1.]
 [ 1.  1.]]

Убедитесь, что среднее значение каждой функции (столбца) равно 0:

scaled_data.mean(axis = 0)
array([0., 0.])

Убедитесь, что стандартное значение каждой функции (столбца) равно 1:

scaled_data.std(axis = 0)
array([1., 1.])

Математика:

введите описание изображения здесь


UPDATE 08/2020 : Что касается входных параметров with_meanи with_stdк False/ True, я дала ответ здесь: разность между StandardScaler «with_std = False или True» и «with_mean = False или True»

Seralouk
источник
Есть ли у вас какие - либо идеи , почему я получаю , [1.15, 1.15]когда я вычислить как панды ДФ: pd.DataFrame(scaled_data).std(0)?
Sos
когда я бегу, pd.DataFrame(scaled_data)[0]я получаю ряд с Name: 0, dtype: float64значениями и [-1.0, 1.0, -1.0, 1.0]. Извините за форматирование
Sos
@seralouk Мне понравился ваш ответ, однако мне все еще интересно, каково намерение преобразования входных данных с использованием StandardScaler, ускоряет ли это алгоритм машинного обучения или помогает принимать более точные решения или что-то еще?
сеписоад
Стандартизация набора данных является общим требованием для многих оценщиков машинного обучения: они могут вести себя плохо, если отдельные функции не более или менее выглядят как стандартные нормально распределенные данные (например, по Гауссу с нулевым средним и единичной дисперсией). Например, многие элементы, используемые в целевой функции алгоритма обучения (такие как ядро ​​RBF SVM или регуляризаторы L1 и L2 линейных моделей), предполагают, что все функции сосредоточены вокруг 0 ​​и имеют дисперсию в том же порядке.
seralouk
Таким образом, стандартизация приводит к а) большей стабильности б) меньшему влиянию диапазона переменных в) более быстрой
настройке
25

StandardScaler выполняет задачу стандартизации . Обычно набор данных содержит переменные, различающиеся по масштабу. Например, набор данных «Сотрудник» будет содержать столбец ВОЗРАСТ со значениями по шкале 20-70 и столбец Заработная плата со значениями по шкале 10000-80000 .
Поскольку эти два столбца различаются по масштабу, они стандартизированы, чтобы иметь общий масштаб при построении модели машинного обучения.

Кришна
источник
11

Это полезно, когда вы хотите сравнить данные, соответствующие различным единицам измерения. В этом случае вы хотите удалить блоки. Чтобы сделать это согласованным способом для всех данных, вы преобразуете данные таким образом, чтобы дисперсия была унитарной, а среднее значение ряда было равно 0.

Риккардо Петралья
источник
1
не могли бы вы объяснить на
примере
7

Ниже приводится простой рабочий пример, объясняющий, как работает расчет стандартизации. Теоретическая часть уже хорошо объяснена в других ответах.

>>>import numpy as np
>>>data = [[6, 2], [4, 2], [6, 4], [8, 2]]
>>>a = np.array(data)

>>>np.std(a, axis=0)
array([1.41421356, 0.8660254 ])

>>>np.mean(a, axis=0)
array([6. , 2.5])

>>>from sklearn.preprocessing import StandardScaler
>>>scaler = StandardScaler()
>>>scaler.fit(data)
>>>print(scaler.mean_)

#Xchanged = (X−μ)/σ  WHERE σ is Standard Deviation and μ is mean
>>>z=scaler.transform(data)
>>>z

Расчет

Как вы можете видеть в выходных данных, среднее значение равно [6. , 2,5] и стандартное отклонение [1,41421356, 0,8660254]

Данные (0,1) позиция 2 Стандартизация = (2 - 2,5) / 0,8660254 = -0,57735027

Данные в позиции (1,0): 4 Стандартизация = (4-6) / 1,41421356 = -1,414

Результат после стандартизации

введите описание изображения здесь

Проверка среднего и стандартного отклонения после стандартизации

введите описание изображения здесь

Примечание: -2.77555756e-17 очень близко к 0.

Ссылки

  1. Сравните влияние различных скейлеров на данные с выбросами

  2. В чем разница между нормализацией и стандартизацией?

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

LCJ
источник
5

Приведенные выше ответы великолепны, но мне нужен был простой пример, чтобы облегчить некоторые опасения, которые у меня были в прошлом. Я хотел убедиться, что он действительно обрабатывает каждый столбец отдельно. Теперь я уверен, и не могу найти, какой пример вызвал у меня беспокойство. Все столбцы ARE масштабируется отдельно , как описано выше тех.

КОД

import pandas as pd
import scipy.stats as ss
from sklearn.preprocessing import StandardScaler


data= [[1, 1, 1, 1, 1],[2, 5, 10, 50, 100],[3, 10, 20, 150, 200],[4, 15, 40, 200, 300]]

df = pd.DataFrame(data, columns=['N0', 'N1', 'N2', 'N3', 'N4']).astype('float64')

sc_X = StandardScaler()
df = sc_X.fit_transform(df)

num_cols = len(df[0,:])
for i in range(num_cols):
    col = df[:,i]
    col_stats = ss.describe(col)
    print(col_stats)

ВЫХОД

DescribeResult(nobs=4, minmax=(-1.3416407864998738, 1.3416407864998738), mean=0.0, variance=1.3333333333333333, skewness=0.0, kurtosis=-1.3599999999999999)
DescribeResult(nobs=4, minmax=(-1.2828087129930659, 1.3778315806221817), mean=-5.551115123125783e-17, variance=1.3333333333333337, skewness=0.11003776770595125, kurtosis=-1.394993095506219)
DescribeResult(nobs=4, minmax=(-1.155344148338584, 1.53471088361394), mean=0.0, variance=1.3333333333333333, skewness=0.48089217736510326, kurtosis=-1.1471008824318165)
DescribeResult(nobs=4, minmax=(-1.2604572012883055, 1.2668071116222517), mean=-5.551115123125783e-17, variance=1.3333333333333333, skewness=0.0056842140599118185, kurtosis=-1.6438177182479734)
DescribeResult(nobs=4, minmax=(-1.338945389819976, 1.3434309690153527), mean=5.551115123125783e-17, variance=1.3333333333333333, skewness=0.005374558840039456, kurtosis=-1.3619131970819205)

НОТА:

Модуль scipy.stats правильно сообщает «выборочную» дисперсию, в знаменателе которой используется (n - 1). Дисперсия "совокупности" будет использовать n в знаменателе для расчета дисперсии. Чтобы лучше понять, см. Приведенный ниже код, который использует масштабированные данные из первого столбца набора данных выше:

Код

import scipy.stats as ss

sc_Data = [[-1.34164079], [-0.4472136], [0.4472136], [1.34164079]]
col_stats = ss.describe([-1.34164079, -0.4472136, 0.4472136, 1.34164079])
print(col_stats)
print()

mean_by_hand = 0
for row in sc_Data:
    for element in row:
        mean_by_hand += element
mean_by_hand /= 4

variance_by_hand = 0
for row in sc_Data:
    for element in row:
        variance_by_hand += (mean_by_hand - element)**2
sample_variance_by_hand = variance_by_hand / 3
sample_std_dev_by_hand = sample_variance_by_hand ** 0.5

pop_variance_by_hand = variance_by_hand / 4
pop_std_dev_by_hand = pop_variance_by_hand ** 0.5

print("Sample of Population Calcs:")
print(mean_by_hand, sample_variance_by_hand, sample_std_dev_by_hand, '\n')
print("Population Calcs:")
print(mean_by_hand, pop_variance_by_hand, pop_std_dev_by_hand)

Выход

DescribeResult(nobs=4, minmax=(-1.34164079, 1.34164079), mean=0.0, variance=1.3333333422778562, skewness=0.0, kurtosis=-1.36000000429325)

Sample of Population Calcs:
0.0 1.3333333422778562 1.1547005422523435

Population Calcs:
0.0 1.000000006708392 1.000000003354196
Том Айвз
источник
2
Почему дисперсия не равна 1?
Макс
@Max, scipy stats использует выборочную дисперсию. Смотрите новые дополнения, чтобы ответить.
Том Айвз,
@seralouk Да, если дисперсия генеральной совокупности и стандартное отклонение, но не для дисперсии выборки и стандартного отклонения - scipy stats по умолчанию для расчетов выборки.
Том Айвз,
3

После нанесения StandardScaler(), каждый столбец в X будет иметь среднее значение 0 и стандартное отклонение 1.

Формулы перечислены другими пользователями на этой странице.

Обоснование: некоторые алгоритмы требуют, чтобы данные выглядели так (см. Документацию по sklearn ).

Павел
источник
Верный. Некоторые ответы, показывающие scipy stats, описание выборочного среднего и дисперсии масштабированных данных. Дисперсия выборки для небольших наборов данных может значительно отличаться от дисперсии генеральной совокупности.
Том Айвз,
0

Мы применяем StandardScalar() последовательно.

Итак, для каждой строки в столбце (я предполагаю, что вы работаете с Pandas DataFrame):

x_new = (x_original - mean_of_distribution) / std_of_distribution

Несколько очков -

  1. Он называется стандартным скаляром, поскольку мы делим его на стандартное отклонение распределения (распределение функции). Точно так же вы можете угадать MinMaxScalar().

  2. Исходное распределение остается прежним после подачи заявки StandardScalar(). Это распространенное заблуждение, что распределение меняется на нормальное. Мы просто сжимаем диапазон до [0, 1].

ХансраджСвапнил
источник