작성
·
75
0
2유형 공지사항 시험 예시 내용인데,
import pandas as pd
import numpy as np
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")
#print(train.isnull().sum())
train = train.fillna(0) #결측치를 0으로 채우기
test = test.fillna(0)
#print(test.isnull().sum())
#print(train.isnull().sum())
train = train.drop(['회원ID'], axis=1)
y = train.pop('성별')
cust_id = test.pop('회원ID')
#범주형변수 원핫인코딩(get_dummies)
train = pd.get_dummies(train)
test = pd.get_dummies(test)
#print(train.info())
#수치형변수 스케일링(MinMaxScaler)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(train)
scaler.fit(test)
#모델 생성 (분류 - 랜포classifier)
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(train,y)
#모델 예측
pred = rf.predict(test)
-모델 생성까지는 에러 코드가 없었는데, 모델 예측에서 이러한 에러코드가 나옵니다..ㅜㅜㅜㅜ
> Makefile:6: recipe for target 'py3_run' failed
make: *** [py3_run] Error 1
Traceback (most recent call last):
File "/goorm/Main.out", line 38, in <module>
pred = rf.predict(test)
File "/usr/local/lib/python3.9/dist-packages/sklearn/ensemble/_forest.py", line 630, in predict
proba = self.predict_proba(X)
File "/usr/local/lib/python3.9/dist-packages/sklearn/ensemble/_forest.py", line 674, in predict_proba
X = self._validate_X_predict(X)
File "/usr/local/lib/python3.9/dist-packages/sklearn/ensemble/_forest.py", line 422, in validateX_predict
return self.estimators_[0]._validate_X_predict(X, check_input=True)
File "/usr/local/lib/python3.9/dist-packages/sklearn/tree/_classes.py", line 407, in validateX_predict
X = self._validate_data(X, dtype=DTYPE, accept_sparse="csr",
File "/usr/local/lib/python3.9/dist-packages/sklearn/base.py", line 437, in validatedata
self._check_n_features(X, reset=reset)
File "/usr/local/lib/python3.9/dist-packages/sklearn/base.py", line 365, in checkn_features
raise ValueError(
ValueError: X has 72 features, but DecisionTreeClassifier is expecting 73 features as input.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
dhtpal5138님, 제공해주신 코드와 에러 메시지를 보면, 문제는 train 데이터와 test 데이터에서 생성된 feature(특성)의 개수가 다른 것에서 발생합니다. RandomForestClassifier 모델을 학습시킨 후 예측을 할 때, 학습 데이터세트와 예측 데이터세트의 feature 개수가 동일해야 합니다. 하지만 여러분의 경우에는 train 데이터에서 73개의 feature를 가지고 학습을 진행했지만, test 데이터에서는 72개의 feature만 생성된 것으로 보입니다. 이는 주로 범주형 변수를 원-핫 인코딩할 때 범주의 개수가 train과 test 데이터에서 다르기 때문에 발생할 수 있습니다.
해결 방안은 다음과 같습니다:
1. pd.get_dummies
함수를 사용할 때, train 데이터와 test 데이터에 있는 모든 범주형 변수의 범주를 고려하여 같은 수의 feature가 생성되도록 해야 합니다. 이는 pd.get_dummies
함수에 train
데이터에 적용 후 생성된 columns를 기반으로 test
데이터를 변환할 때도 동일한 columns를 사용하도록 하여 해결할 수 있습니다.
2. 또는 train
데이터를 기반으로 만들어진 scaler
객체를 test
데이터에도 동일하게 적용해야 합니다. 하지만 질문에서 문제가 되는 부분은 스케일링이 아니라 feature의 개수 차이로 인한 것이므로, 이 부분은 문제의 원인이 아닙니다.
다음은 코드의 수정 방향을 제안하는 예시입니다:
- train
과 test
에 동일한 columns가 생성되도록 원-핫 인코딩 진행:
train_encoded = pd.get_dummies(train)
test_encoded = pd.get_dummies(test)
# train에만 존재하는 column 확인 및 test에 해당 column 추가
for col in set(train_encoded.columns) - set(test_encoded.columns):
test_encoded[col] = 0
# test에만 존재하는 column 확인 및 제거
for col in set(test_encoded.columns) - set(train_encoded.columns):
test_encoded.drop(col, axis=1, inplace=True)
# Column 순서 동일하게 정렬
test_encoded = test_encoded[train_encoded.columns]
MinMaxScaler
적용 부분에서 문제의 원인이 아니므로 수정이 필요 없습니다. 단, fit
메서드는 train
데이터에만 적용하고, transform
메서드를 train
과 test
데이터 모두에 적용하는 것이 일반적입니다.각 단계를 적용하셔서 feature의 개수를 일치시킨 후 다시 모델을 학습시키고 예측을 시도해 보세요.