인프런 커뮤니티 질문&답변
작업형2 연습문제 섹션3
해결된 질문
작성
·
20
0
Section 3. 항공권 가격 예측
# 컬럼 삭제
train = train.drop('flight', axis=1)
test = test.drop('flight', axis=1)
컬럼삭제한 이유는 무엇이죠?
print(train.describe(include="O"))
print(test.describe(include="O"))이걸 돌려봤는데
트레인에서 플라이트 유니트 1153
테스트에서 플라이트 유니크가 4502 이렇게 달라서 컬럼 삭제하는건가요?
어떨 때 컬럼 삭제해야하는지, 또 시험에 어떤 형식이 나올때 삭제해야하는지 궁금합니다
2.제가 코딩을
print(train.shape, test.shape)
train=pd.get_dummies(train)
test=pd.get_dummies(test)
print(train.shape, test.shape)
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size=0.2, random_state=0)
print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)
이렇게 했는데
(10505, 11) (4502, 10)
(4502, 9) (4502, 10)
(4502, 37) (4502, 930)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/tmp/ipython-input-2712245612.py in <cell line: 0>()
20 print(train.shape, test.shape)
21 from sklearn.model_selection import train_test_split
---> 22 X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size=0.2, random_state=0)
23 print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)
3 frames
/usr/local/lib/python3.12/dist-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
473 uniques = np.unique(lengths)
474 if len(uniques) > 1:
--> 475 raise ValueError(
476 "Found input variables with inconsistent numbers of samples: %r"
477 % [int(l) for l in lengths]
ValueError: Found input variables with inconsistent numbers of samples: [4502, 10505]
이렇게 오류가 뜹니다
답변 2
0
Section 3. 노트북 업데이트 했습니다.
flight는 인코딩 처리가 어려워 삭제 했어요! 확인한대로 유니크가 너무 달라서요!
다루는 방법을 노트북에 추가했습니다. 새로 불러와주세요 (심화 학습입니다)
아래 AI 가 설명한대로 합쳐서 인코딩이 필요한 상황 같습니다.
인코딩 후 타겟이 달라진것으로 보여요!
0
안녕하세요, 인프런 AI 인턴입니다. 합격님.
항공권 가격 예측 문제에서 컬럼을 삭제하는 이유와 데이터 구조 관련하여 문의 주신 내용에 대해 설명드리겠습니다.
1. 컬럼 삭제의 이유
- 고유 값의 불일치:
train데이터셋과test데이터셋에서flight컬럼의 유니크 값 개수가 크게 다르기 때문에 이 컬럼이 데이터 분석에 유용하지 않을 수 있습니다. 예를 들어flightID처럼 범주형 데이터가 크게 다를 경우, 이러한 컬럼은 모델에 불필요한 잡음을 추가할 수 있습니다. 특히 머신러닝 모델은 각 범주가 서로 다른 정보를 가진다고 이해할 수 있으며, 차이가 클 경우 모델의 예측에 혼란을 줄 수 있습니다.
- 모델의 성능 및 복잡성: 많은 유니크 값을 포함하는 범주형 데이터는 원핫 인코딩 시 매우 많은 수의 열을 생성하게 되고 이는 데이터 처리에 부담을 줄 수 있습니다. 데이터셋의 크기와 모델의 학습 시간, 복잡성을 줄이기 위해 이런 컬럼은 제거하는 것이 일반적입니다.
2. 데이터셋의 불일치 문제
- 에러 발생 원인:
train_test_split이전에train데이터셋과test데이터셋에 각각 이루어진get_dummies처리 결과 컬럼 수가 다릅니다. 이는 두 데이터셋에서 원핫 인코딩 후의 열 형식이 다르게 만들어져 발생하는 문제입니다.
train과test를 합쳐서get_dummies처리한 후, 다시 나누는 것이 일반적입니다. 이렇게 하면 모든 범주가 동일한 컬럼을 가지게 되어 데이터 구조가 일치하게 됩니다.
해결 방법
- 데이터를 합쳐 인코딩 후 분리:
full_data = pd.concat([train, test], axis=0) full_data = pd.get_dummies(full_data) train, test = full_data.iloc[:len(train)], full_data.iloc[len(train):]
위 방법으로 데이터를 인코딩 후 나누면 각 데이터셋의 형태가 일치하게 되어train_test_split에서 발생하는 에러를 해결할 수 있습니다.
추가적인 참고 링크
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





