데이터 전처리_2

jh_k·2023년 2월 6일
0

데이터 분석

목록 보기
2/17

범주형 변수 처리

  • 범주형 변수는 값이 수학적 연산으로 모델을 생성하는 대부분의 분석 도구에서 직접 사용할 수 없기 때문에 특별한 처리 필요
  • 방법 중 하나로 더미변수화를 사용
  • 더미변수는 범주형 변수에 있는 범주 각각을 컬럼으로 변경하여 해당 범주에 속하는지 여부에 따라 0과 1로 채운 변수
import pandas as pd
from sklearn.datasets import load_wine

wine_load = load_wine()
wine = pd.DataFrame(wine_load.data, columns=wine_load.feature_names)
wine.head()
wine['Class'] = wine_load.target
wine_dummy = pd.get_dummies(wine, columns=['Class'])
wine_dummy.head()

데이터 분할

  • 분석 모델을 학습하고 성과를 확인하기 위하여 데이터를 Train과 Test 세트로 나누고 독립변수와 종속변수로 분리하는 작업
  • 분석 방법에 따라서는 Train과 Validation, Test 세트로 분리하기도 함
  • 데이터를 분리하는 적절한 비율
    • Train : Test = 7 : 3
    • Train : Validation : Test = 6 : 2 : 2
  • sklearn의 train_test_split() 함수를 사용하여 분할 가능
    • train_test_split(X, Y, test_size = none, train_size = none, random_state = none, shuffle = True, stratify = none)
      • X : 독립 변수 테이블
      • Y : 종속 변수 테이블
      • test_size : 테스트 사이즈 비율
      • random_state : 임의의 번호를 지정. 같은 숫자를 사용하면 같은 출력이 나옴
      • shuffle : True면 추출 전에 데이터를 섞음
      • stratify : None이 아닌 경우 데이터는 지정한 변수를 기준으로 계층화되어 해당 변수의 비율을 유지하도록 추출
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.datasets import load_iris
iris_load = load_iris()
iris = pd.DataFrame(iris_load.data, columns=iris_load.feature_names)
iris['Class'] = iris_load.target
iris['Class'] = iris['Class'].map({
    0 : 'Setosa', 
    1 : 'Versicolour', 
    2 : 'Virginica'
})
x_train, x_test, y_train, y_test = train_test_split(
    iris.drop(columns='Class'), 
    iris['Class'], 
    test_size=0.3, 
    random_state=1000
)
print('x_train :', x_train.shape, 'x_test :', x_test.shape)
print('y_train :', y_train.shape, 'y_test :', y_test.shape)
  • stratify 속성을 지정하지 않은 경우에는 임의 추출로 인하여 Class 컬럼의 범주의 개수의 비율이 원본 데이터와 차이가 난다.
  • 무작위로 임의 추출의 결과가 원본을 충분히 반영하지 못하는 경우는 분석 성능에 악영향을 미칠 수 있다.
x_train, x_test, y_train, y_test = train_test_split(
    iris.drop(columns='Class'), 
    iris['Class'], 
    test_size = 0.3, 
    stratify = iris['Class']
)

데이터 스케일링

  • 대부분의 분석 알고리즘은 컬럼 간 데이터의 범위가 크게 차이 날 경우 잘 동작하지 않는다.

  • 값의 범위가 작은 컬럼에 비해서 값의 범위가 큰 컬럼이 타깃 변수를 예측하는데 큰 영향을 준다고 판단

  • 스케일링 작업은 모든 컬럼의 값의 범위를 같게 만들어주는 작업이다.

  • 데이터 스케일링 순서

    • 데이터 스케일링의 주의할 점은 train데이터와 test데이터를 같은 scaler 객체로 스케일링해야한다.
    1. Scaler 선택 및 import
    2. Scaler 객체 생성
    3. train 데이터 분포 저장
    4. train 데이터 스케일링
    5. test 데이터 스케일링
    6. 원래 스케일로 변환

