데이터 전처리 1

코딩다시시작·2024년 11월 14일

빅데이터분석

목록 보기
18/19

object 데이터 전처리 하기

원-핫 인코딩

  • object을 모델에 사용하기 위해 숫자형으로 변환하는 기법
  • object을 원-핫 인코딩하면, 각 범주가 서로 다른 독립적인 특성으로 표현
    • 표현 방식은 모델이 범주들 간의 순서나 크기를 가정하지 않음

원-핫 인코딩의 개념

예를 들어, Color라는 열에 세 가지 색상이 있다고 가정

Color
Red
Green
Blue

원-핫 인코딩 결과

Color_RedColor_GreenColor_Blue
100
010
001

원-핫 인코딩의 장점

  • 순서가 없는 범주형 데이터에 적합
  • 모델이 범주형 데이터에서 편향 없이 학습

원-핫 인코딩의 단점

  • 고차원 데이터가 될 수 있음
  • 희소 행렬(sparse matrix): 대부분의 값이 0으로 채워 짐

원-핫 인코딩 구현 방법

pandasget_dummies() 함수나 sklearn.preprocessing.OneHotEncoder 클래스를 사용해 쉽게 구현할 수 있어요.

ex) pandasget_dummies 함수 사용

df = pd.DataFrame({'Color': ['Red', 'Green', 'Blue']})

# 원-핫 인코딩 적용
df_one_hot = pd.get_dummies(df, columns=['Color'])
print(df_one_hot)

out:

   Color_Blue  Color_Green  Color_Red
0           0            0          1
1           0            1          0
2           1            0          0

레이블 인코딩

  • 범주형 데이터를 수치형 데이터로 변환하는 방법
  • 순서가 있는 범주형 데이터에 적합하며, 각 고유 범주값을 0, 1, 2, ... 등의 정수로 매핑

레이블 인코딩의 개념

예)

Color
Red
Green
Blue
Green

레이블 인코딩하면 아래와 같이 정수로 변환

ColorEncoded
Red2
Green1
Blue0
Green1

여기서:

  • Blue는 0
  • Green은 1
  • Red는 2

레이블 인코딩의 장점

  • 간단하고 빠름:
  • 순서가 있는 데이터에 적합

레이블 인코딩의 단점

  • 순서가 없는 데이터에는 부적합
  • 상대적 크기 오해 가능성

레이블 인코딩 구현 예시

sklearn.preprocessing.LabelEncoder를 사용

from sklearn.preprocessing import LabelEncoder

# 예시 데이터
data = ['Red', 'Green', 'Blue', 'Green']

# LabelEncoder 생성 및 변환
le = LabelEncoder()
encoded_data = le.fit_transform(data)
print(encoded_data)

out:

[2 1 0 1]

이처럼 LabelEncoder는 각 고유한 범주를 정수로 변환해줍니다.

실제 사용 사례

# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
combined = pd.concat([train,test])
cols = train.select_dtypes(include='object').columns

for col in cols:
    le = LabelEncoder()
    combined[col] = le.fit_transform(combined[col])
    
n_train = len(train)
train = combined[:n_train]
test = combined[n_train:]
  • concat()으로 합치는 이유는 같은 정수로 변환하기 위함

LabelEncoder의 사용 시 주의 사항

  • 훈련 데이터와 테스트 데이터의 일관성 유지
  • 순서가 없는 경우에는 원-핫 인코딩이 더 적합

정수로 변환 가능한 object

  • astype 을 통한 변환

예시로 설명

train['Turbo'] = train['Engine volume'].str.contains('Turbo').astype(int)
train['Engine volume'] = train['Engine volume'].str.replace('Turbo','').astype(float)
test['Turbo'] = test['Engine volume'].str.contains('Turbo').astype(int)
test['Engine volume'] = test['Engine volume'].str.replace('Turbo','').astype(float)train['Mileage'] = train['Mileage'].str.split().str[0].astype(int) 
test['Mileage'] = test['Mileage'].str.split().str[0].astype(int)

traintest 데이터프레임에서 Engine volumeMileage 열의 자료형을 변경하고, Turbo라는 새로운 열을 생성하는 작업을 수행

1. Turbo 열 생성

train['Turbo'] = train['Engine volume'].str.contains('Turbo').astype(int)
test['Turbo'] = test['Engine volume'].str.contains('Turbo').astype(int)
  • str.contains('Turbo'): Engine volume 열에 "Turbo"라는 문자열이 포함되어 있는지 확인
    • 예를 들어, Engine volume'2.0 Turbo'라면 "Turbo" 문자열이 포함되어 있으므로 True가 반환
  • .astype(int): TrueFalse 값을 각각 1과 0으로 변환
    • "Turbo"가 포함된 경우는 1, 포함되지 않은 경우는 0으로 변환되어 Turbo 열에 저장

결과적으로 Turbo 열은 Engine volume 열에 "Turbo"가 포함된 경우 1, 그렇지 않은 경우 0을 가지게 됨

2. Engine volume 열에서 Turbo 문자열 제거 및 실수형으로 변환

train['Engine volume'] = train['Engine volume'].str.replace('Turbo','').astype(float)
test['Engine volume'] = test['Engine volume'].str.replace('Turbo','').astype(float)
  • str.replace('Turbo', ''): Engine volume 열에서 "Turbo" 문자열을 빈 문자열('')로 대체하여 "Turbo"를 제거
    • 예를 들어, '2.0 Turbo''2.0'으로 변경
  • .astype(float): 변경된 값들을 float 타입으로 변환
    • 예를 들어, 문자열 '2.0'이 실수형 2.0으로 변환

3. Mileage 열에서 숫자만 추출하여 정수형으로 변환

train['Mileage'] = train['Mileage'].str.split().str[0].astype(int)
test['Mileage'] = test['Mileage'].str.split().str[0].astype(int)
  • str.split(): Mileage 열의 각 값을 공백(' ')을 기준으로 나눔
    • 예를 들어, '15,000 km'라는 값은 ['15,000', 'km']로 나눔
  • .str[0]: split() 결과에서 첫 번째 요소(숫자 부분)만 추출
    • ['15,000', 'km']에서 '15,000'만 선택
  • .astype(int): 추출된 문자열을 정수형(int)으로 변환
    • 예를 들어, 문자열 '15,000'이 정수형 15000으로 변환
profile
gpt로 다시 배우는 개발

0개의 댓글