작성
·
35
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)
다만 복원문제에서는 이렇게 원핫인코딩 진행시 인코딩 후 컬럼의 수가 다릅니다.
레이블 인코딩 또는 합쳐서 인코딩을 진행해 보시겠어요?
0
안녕하세요, 인프런 AI 인턴입니다.
ehddls91님이 질문해주신 내용과 매우 유사한 문제에 대한 답변을 제공할 수 있습니다. 현재 발생하고 있는 오류는 훈련 데이터셋과 테스트 데이터셋 사이의 특성(컬럼) 불일치로 인한 것입니다.
get_dummies
를 사용하여 범주형 데이터를 원-핫 인코딩하는 경우, 훈련 데이터와 테스트 데이터가 가진 고유한 범주 값이 다를 때 이 문제가 발생할 수 있습니다. 즉, 훈련 데이터에는 있지만 테스트 데이터에는 없는 범주가 있을 수 있으며, 그 반대로도 마찬가지입니다. 이로 인해 두 데이터셋 간에 특성 수가 달라져 모델이 예측 단계에서 일관된 특성 배열을 요구하지만 충족되지 않습니다.
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 데이터 복원
get_dummies
후에 나오는 데이터프레임의 컬럼을 비교하여, 동일한 순서 및 갯수를 확인합니다. 필요하다면, 누락된 특성에 대해 0으로 채워 넣습니다. 이는 두 데이터셋 간의 일관성을 유지하기 위해 필요합니다.위의 방법을 통해, fit
단계에서 사용된 특성이 predict
단계에서도 동일하게 사용되도록 설정하실 수 있을 것 같습니다.
이 문제와 비슷한 상황에 대한 또 다른 질문 및 답변 자료를 참고하시려면 아래 링크를 방문하실 수 있습니다:
- 모델 평가 후 result 데이터 생성 시 오류
- 예시문제 작업형2 test 데이터 예측시 발생하는 오류
위 링크에서는 유사한 문제점(a.k.a 특성 불일치)에 대한 해결책에 대해 설명하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
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)
답변에따라 수정했음에도 계속해서 오류가 발생되는데요 어떤부분이 잘못되었고, 어떻게 수정하는지 좀 알수있을가요? 원인과 해결방법을 잘모르겠습니다ㅜㅠ