Standard Scaler

  • 표준화 방식으로 기본 스케일링 방식으로 컬럼들을 평균이 0, 분산이 1인 정규분포로 스케일링
  • 최솟값과 최댓값의 크기를 제한하지 않아 이상치에 민감하기때문에 이상치에 대한 정제한 후 사용하는 것이 좋다.
  • 회귀보다는 분류분석에서 유용
from sklearn.preprocessing import StandardScaler

StdScaler = StandardScaler()

# Train 데이터의 fitting과 스케일링
StdScaler.fit(x_train)
X_train_sc = StdScaler.transform(x_train)

# Test 데이터의 스케일링
X_test_sc = StdScaler.transform(x_test)


print("\t\t(min, max) (mean, std)")
print("Train_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_train_sc.min(), X_train_sc.max(),  X_train_sc.mean(),  X_train_sc.std()))
print("Test_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_test_sc.min(), X_test_sc.max(),  X_test_sc.mean(),  X_test_sc.std()))

Min-Max scaler

  • 정규화 방식으로 컬럼들을 0과 1 사이의 값으로 스케일링 하는 방식
  • 최솟값은 0 최댓값은 1
  • 이상치에 매우 민감하므로 이상치를 미리 정제하여야한다.
  • 분류보다는 회귀에서 유용
from sklearn.preprocessing import MinMaxScaler

MmScaler = MinMaxScaler()

# Train 데이터의 fitting과 스케일링
MmScaler.fit(x_train)
X_train_sc = MmScaler.transform(x_train)

# Test 데이터의 스케일링
X_test_sc = MmScaler.transform(x_test)


print("\t\t(min, max) (mean, std)")
print("Train_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_train_sc.min(), X_train_sc.max(),  X_train_sc.mean(),  X_train_sc.std()))
print("Test_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_test_sc.min(), X_test_sc.max(),  X_test_sc.mean(),  X_test_sc.std()))

Max Abs Scaler

  • 최대절댓값과 0이 각각 1, 0이 되도록 스케일링 하는 정규화 방식으로 모든 값은 -1과 1 사이로 표현
  • 데이터가 양수인 경우에는 Min-Max Scaler와 동일
  • 이상치에 대해 민감
  • 분류보다는 회귀에서 유용
from sklearn.preprocessing import MaxAbsScaler

MaScaler = MaxAbsScaler()

# Train 데이터의 fitting과 스케일링
MaScaler.fit(x_train)
X_train_sc = MaScaler.transform(x_train)

# Test 데이터의 스케일링
X_test_sc = MaScaler.transform(x_test)


print("\t\t(min, max) (mean, std)")
print("Train_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_train_sc.min(), X_train_sc.max(),  X_train_sc.mean(),  X_train_sc.std()))
print("Test_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_test_sc.min(), X_test_sc.max(),  X_test_sc.mean(),  X_test_sc.std()))

Robust Scaler

  • 펑균과 분산 대신 중앙값과 사분위 값을 활용하는 방식
  • 중앙값을 0으로 설정하고 IQR을 사용하여 이상치의 영향을 최소화
  • quantile_range 파라미터(기본값 [0.25, 0.75])를 조정하여 더 넓거나 좁은 범위의 값을 이상치로 설정하여 정제할 수 있다.
from sklearn.preprocessing import RobustScaler

RuScaler = RobustScaler()

# Train 데이터의 fitting과 스케일링
RuScaler.fit(x_train)
X_train_sc = RuScaler.transform(x_train)

# Test 데이터의 스케일링
X_test_sc = RuScaler.transform(x_test)


print("\t\t(min, max) (mean, std)")
print("Train_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_train_sc.min(), X_train_sc.max(),  X_train_sc.mean(),  X_train_sc.std()))
print("Test_scaled (%.2f, %.2f) (%.2f, %.2f)"%(X_test_sc.min(), X_test_sc.max(),  X_test_sc.mean(),  X_test_sc.std()))

원본 스케일로 변경

  • 스케일링한 데이터를 원본 스케일로 변경
X_Original = RuScaler.inverse_transform(X_train_sc)
pd.DataFrame(X_Original).head(3)
profile
Just Enjoy Yourself

0개의 댓글