Я не могу понять страницу из StandardScaler
в документации sklearn
.
Может ли кто-нибудь объяснить мне это простым языком?
Я не могу понять страницу из StandardScaler
в документации sklearn
.
Может ли кто-нибудь объяснить мне это простым языком?
Ответы:
Идея StandardScaler
заключается в том, что он преобразует ваши данные таким образом, что их распределение будет иметь среднее значение 0 и стандартное отклонение 1.
В случае многомерных данных это делается по функциям (другими словами, независимо для каждого столбца данных) .
Учитывая распределение данных, из каждого значения в наборе данных будет вычтено среднее значение, а затем разделено на стандартное отклонение всего набора данных (или функции в многомерном случае).
Введение: я предполагаю, что у вас есть матрица, в 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»
[1.15, 1.15]
когда я вычислить как панды ДФ: pd.DataFrame(scaled_data).std(0)
?
pd.DataFrame(scaled_data)[0]
я получаю ряд с Name: 0, dtype: float64
значениями и [-1.0, 1.0, -1.0, 1.0]
. Извините за форматирование
StandardScaler
, ускоряет ли это алгоритм машинного обучения или помогает принимать более точные решения или что-то еще?
Как рассчитать:
Вы можете прочитать больше здесь:
StandardScaler выполняет задачу стандартизации . Обычно набор данных содержит переменные, различающиеся по масштабу. Например, набор данных «Сотрудник» будет содержать столбец ВОЗРАСТ со значениями по шкале 20-70 и столбец Заработная плата со значениями по шкале 10000-80000 .
Поскольку эти два столбца различаются по масштабу, они стандартизированы, чтобы иметь общий масштаб при построении модели машинного обучения.
Это полезно, когда вы хотите сравнить данные, соответствующие различным единицам измерения. В этом случае вы хотите удалить блоки. Чтобы сделать это согласованным способом для всех данных, вы преобразуете данные таким образом, чтобы дисперсия была унитарной, а среднее значение ряда было равно 0.
Ниже приводится простой рабочий пример, объясняющий, как работает расчет стандартизации. Теоретическая часть уже хорошо объяснена в других ответах.
>>>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.
Ссылки
Приведенные выше ответы великолепны, но мне нужен был простой пример, чтобы облегчить некоторые опасения, которые у меня были в прошлом. Я хотел убедиться, что он действительно обрабатывает каждый столбец отдельно. Теперь я уверен, и не могу найти, какой пример вызвал у меня беспокойство. Все столбцы 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
После нанесения StandardScaler()
, каждый столбец в X будет иметь среднее значение 0 и стандартное отклонение 1.
Формулы перечислены другими пользователями на этой странице.
Обоснование: некоторые алгоритмы требуют, чтобы данные выглядели так (см. Документацию по sklearn ).
Мы применяем StandardScalar()
последовательно.
Итак, для каждой строки в столбце (я предполагаю, что вы работаете с Pandas DataFrame):
x_new = (x_original - mean_of_distribution) / std_of_distribution
Несколько очков -
Он называется стандартным скаляром, поскольку мы делим его на стандартное отклонение распределения (распределение функции). Точно так же вы можете угадать MinMaxScalar()
.
Исходное распределение остается прежним после подачи заявки StandardScalar()
. Это распространенное заблуждение, что распределение меняется на нормальное. Мы просто сжимаем диапазон до [0, 1].
each value in the dataset will have the sample mean value subtracted
-- это неправда. Среднее значение КАЖДОГО признака / столбца будет вычтено из значений конкретного столбца. Это делается по столбцам. Нетsample mean value subtracted
- см. Мой ответ ниже