Я не могу понять страницу из 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- см. Мой ответ ниже