강의

멘토링

로드맵

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

dhtpal5138님의 프로필 이미지
dhtpal5138

작성한 질문수

2유형 에러코드 질문드립니다.

작성

·

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의 개수 차이로 인한 것이므로, 이 부분은 문제의 원인이 아닙니다.

다음은 코드의 수정 방향을 제안하는 예시입니다:
- traintest에 동일한 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 메서드를 traintest 데이터 모두에 적용하는 것이 일반적입니다.

각 단계를 적용하셔서 feature의 개수를 일치시킨 후 다시 모델을 학습시키고 예측을 시도해 보세요.

dhtpal5138님의 프로필 이미지
dhtpal5138

작성한 질문수

질문하기