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

ehddls91님의 프로필 이미지
ehddls91

작성한 질문수

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

8회 기출유형(작업형2)

test파일 예측에서 자꾸 에러가 발생합니다.

작성

·

43

0

train = pd.read_csv('/kaggle/input/working8-2/churn_train.csv')
test = pd.read_csv('/kaggle/input/working8-2/churn_test.csv')
target = train.pop('TotalCharges')
train = pd.get_dummies(train)
test = pd.get_dummies(test)
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=2022)
from sklearn.metrics import mean_absolute_error
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=2022, max_depth=7, n_estimators=600)
rf.fit(X_tr,y_tr)
pred = rf.predict(X_val)
answer = rf.predict(test)

rf.predict(X_val)까지는 잘 예측이 되어,

866.4986350062683의 값을 얻었습니다.

그리하여 마지막으로 본 test파일을 예측하여 제출하려고 하는데, 계속해서 오류가 발생하네요 ㅠㅠㅠ

아래는 에러 코드입니다.

ValueError Traceback (most recent call last)
Cell In[97], line 14
     12 rf.fit(X_tr,y_tr)
     13 pred = rf.predict(X_val)
---> 14 answer = rf.predict(test)

File /opt/conda/lib/python3.10/site-packages/sklearn/ensemble/_forest.py:981, in ForestRegressor.predict(self, X)
    979 check_is_fitted(self)
    980 # Check data
--> 981 X = self._validate_X_predict(X)
    983 # Assign chunk of trees to jobs
    984 n_jobs, _, _ = _partition_estimators(self.n_estimators, self.n_jobs)

File /opt/conda/lib/python3.10/site-packages/sklearn/ensemble/_forest.py:602, in BaseForest._validate_X_predict(self, X)
    599 """
    600 Validate X whenever one tries to predict, apply, predict_proba."""
    601 check_is_fitted(self)
--> 602 X = self._validate_data(X, dtype=DTYPE, accept_sparse="csr", reset=False)
    603 if issparse(X) and (X.indices.dtype != np.intc or X.indptr.dtype != np.intc):
    604     raise ValueError("No support for np.int64 index based sparse matrices")

File /opt/conda/lib/python3.10/site-packages/sklearn/base.py:548, in BaseEstimator._validate_data(self, X, y, reset, validate_separately, **check_params)
    483 def _validate_data(
    484     self,
    485     X="no_validation",
   (...)
    489     **check_params,
    490 ):
    491     """Validate input data and set or check the `n_features_in_` attribute.
    492 
    493     Parameters
   (...)
    546         validated.
    547     """
--> 548     self._check_feature_names(X, reset=reset)
    550     if y is None and self._get_tags()["requires_y"]:
    551         raise ValueError(
    552             f"This {self.__class__.__name__} estimator "
    553             "requires y to be passed, but the target y is None."
    554         )

File /opt/conda/lib/python3.10/site-packages/sklearn/base.py:481, in BaseEstimator._check_feature_names(self, X, reset)
    476 if not missing_names and not unexpected_names:
    477     message += (
    478         "Feature names must be in the same order as they were in fit.\n"
    479     )
--> 481 raise ValueError(message)

ValueError: The feature names should match those that were passed during fit.
Feature names unseen at fit time:
- customerID_CUST0001
- customerID_CUST0002
- customerID_CUST0006
- customerID_CUST0007
- customerID_CUST0008
- ...
Feature names seen at fit time, yet now missing:
- customerID_CUST0000
- customerID_CUST0003
- customerID_CUST0004
- customerID_CUST0005
- customerID_CUST0009
- ...

답변 2

0

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

8회 문제를 실제시험보다 제가 조금 어렵게 출제를 했어요!

아래와 같이 겟더미 사용해 원핫 인코딩 적용시 시험에서는 문제가 없었습니다.

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

다만 복원문제에서는 이렇게 원핫인코딩 진행시 인코딩 후 컬럼의 수가 다릅니다.

레이블 인코딩 또는 합쳐서 인코딩을 진행해 보시겠어요?

c=pd.concat([train,test],axis=0,sort=False)

c=pd.get_dummies(c)

train=c[:len(train)]

test=c[len(train):]

target=train.pop('TotalCharges')

 

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)

from sklearn.ensemble import RandomForestRegressor

model=RandomForestRegressor()

model.fit(X_tr,y_tr)

pred=model.predict(X_val)

pred=model.predict(test)

 

답변에따라 수정했음에도 계속해서 오류가 발생되는데요 어떤부분이 잘못되었고, 어떻게 수정하는지 좀 알수있을가요? 원인과 해결방법을 잘모르겠습니다ㅜㅠ

0

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

ehddls91님이 질문해주신 내용과 매우 유사한 문제에 대한 답변을 제공할 수 있습니다. 현재 발생하고 있는 오류는 훈련 데이터셋과 테스트 데이터셋 사이의 특성(컬럼) 불일치로 인한 것입니다.

문제의 원인

get_dummies를 사용하여 범주형 데이터를 원-핫 인코딩하는 경우, 훈련 데이터와 테스트 데이터가 가진 고유한 범주 값이 다를 때 이 문제가 발생할 수 있습니다. 즉, 훈련 데이터에는 있지만 테스트 데이터에는 없는 범주가 있을 수 있으며, 그 반대로도 마찬가지입니다. 이로 인해 두 데이터셋 간에 특성 수가 달라져 모델이 예측 단계에서 일관된 특성 배열을 요구하지만 충족되지 않습니다.

해결 방법

  1. Train과 Test 데이터 합치기:
    • 먼저, train과 test 데이터를 수직 방향으로 결합하여 단일 데이터 프레임으로 만든 뒤 get_dummies를 적용합니다. 이 방법으로 모든 범주가 동일한 특성으로 인코딩되도록 합니다.
    • get_dummies를 적용한 후에는 다시 원래의 train과 test 데이터로 분리합니다.
   combined = pd.concat([train, test], axis=0, sort=False)
   combined = pd.get_dummies(combined)
   
   train = combined[:len(train)]  # train 데이터 복원
   test = combined[len(train):]   # test 데이터 복원
  1. 특성 일치 확인:
    • get_dummies 후에 나오는 데이터프레임의 컬럼을 비교하여, 동일한 순서 및 갯수를 확인합니다. 필요하다면, 누락된 특성에 대해 0으로 채워 넣습니다. 이는 두 데이터셋 간의 일관성을 유지하기 위해 필요합니다.

위의 방법을 통해, fit 단계에서 사용된 특성이 predict 단계에서도 동일하게 사용되도록 설정하실 수 있을 것 같습니다.

이 문제와 비슷한 상황에 대한 또 다른 질문 및 답변 자료를 참고하시려면 아래 링크를 방문하실 수 있습니다:
- 모델 평가 후 result 데이터 생성 시 오류
- 예시문제 작업형2 test 데이터 예측시 발생하는 오류

위 링크에서는 유사한 문제점(a.k.a 특성 불일치)에 대한 해결책에 대해 설명하고 있습니다.

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

ehddls91님의 프로필 이미지
ehddls91
질문자

custmor ID값을 탈락시키는 전처리를 추가하니

test파일도 예측을 하네요.

 

이렇게 처리해도 괜찮은걸까요?

ehddls91님의 프로필 이미지
ehddls91

작성한 질문수

질문하기