강의

멘토링

로드맵

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

작성자 없음

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

랜덤포레스트에서 막혔습니다,,

작성

·

236

0

# 시험환경 세팅 (코드 변경 X)
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

def exam_data_load(df, target, id_name="", null_name=""):
    if id_name == "":
        df = df.reset_index().rename(columns={"index": "id"})
        id_name = 'id'
    else:
        id_name = id_name
    
    if null_name != "":
        df[df == null_name] = np.nan
    
    X_train, X_test = train_test_split(df, test_size=0.2, shuffle=True, random_state=2021)
    y_train = X_train[[id_name, target]]
    X_train = X_train.drop(columns=[id_name, target])
    y_test = X_test[[id_name, target]]
    X_test = X_test.drop(columns=[id_name, target])
    return X_train, X_test, y_train, y_test 
    
df = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")
X_train, X_test, y_train, y_test = exam_data_load(df, target='SalePrice', id_name='Id')

X_train.shape, X_test.shape, y_train.shape, y_test.shape

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

target = y_train.pop('SalePrice')
y_test_id = y_train.pop('Id')

# 레이블 인코딩을 수행합니다.
# 모든 문자열 특성에 대해 레이블 인코딩을 적용합니다.
for col in X_train.columns:
    if X_train[col].dtype == 'object':
        # Train에만 있는 레이블을 'unknown'으로 바꾸고 인코딩
        train_unique_labels = set(X_train[col].unique())
        test_unique_labels = set(X_test[col].unique())
        
        # `X_test`에만 존재하는 레이블을 'unknown'으로 변경
        X_test[col] = X_test[col].apply(
            lambda x: 'unknown' if x not in train_unique_labels else x
        )
        
        # 인코딩
        encoder = LabelEncoder()
        encoder.fit(list(train_unique_labels) + ['unknown'])  # 'unknown' 포함하여 학습
        X_train[col] = encoder.transform(X_train[col].astype(str))
        X_test[col] = encoder.transform(X_test[col].astype(str))

from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, target, test_size=0.2, random_state=2022)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
((934, 79), (234, 79), (934,), (234,))

여기까지는 잘 수행이 됐습니다!! unknown 설명 감사합니다

 

그런데,

 

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import r2_score
rf = RandomForestClassifier(random_state=2022)
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)
print(r2_score(y_val, pred))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_20/3726132327.py in <module>
      2 from sklearn.metrics import r2_score
      3 rf = RandomForestClassifier(random_state=2022)
----> 4 rf.fit(X_tr, y_tr)
      5 pred = rf.predict(X_val)
      6 print(r2_score(y_val, 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)
    643         if force_all_finite:
    644             _assert_all_finite(array,
--> 645                                allow_nan=force_all_finite == 'allow-nan')
    646 
    647     if ensure_min_samples > 0:

/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan, msg_dtype)
     97                     msg_err.format
     98                     (type_err,
---> 99                      msg_dtype if msg_dtype is not None else X.dtype)
    100             )
    101     # for object dtype data, we only check for NaNs (GH-13254)

ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

 

여기서 이런 에러가 뜹니다,,,

답변 1

0

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

chandnd37님, RandomForestClassifier는 분류 문제에 사용되는 알고리즘이기 때문에, 예측하려는 ‘SalePrice’가 연속적인 수치 데이터라면 RandomForestRegressor를 사용해야 합니다. 에러 메시지의 내용은 모델 학습 데이터에 NaN 값이 있거나 무한대 혹은 float32 타입으로 표현할 수 없는 너무 큰 값이 있음을 나타냅니다.

데이터에 NaN 값이 있는지 확인하고, 필요하다면 결측치를 처리한 후 모델을 학습시켜야 합니다. 또한, RandomForestRegressor를 사용하여 모델을 학습시켜 보세요.

코드를 다음과 같이 수정해서 시도해보시기 바랍니다.

from sklearn.ensemble import RandomForestRegressor  # Regressor로 변경
from sklearn.metrics import r2_score

# RandomForestRegressor 모델로 변경
rf = RandomForestRegressor(random_state=2022)

rf.fit(X_tr, y_tr)  # 모델 학습
pred = rf.predict(X_val)  # 예측 수행
print(r2_score(y_val, pred))  # R2 스코어 계산

또한, NaN 값에 대한 처리가 필요하다면 아래와 같이 코드를 추가할 수 있습니다.

# NaN 값 확인
print(X_tr.isnull().sum().sum())

# NaN 값이 있다면, 적절한 값으로 채우거나 제거
X_tr.fillna(method='ffill', inplace=True)  # 또는 다른 채우기 전략 사용
X_val.fillna(method='ffill', inplace=True)

NaN 값 처리 방법은 데이터의 특성과 모델 요구 사항에 따라 달라질 수 있으니 적절한 전략을 선택하셔야 합니다. 예를 들어, 위 코드에서는 ‘ffill’ (forward fill) 방법을 사용해 결측치를 앞 방향으로 채우는 방식을 사용했지만, 평균값으로 채우거나 다른 방법으로 대체할 수도 있습니다.

작성자 없음

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

질문하기