본문 바로가기
IT&게임/빅데이터분석기사(빅분기)

인코딩 정리(원핫인코딩/레이블인코딩)

by 푸루루 2024. 6. 18.
728x90
반응형

 

※ 본내용은 퇴근후딴짓 강의를 참고하였습니다

 

인코딩 정리전에는 타겟을 미리 pop으로 빼줌

 

개인적인 의견

  • 원핫 인코딩: 카테고리 10개 미만
  • 레이블 인코딩: 카테고리 10개 이상

 

1. train과 test 데이터에서 범주형 컬럼의 카테고리가 같을 때

- 원핫 or 레이블 둘 다 상관없음

 

import pandas as pd

train = pd.DataFrame({
    '과일': ['사과', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [5000, 7000, 10000],
    'target': ['a', 'a', 'b']
})

test = pd.DataFrame({
    '과일': ['사과', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [5000, 7000, 10000]
})

train.info()

# target이 문자면 인코딩에 영향이 있음
target = train.pop('target')

# pop은 아래 코드와 같음
# target = train['target']
# train = train.drop('target', axis=1)

# 원-핫 인코딩
train_oh = pd.get_dummies(train)
test_oh = pd.get_dummies(test)

print(train_oh)
print(test_oh)

# 원-핫 인코딩 (특정 컬럼만 인코딩) 예) 과일은 원핫, 색상은 레이블
cols=['과일']
train_oh = pd.get_dummies(train, columns=cols)
test_oh = pd.get_dummies(test, columns=cols)

print(train_oh)
print(test_oh)

# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
cols = ['과일', '색상']

for col in cols:
    le = LabelEncoder()
    train[col] = le.fit_transform(train[col])
    test[col] = le.transform(test[col])

print(train)
print(test)
 

 

 

2. train 데이터의 범주형 컬럼이 test 데이터를 포함한다면

- 레이블 인코딩, train+test 합쳐서 원핫 인코딩

 

train = pd.DataFrame({
    '과일': ['사과', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [5000, 7000, 10000]
})

test = pd.DataFrame({
    '과일': ['배', '포도'],
    '색상': ['노랑', '보라'],
    '가격': [7000, 10000]
})

# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
cols = ['과일', '색상']

for col in cols:
    le = LabelEncoder()
    train[col] = le.fit_transform(train[col])
    test[col] = le.transform(test[col])

print(train)
print(test)

# 원-핫 인코딩
train = pd.DataFrame({
    '과일': ['사과', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [5000, 7000, 10000]
})

test = pd.DataFrame({
    '과일': ['배', '포도'],
    '색상': ['노랑', '보라'],
    '가격': [7000, 10000]
})

df = pd.concat([train, test])
df = pd.get_dummies(df)

# 다시 분리
train = df.iloc[:len(train)]
test = df.iloc[len(train):]
print(train.shape, test.shape)

print(train)
print(test)
 

3. test 데이터의 범주형 컬럼이 train 데이터를 포함하거나 카테고리가 다르다면

  • train+test 합쳐서 인코딩
train = pd.DataFrame({
    '과일': ['사과', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [5000, 7000, 10000]
})

test = pd.DataFrame({
    '과일': ['딸기', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [15000, 7000, 10000]
})

df = pd.concat([train, test])

# 원-핫 인코딩
df = pd.get_dummies(df)

# 다시 분리
train = df.iloc[:len(train)]
test = df.iloc[len(train):]

print(train)
print(test)

train = pd.DataFrame({
    '과일': ['사과', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [5000, 7000, 10000]
})

test = pd.DataFrame({
    '과일': ['딸기', '배', '포도'],
    '색상': ['빨강', '노랑', '보라'],
    '가격': [15000, 7000, 10000]
})

df = pd.concat([train, test])

from sklearn.preprocessing import LabelEncoder
cols = ['과일', '색상']

for col in cols:
    le = LabelEncoder()
    df[col] = le.fit_transform(df[col])


# 다시 분리
train = df.iloc[:len(train)]
test = df.iloc[len(train):]

print(train)
print(test)
 

 

 

728x90

댓글