파이썬(Python)/머신러닝(Machine Learning)

[Python] sklearn 정규 분포 만들기(StandardScaler), 그래프 비교

끄적끄적아무거나 2023. 2. 16. 08:49
반응형

 

목차

     

     

     

     

     

    파이썬 sklearn StandardScaler란?

    빅데이터를 처리할때 일반적인 분포 데이터를 정규 분포의 데이터로 정규화(Normalization)하는 일들이 필요 합니다. 정규 분포란 평균(mean)이 0이고 분산(Variance)가 1인 데이터를 의미합니다. 

     

    분산에 대한 수식은 아래 링크를 참조하시길 바랍니다. 

     

    https://scribblinganything.tistory.com/265

     

    평균 제곱, 분산,자유도 (Mean Square, Variance,DOF) 이란? (의미, 계산법)

    평균 제곱 (Mean Square) 이란? 평균제곱이란 아래와 같은 수식으로 전개 된다. mean-square 란 신호의 평균 힘(Strength) 또는 파워(Power)를 측정 한 값이다. 그림1은 자동차 진동 신호의 mean-square 측정 값이

    scribblinganything.tistory.com

     

     

    정규화를 하는 이유는 세상에 많은 랜덤 물리현상은 가우시안 분포(Gaussian Distribution)를 따릅니다. 가우시안 분포가 평균이 0이고 분산이 1인 표준 분포 입니다. 이러한 수식을 기본으로 다양한 이론이 나와서 데이터를 표준 분포로 변경을 하게 되면 예측 분석에 용이하기 때문에 사용 합니다. 

     

     

    이번 포스트에서는 sklearn의 StandardScaler를 사용해서 정규화를 시행해보겠습니다. 

     

     

     

     

     

    StandardScaler Syntax는 아래와 같습니다.

     

    StandardScaler(*, copy=True, with_mean=True, with_std=True)

     

    파라미터(Parameter)에 대해 알아보겠습니다. 파라미터를 입력하지 않으면 기본적으로 True로 설정됩니다.

     

    • copy는 True, False를 값으로 받습니다. False 입력 시 현장에 작성된 스케일링(scaling)을 사용합니다.
    • with_mean 는 True 시 스케일링(Scaling) 전에 중앙 값 이동을 진행합니다.
    • with_std는 True 시 분산 1에 맞춰 scale 을 진행합니다. 

     

     

     

     

     

     

    파이썬 sklearn StandardScaler 예제 실습

    예제 실습에서 표준 분포로 만드는 방법과 그래프로 비교하는 방법에 대해 알아보겠습니다. 전체 코드는 글 제일 하단에서 다운 받을 수 있습니다. 

     

     

    전체 코드>>

    from sklearn.preprocessing import StandardScaler
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    data_df = pd.DataFrame({
        "random_1":np.random.randint(0,50,1000),
    })
    
    print(data_df.mean())
    print(data_df.var())
    
    scaler = StandardScaler()
    scaler.fit(data_df)
    scaled = scaler.transform(data_df)
    scaled_data_df = pd.DataFrame(scaled)
    
    print(scaled_data_df.mean())
    print(scaled_data_df.var())

     

     

    결과>>

    random_1    25.152
    dtype: float64
    random_1    208.315211
    dtype: float64
    0   -7.283063e-17
    dtype: float64
    0    1.001001
    dtype: float64

    가공전의 데이터의 평균(mean)은 25이고 분산은 208이 나왔습니다. 데이터를 표준화한 이후에 평균은  -7x10^(-17)로 거의 0이고 분산은 1이 나왔습니다.

     

     

     

    주석>>

    data_df = pd.DataFrame({
        "random_1":np.random.randint(0,50,1000),
    })

    randint를 사용해서 0~50의 정수를 랜덤하게 총 1000개 추출해서 판다스(Pandas) 데이터프레임(Dataframe)에 넣어줍니다. 

     

     

    print(data_df.mean())
    print(data_df.var())

    가공 전 데이터의 평균과 분산을 구해줍니다.

     

     

     

    scaler = StandardScaler()
    scaler.fit(data_df)
    scaled = scaler.transform(data_df)
    scaled_data_df = pd.DataFrame(scaled)

    StandardScaler 객체를 생성하고 transform을 통해서 스케일링 해줍니다. 스케일링 한 값은 numpy array 타입으로 출력되므로 다시 pandas dataframe으로 변경해줍니다.

     

     

     

    print(scaled_data_df.mean())
    print(scaled_data_df.var())

    가공 후 데이터의 평균과 분산을 구해줍니다.

     

     

     

     

    다음은 그래프로 비교하기 위해 그래프를 추가한 코드와 결과를 아래와 같이 작성하겠습니다.

     

    전체코드 + 그래프>>

    from sklearn.preprocessing import StandardScaler
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    data_df = pd.DataFrame({
        "random_1":np.random.randint(0,50,1000),
    })
    
    print(data_df.mean())
    print(data_df.var())
    
    scaler = StandardScaler()
    scaler.fit(data_df)
    scaled = scaler.transform(data_df)
    scaled_data_df = pd.DataFrame(scaled)
    
    print(scaled_data_df.mean())
    print(scaled_data_df.var())
    
    fig, axs = plt.subplots(2, 1, sharey=True, tight_layout=True)
    
    axs[0].hist(data_df, bins=50, color= 'red')
    axs[1].hist(scaled_data_df, bins=50, color= 'blue')
    plt.show()

     

     

     

    결과>>

    random_1    25.152
    dtype: float64
    random_1    208.315211
    dtype: float64
    0   -7.283063e-17
    dtype: float64
    0    1.001001
    dtype: float64

     

    그래프 모양은 변화가 없습니다. 하지만 x축 값을 보면 평균과 분산을 맞추기 위해 scaling 되었음을 알 수 있습니다. 

     

     

     

    주석>>

    fig, axs = plt.subplots(2, 1, sharey=True, tight_layout=True)
    
    axs[0].hist(data_df, bins=50, color= 'red')
    axs[1].hist(scaled_data_df, bins=50, color= 'blue')
    plt.show()

    한 화면에 두개의 그래프를 표기 하기위해 subplots을 사용해서 설정합니다.

     

    그리고 각 화면에 들어갈 그래프를 히스토그램(histogram)으로 설정 후 스케일링 전에 데이터는 빨간색으로 후의 데이터는 파란색으로 표기 해줍니다. 

     

     

     

    전체코드 다운로드>>

    standardscaler.py
    0.00MB

     

     

     

     

    반응형