데이터로그😎

데이터 전처리 본문

#4. 기타 공부/#4.2. 머신러닝

데이터 전처리

지지킴 2023. 9. 3. 17:41
<목차>

1. 데이터 인코딩
1-1. 레이블 인코딩
1-2. 원-핫 인코딩

2. 피처 스케일링
2-1. StandardScaler (표준화)
2-2. MinMaxScaler(정규화)

1. 데이터 인코딩

1-1. 레이블 인코딩

  • 언제 사용하는가?
    • 문자열 → 숫자열로 인코딩하기 좋음
    • 각 레이블에 고유의 숫자들을 매길 때 사용
  • fit
    • items 리스트에 있는 고유한 문자열을 찾아냄.
    • TV=0, 냉장고= 1, 전자레인지=2, 컴터=3, 선풍기=4, 믹서=5로 매팽할 방법을 학습함.
  • transform
    • items 리스트의 값들을 이전에 학습된 방법에 따라 인코딩.
    • tv → 0, 냉장고 → 1, 전자레인지  → 2,... 로 인코딩.
from sklearn.preprocessing import LabelEncoder

items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']
encoder =LabelEncoder()

# 문자열 학습
encoder.fit(items)

# items 리스트를 인코딩. 모든 문자열을 fit에서 학습된 매핑 방법에 따라 인코딩된 정수값으로 변환.
labels = encoder.transform(items)

>>> 결과
array([0, 1, 4, 5, 3, 3, 2, 2])

 

  • 디코딩
encoder.inverse_transform([0, 1, 4, 5, 3, 3, 2, 2])

 

1-2. 원-핫 인코딩

  • 언제 사용하는가?
    • 0과 1으로만 분리할 때(와인: 레드와인(0), 화이트와인(1))
    • 분류 문제에서 범주형 변수를 처리할 때
    • 비선형 데이터를 처리할 때
      • 비선형 구조?
      • 더보기
        비선형, 선형 구조?

        1. 선형 구조 (Linear)
        - 데이터, 요소들이 일렬로 나열되어 있는 구조
        - 배열, list

        2. 비선형 (Nonlinear)
        - 요소들 간에 복잡, 다양한 관계
        - 순차, 직선 구조 X
        - 그래프, 트리
    • 인코딩된 범주형 데이터를 다른 모델에 입력으로 사용할 때
  • 방법1
    • 내가 표현하고 싶은 것만 1로 나머진 0으로
    • 다중 공선성이 발생할 수도 있다. 따라서 원핫 인코딩통해 생성된 column 중 하나를 삭제하고 모델을 만들어주면 됨. 즉 column이 n개 생성되었을 때 n-1개만 사용
from sklearn.preprocessing import OneHotEncoder

oh_encoder = OneHotEncoder()
items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']
items = np.array(items).reshape(-1,1)
# OneHotEncoder 클래스는 입력 데이터로  2차원 배열을 받음. 
# 따라서 list인 item을 1차원 array형태로 바꾸고, reshape를 통해 2차원으로 변환

oh_encoder.fit(items)
oh_labels =oh_encoder.transform(items)

# oh_labels(원핫인코더로 변환한 결과는 '희소행렬')
	# 따라서 toarray()를 이용해 '밀집행렬'로 변환

oh_labels.toarray()

>>>결과
array([[1., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0., 0.],
       [0., 0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0.]])

 

  • 방법2: get_dummies()
    • 판다스에서 원핫인코딩을 더 쉽게 지원하는 API
import pandas as pd

items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']


df= pd.DataFrame({'item':['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']})
pd.get_dummies(df)

 

  • 방법3
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

ct = ColumnTransformer(transformers=[('encoder',OneHotEncoder(drop='first'),[2])],remainder = 'passthrough')
		 # drop='first' 첫번째 열은 자르겠다. [2]: 2인덱스를 변환해주시오.
X = ct.fit_transform(X)
X

 

2. 피처 스케일링

2-1. StandardScaler(표준화)

  • 데이터의 분포를 통일 할 때 사용
  • 평균은 0, 표준편차는 1로 변환
  • 선형회귀, 로지스틱 회귀, 서포트벡터머신
  • 이상치 있는 경우에도 영향 적게 받음
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df) # array형태로 반환됨

iris_df_scaled = pd.DataFrame(data=iris_scaled, columns = iris.feature_names)
print('featrue평균값')
print(iris_df_scaled.mean())
print()
print('feature 분산값')
print(iris_df_scaled.var())

 

  • 결과
    • 데이터 모양은 유사
    • mean=0, 분산=1로 바뀜. (= 표준화)

스케일링 전 iris_df
Standard Scaler
MinMax Scaler

2-2. MinMaxScaler

  • 단위가 다르고 최대최소가 존재하는 경우
  • 최소값을0, 최대값을 1로 변환함.
  • 최대최소가 존재한다? = 데이터의 범위가 정해져 있다.
    • ex) 영화 평점 (네이버:1~10, 넷플: 1~5)
  • 이미지 처리, neural network
    • 이미지 처리: 각 픽셀값 0~255 사이. 따라서 이러한 데이터를 신경망 모델에 입력하기 전에 0~1사이로 스케일링 하여 입력할 수 있음.
  • 이상치 많을 땐 적합하지 않음
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

iris_df_scaled = pd.DataFrame(data= iris_scaled, columns= iris.feature_names)
print('feature들의 최소값')
print(iris_df_scaled.min())

print('feature들의 최대값')
print(iris_df_scaled.max())

 

⚠️2-3. 스케일러 사용시 주의 사항

  1. 가능하면 전체 데이터의 스케일링 변환 후 학습, 테스트 데이터로 분리하기
    • 전체 데이터 스케일링 → train, test data 분할
  2. 1이 여의치 않다면 테스트 데이터 변환시에는 학습데이터로 이미 fit()이 된 scaler 객체를 이용해 transform()으로 변환
    • train data에만 fit, transform사용 → test data 변환시에는 학습데이터로 이미 fit()이 된 scaler 객체를 이용해 transform() 만 실행
scaler =MinMaxScaler()
scaler.fit(train_array)
train_scaled = scaler.transform(train_array)

test_scaled = scaler.transform(test_array)

'#4. 기타 공부 > #4.2. 머신러닝' 카테고리의 다른 글

[지도학습] 2. Decision Tree  (1) 2023.09.04
[지도학습] 0. 분류(Classification)  (0) 2023.09.04
[지도학습] 1. 분류의 평가지표  (0) 2023.09.04
model_selection 모듈  (1) 2023.09.03
머신러닝의 분류  (0) 2023.08.30