누구든지 StandardScaler를 설명 할 수 있습니까?


답변:


106

아이디어의 뒤에은 StandardScaler그것의 분포가 평균값 0과 1의 표준 편차해야합니다 있도록 데이터를 변환하는 것입니다
다변량 데이터의 경우를,이 (데이터의 각 열에 대해 독립적으로 즉) 완료 기능 현명하다 .
데이터의 분포가 주어지면 데이터 세트의 각 값은 평균값을 뺀 다음 전체 데이터 세트 (또는 다변량의 경우 특징)의 표준 편차로 나눕니다.


3
이 답변이 정확하지 않다는 것을 알았습니다. each value in the dataset will have the sample mean value subtracted-이것은 사실이 아닙니다. 각 기능 / 열의 평균은 특정 열의 값에서 뺍니다. 이것은 열 단위로 수행됩니다. 없습니다 sample mean value subtracted-아래 내 대답 참조
seralouk

@makis 나는 당신이 제안한 설명에 따라 내 대답을 편집했습니다.
user6903745

98

소개 :X행 / 선샘플 / 관찰 이고 각 변수 / 특성 인 행렬이 있다고 가정 합니다 (이것은 모든 sklearnML 함수에 대한 예상 입력입니다 - X.shape이어야 함 [number_of_samples, number_of_features]).


방법의 핵심 : 주요 아이디어는에 정상화 / 표준화 즉, μ = 0σ = 1당신의 기능 / 변수 / 열 X, 개별적으로 , 전에 어떤 기계 학습 모델을 적용.

StandardScaler()특성 즉, X의 각 열, INDIVIDUALLY정규화하여 각 열 / 특성 / 변수가 μ = 0및 을 갖도록 σ = 1합니다.


추신 : 이 페이지에서 가장 많이 찬성 된 답변을 찾았습니다. 나는 "데이터 세트의 각 값이 샘플 평균값을 뺀다"라고 인용하고 있습니다. 이것은 사실이 아니며 정확하지도 않습니다.


참고 항목 : 데이터 표준화 방법 및 이유 : 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/2019 : 입력 매개 변수 Concering with_meanwith_std에가 False/ True, 여기에 대한 답변 제공 한 : 사이 StandardScaler 차이를 "with_std = 허위 또는 사실"과 "with_mean = 거짓 또는 진정한"


[1.15, 1.15]내가 pandas df로 계산할 때 왜 내가 얻는 지 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, 기계 학습 알고리즘이 더 빨라지거나 더 정확한 결정을 내리는 데 도움 이되는지 궁금 합니다.
sepisoad

데이터 세트의 표준화는 많은 머신 러닝 추정기의 일반적인 요구 사항입니다. 개별 기능이 표준 정규 분포 데이터 (예 : 평균 및 단위 분산이 0 인 가우스)처럼 보이지 않으면 제대로 작동하지 않을 수 있습니다. 예를 들어 학습 알고리즘의 목적 함수에 사용되는 많은 요소 (예 : SVM의 RBF 커널 또는 선형 모델의 L1 및 L2 정규화 기)는 모든 특성이 0을 중심으로하고 동일한 순서로 분산된다고 가정합니다.
seralouk

따라서 표준화는 a) 더 안정적인 b) 변수 범위의 영향을 덜 받음 c) 더 빠른 피팅 d) 더 안정적인 성능
seralouk


22

StandardScaler는 표준화 작업을 수행합니다 . 일반적으로 데이터 세트에는 척도가 다른 변수가 포함됩니다. 예를 들어 Employee 데이터 세트에는 스케일 20-70의 값이있는 AGE 열과 스케일 10000-80000의 값이있는 SALARY 열이 포함됩니다 .
이 두 열은 규모가 다르기 때문에 기계 학습 모델을 구축하는 동안 공통 규모를 갖도록 표준화되었습니다.


10

이것은 다른 단위에 해당하는 데이터를 비교할 때 유용합니다. 이 경우 단위를 제거하려고합니다. 모든 데이터에 대해 일관된 방식으로이를 수행하려면 분산이 단일이고 계열의 평균이 0이되도록 데이터를 변환합니다.


1
u pls는 어떻게 도움이되는지 예를 들어 설명 할 수 있습니까? .. 그
wud

6

위의 답변은 훌륭하지만 과거에 겪었던 몇 가지 문제를 완화하기 위해 간단한 예가 필요했습니다. 실제로 각 열을 개별적으로 처리하고 있는지 확인하고 싶었습니다. 나는 이제 안심이되었고 어떤 예가 나를 걱정하게 만들 었는지 찾을 수 없습니다. 모든 열 되어 상기라면 바와 같이 개별적으로 스케일링.

암호

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)

1
분산이 1이 아닌 이유는 무엇입니까?
Max

6

다음은 표준화 계산이 작동하는 방식을 설명하는 간단한 작업 예제입니다. 이론 부분은 이미 다른 답변에서 잘 설명되어 있습니다.

>>>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로 스케일링 된 데이터의 평균이 0이 아닙니다.


3

을 적용 StandardScaler()하면 X의 각 열 은 평균이 0이고 표준 편차가 1이됩니다.

이 페이지의 다른 사용자가 수식을 나열합니다.

근거 : 일부 알고리즘에는 데이터가 이와 같이 표시 되어야 합니다 ( sklearn 문서 참조 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.