강의

멘토링

로드맵

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

작성자 없음

작성자 정보가 삭제된 글입니다.

T2-4 집값 예측 랜덤포레스트에서

작성

·

185

0

집값예측에서 수치형은 원핫인코딩 진행하고 범주형은 라벨인코딩으로 전처리 하려고 하는 코드를 만들어보려고 해요 그런데 하다가 랜덤포레스트에서 막혔습니다,,

 

 

cols1 = X_train.select_dtypes(exclude='object').columns

X_train[cols1] = pd.get_dummies(X_train[cols1])

X_test[cols1] = pd.get_dummies(X_test[cols1])

X_train.shape, X_test.shape

((1168, 79), (292, 79))

cols2 = X_train.select_dtypes(include='object').columns
X_train[cols] = X_train[cols].fillna('NotAvailable')
X_test[cols] = X_test[cols].fillna('NotAvailable')
X_train.head()

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for col in cols:
    X_train[col] = le.fit_transform(X_train[col])
    X_test[col] = le.transform(X_test[col])
X_train.head()

from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['SalePrice'], test_size=0.2, random_state=0)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
((934, 79), (234, 79), (934,), (234,))

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=0)
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)
pred

You have categorical data, but your model needs something numerical. See our one hot encoding tutorial for a solution.
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_20/1040259155.py in <module>
      1 from sklearn.ensemble import RandomForestRegressor
      2 rf = RandomForestRegressor(random_state=0)
----> 3 rf.fit(X_tr, y_tr)
      4 pred = rf.predict(X_val)
      5 pred

/opt/conda/lib/python3.7/site-packages/sklearn/ensemble/_forest.py in fit(self, X, y, sample_weight)
    302             )
    303         X, y = self._validate_data(X, y, multi_output=True,
--> 304                                    accept_sparse="csc", dtype=DTYPE)
    305         if sample_weight is not None:
    306             sample_weight = _check_sample_weight(sample_weight, X)

/opt/conda/lib/python3.7/site-packages/sklearn/base.py in _validate_data(self, X, y, reset, validate_separately, **check_params)
    430                 y = check_array(y, **check_y_params)
    431             else:
--> 432                 X, y = check_X_y(X, y, **check_params)
    433             out = X, y
    434 

/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py in inner_f(*args, **kwargs)
     70                           FutureWarning)
     71         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 72         return f(**kwargs)
     73     return inner_f
     74 

/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, estimator)
    800                     ensure_min_samples=ensure_min_samples,
    801                     ensure_min_features=ensure_min_features,
--> 802                     estimator=estimator)
    803     if multi_output:
    804         y = check_array(y, accept_sparse='csr', force_all_finite=True,

/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py in inner_f(*args, **kwargs)
     70                           FutureWarning)
     71         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 72         return f(**kwargs)
     73     return inner_f
     74 

/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)
    596                     array = array.astype(dtype, casting="unsafe", copy=False)
    597                 else:
--> 598                     array = np.asarray(array, order=order, dtype=dtype)
    599             except ComplexWarning:
    600                 raise ValueError("Complex data not supported\n"

/opt/conda/lib/python3.7/site-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
     81 
     82     """
---> 83     return array(a, dtype, copy=False, order=order)
     84 
     85 

/opt/conda/lib/python3.7/site-packages/pandas/core/generic.py in __array__(self, dtype)
   1991 
   1992     def __array__(self, dtype: NpDtype | None = None) -> np.ndarray:
-> 1993         return np.asarray(self._values, dtype=dtype)
   1994 
   1995     def __array_wrap__(

/opt/conda/lib/python3.7/site-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
     81 
     82     """
---> 83     return array(a, dtype, copy=False, order=order)
     84 
     85 

ValueError: could not convert string to float: 'RL'

답변 1

0

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

chandnd37님의 집값 예측 랜덤포레스트 모델 관련 질문에 도움을 드리겠습니다.

우선 원핫인코딩과 라벨인코딩을 진행할 때, 원핫인코딩은 일반적으로 범주형 변수에 적용하고, 수치형 데이터에 대해서는 별도의 인코딩이 필요하지 않습니다. chandnd37님의 코드를 살펴보면, cols1을 수치형 데이터의 열로 선택하고 이에 대해 pd.get_dummies()를 적용하셨는데, 이는 범주형 데이터에 대해 실행해야 합니다.

변경할 코드는 다음과 같습니다.

cols1 = X_train.select_dtypes(include='object').columns

X_train = pd.get_dummies(X_train, columns=cols1)
X_test = pd.get_dummies(X_test, columns=cols1)

이렇게 하면 모든 범주형 데이터에 대해 원핫인코딩이 적용되고, 결과적으로 수치형 데이터는 그대로 유지되면서 범주형 데이터만 변환됩니다.

또한, 라벨인코딩 부분에서 변수명에 오타가 있는 것 같습니다.

cols2 = X_train.select_dtypes(include='object').columns
X_train[cols2] = X_train[cols2].fillna('NotAvailable')
X_test[cols2] = X_test[cols2].fillna('NotAvailable')

le.fit_transform()과 le.transform()을 사용하여 라벨인코딩을 적용할 때에는 범주형 변수만을 대상으로 해야 합니다. 이미 위의 원핫인코딩에서 모든 범주형 변수를 처리했기 때문에 이 부분은 제거하거나, 다른 범주형 변수가 더 있을 경우 그 변수들에만 적용해야 합니다.

라벨인코딩이 필요한 경우, 아래와 같이 코드를 작성할 수 있습니다.

# cols2는 원핫 인코딩 후에도 남아있는 범주형 변수 이름 리스트입니다.
# 여기서 예시로 'colA', 'colB'를 라벨인코딩 대상으로 가정해보겠습니다.
cols2 = ['colA', 'colB']
for col in cols2:
    X_train[col] = le.fit_transform(X_train[col])
    X_test[col] = le.transform(X_test[col])

마지막으로, 랜덤 포레스트 모델을 학습할 때 “ValueError: could not convert string to float: ‘RL’” 오류는 문자열 값을 실수형으로 변환할 수 없다는 것을 나타냅니다. 이는 대부분 데이터 내에 아직 수치형으로 변환되지 않은 범주형 데이터가 존재할 때 발생합니다. 모든 범주형 변수가 올바르게 인코딩 되었는지 확인하시고, 그래도 오류가 발생한다면 코드를 다시 한번 검토해보시기 바랍니다.

만약 추가적인 도움이 필요하시다면 인프런의 문의하기를 통해 직접 문의하시면 빠른 답변을 받아보실 수 있습니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기