Inflearn brand logo image

인프런 커뮤니티 질문&답변

bobby1994님의 프로필 이미지
bobby1994

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

머신러닝 학습 및 평가 (회귀)

머신러닝 인코딩 관련 문의

해결된 질문

작성

·

59

0

1.머신러닝 인코딩 강의 관련하여

원핫 인코딩 또는 라벨 인코딩 둘 중 하나를 사용하면 된다고 하는데,

train_oh = pd.get_dummies(train)
test_oh = pd.get_dummies(test)

data = pd.concat([train, test], axis=0)
data_oh = pd.get_dummies(data)

train_oh = data_oh.iloc[:len(train)].copy()
test_oh = data_oh.iloc[len(train):].copy()

해당 원핫 인코딩만 적용하면

ValueError: could not convert string to float: 'Private' 해당 오류가 뜨면서

cols = ['workclass', 'education', 'marital.status', 'occupation', 'relationship', 'race', 'sex','native.country']
from sklearn.preprocessing import LabelEncoder

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

라벨 인코딩까지 같이 적용해야 오류가 안 뜨는데,

혹시 두 가지 같이 적용해야 되는지 문의드립니다.

 

  1. 또한, 머신러닝 (회귀) 강의에서는 인코딩 하는 방법이

cols = ['Item_Identifier', 'Item_Fat_Content', 'Item_Type', 'Outlet_Identifier', 'Outlet_Size', 'Outlet_Location_Type', 'Outlet_Type']

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

# 라벨 인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for col in cols:
    df[col] = le.fit_transform(df[col])

# 원핫 인코딩
df = df.drop('Item_Identifier', axis=1)
df = pd.get_dummies(df)

train, test 개별로 보지않고, 합쳐서 적용을 하는데

별도로 분리해서 적용하지 않고 한번에 합쳐서 적용해도 되는지 궁금합니다!

 

인코딩 부분이 헷갈리는데, 가장 보편적으로 사용되는 인코딩 방법이 어떤것인지 알려주시면 해당 방법으로 주로 학습해보겠습니다!^^

 

답변 2

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

안녕하세요 🙂

1 인코딩 적용방식이 잘못되었어요

카테고리가 같다면 다음과 같이 각각 인코딩을 진행하면 되고

train = pd.get_dummies(train)
test = pd.get_dummies(test)

 

카테고리가 다르다면 다음과 같이 합쳐서 인코딩을 진행하면 됩니다.

data = pd.concat([train, test], axis=0)
data_oh = pd.get_dummies(data)

train = data_oh.iloc[:len(train)].copy()
test = data_oh.iloc[len(train):].copy()

이렇게 했을 때 문제가 없어야 하는데

아마 위 2개를 동시에 적용해서 문제가 생기지 않았나 싶어요

레이블 인코딩 또는 원핫 중 1개만 진행해 문제가 없어야 하는 것이 정상입니다.

 

  1. 네 만약 카테고리가 다른데 레이블 인코딩을 한다면 합쳐서 진행을 하고, 합친 파일만 인코딩 하면 됩니다. train과 test에 각각을 진행하는 것은 원핫인코딩 하는 것처럼 각각 진행하는 방식이에요 🙂

 

조금 헷갈릴 수 있는데 작업형2가 계속 반복될거에요~~!!

기출까지 풀어보면서 10번만 더 하시면 익숙해 지실거에요 💪

 

0

안녕하세요, 인프런 AI 인턴입니다.

bobby1994님께서 인코딩 방식에 대해 궁금해하시는 부분에 대해 설명드리고 최적의 접근 방법을 제안해드리겠습니다.

1. 원핫 인코딩과 라벨 인코딩의 사용

  • 원핫 인코딩: 이 방법은 범주형 데이터에서 고유한 값마다 새로운 컬럼을 만들어주기 때문에 데이터의 차원을 높이지만 각 값의 순서 없는 범주를 잘 반영할 수 있습니다.
  • 라벨 인코딩: 고유한 범주에 숫자를 배정하는 방법으로, 카테고리의 순서가 있는 경우 효과적이지만, 숫자 간의 크기와 관계 없는 범주 데이터에는 잘 맞지 않을 수 있습니다.

질문에서 언급하신 코드에서는 pd.get_dummies로 원핫 인코딩을 시도하고 있지만, ValueError: could not convert string to float가 발생하는 부분은 데이터의 문자열 값들이 제대로 인식되지 않았기 때문으로 보입니다. 라벨 인코딩을 적용하셨을 때 문제없이 실행된 것은 문자열 값을 숫자 형태로 변환했기 대문입니다.

2. 데이터 합친 후 인코딩

  • 데이터를 합쳐서 인코딩하는 접근은 테스트 데이터에 없는 카테고리로 인해 발생할 수 있는 잠재적 문제를 회피할 수 있습니다. 개별 데이터셋을 인코딩할 때, 새로운 카테고리들이 존재할 수 있으므로 테스트 데이터에 동일한 차원을 가지고 있게 하기 위해 많이 사용됩니다.

3. 접근 방법 제안

가장 보편적인 방법으로 원핫 인코딩을 많이 사용합니다. 특히 범주의 순서가 중요하지 않은 경우이며, 머신러닝 모델에서 강력하게 작동합니다. 데이터의 특징이나 상황에 따라 위에서 언급된 장점을 활용하여 적절한 인코딩 방법을 선택하는 것이 중요합니다.

가이드

  • 데이터 합쳤다가 나누기: 단, 데이터를 합치기 전에 인덱스를 잘 관리하여 합친 후, 원래의 train, test를 잘 나누도록 해야 합니다.
  • 라벨 인코딩: 필요에 따라 범주형 변수를 숫자로 간단히 변환하여 성능을 테스트해볼 수 있지만, 결정 트리 모델에서는 큰 문제를 일으킬 수 있으니 주의해야 합니다.

관련된 정보에 대해서는 아래 유사한 질문의 답변을 참고하시면 더 많은 이해에 도움이 될 수 있습니다:
- 라벨인코딩과 원핫인코딩 후, 데이터 크기 비교

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

bobby1994님의 프로필 이미지
bobby1994

작성한 질문수

질문하기