강의

멘토링

커뮤니티

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

합격님의 프로필 이미지
합격

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

[작업형2] 연습문제 섹션 6

Section 6. 노트북 가격 예측

해결된 질문

작성

·

26

·

수정됨

0

# 결측치 처리(범주형)

c_cols = ['Model', 'Series', 'Processor', 'Processor_Gen', 'Hard_Disk_Capacity', 'OS']

train[c_cols] = train[c_cols].fillna("X")

test[c_cols] = test[c_cols].fillna("X")

# 결측치 처리(수치형)

n_cols = ['RAM']

train[n_cols] = train[n_cols].fillna(-1)

test[n_cols] = test[n_cols].fillna(-1)

1. 결측치 처리를 문제에서 결측치 처리 하라는 말 없어도 그냥 하는건가요?

2. 범주형은 문자열 X로 하는건가요? 그냥 하는건지?

3. 수치형은 -1로 한건가요? 왜 -1로 한건가요?

# 원핫인코딩

combined = pd.concat([train, test])

combined_dummies = pd.get_dummies(combined)

n_train = len(train)

train = combined_dummies[:n_train]

test = combined_dummies[n_train:]

4. 합쳐서 인코딩한게.. 그 오브젝트 유니크 수가 트레인이랑, 테스트가 달라서 한거 맞을까요?

 

 

 

  1. 제가 코딩한 거는

     

target=train.pop('Price')

c_cols=['Model','Series','Processor', 'Processor_Gen', 'Hard_Disk_Capacity','OS']
train[c_cols]=train[c_cols].fillna("X")
test[c_cols]=test[c_cols].fillna("X")
n_cols=['RAM']
train[n_cols]=train[n_cols].fillna(-1)
test[n_cols]=test[n_cols].fillna(-1)
print(train.isnull().sum().sum())
print(test.isnull().sum().sum())

df=pd.concat([train, test])
df=pd.get_dummies(df)

train=train.iloc[:len(train)]
test=test.iloc[len(train):]

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)
print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)

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

from sklearn.metrics import r2_score
r2_score(y_val, pred)

 

이렇게했는데

 

~~~~~~

(72, 9) (19, 9) (72,) (19,)

---------------------------------------------------------------------------

ValueError Traceback (most recent call last)

/tmp/ipython-input-2530691866.py in <cell line: 0>()

31 from sklearn.ensemble import RandomForestRegressor

32 rf=RandomForestRegressor(random_state=0)

---> 33 rf.fit(X_tr, y_tr)

34 pred=rf.predict(X_val)

35

6 frames

/usr/local/lib/python3.12/dist-packages/pandas/core/generic.py in array(self, dtype, copy)

2151 ) -> np.ndarray:

2152 values = self._values

-> 2153 arr = np.asarray(values, dtype=dtype)

2154 if (

2155 astype_is_view(values.dtype, arr.dtype)

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

 

이렇게 오류가 납니다

그전까지는 뭔가 잘 실행됐는데 랜덤포레스트이후??오류가 납니다

답변 2

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

  1. 네 작업형2는 작업형1이나 3과 달리
    알아서 판단해서 처리하는 문제입니다.

  2. 임의의 값을 넣었습니다. (이유가 있는 결측일 수도 있어 결측치라고 표시)

  3. 임의의 값을 넣었습니다. (이유가 있는 결측일 수도 있어 결측치라고 표시)

  4. 네 맞습니다.

2번과 3번은 임의값 넣는게 맞다!! 가 아니라

임의값도 넣어보고 중앙, 최빈, 최소값도 넣어보고 비교해서 가장 성능이 좋은 전처리를 선택하는 것이에요!

0

안녕하세요, 인프런 AI 인턴입니다. 합격님, 질문 주셔서 감사합니다.

질문을 바탕으로 한 핵심 사항들을 정리하고 이에 대한 답변과 함께 유사한 사례를 소개해 드리겠습니다.

1. 결측치 처리 방법

  • 결측치 처리 여부: 데이터 분석 때 결측치는 반드시 고려해야 하는 요소 중 하나입니다. 결측값을 그대로 두면 머신러닝 모델이 이를 처리할 수 없어 에러가 발생할 수 있습니다. 따라서 명시적인 지시가 없더라도 적절한 방식으로 결측치를 처리하는 것이 일반적입니다.

  • 범주형 결측치 처리: 범주형 데이터에서 결측치를 단순한 문자(예: "X")로 치환하는 것은 흔히 사용되는 방법입니다. 이는 결측치를 하나의 새로운 범주로 간주하는 방식입니다.

  • 수치형 결측치 처리: 수치형 데이터에서 결측치를 -1로 대체하는 것은 데이터에 대한 구체적인 분석이나 도메인 지식이 있는 상황에서 종종 사용됩니다. -1은 해당 변수에 존재할 수 없는 값으로 결측치를 나타내기 위함입니다.

2. 원핫 인코딩과 데이터 결합

  • 데이터 결합의 이유: traintest 데이터를 결합하여 원핫 인코딩을 하는 이유는 두 데이터셋에서의 범주형 피처의 유니크 값이 다를 수 있기 때문입니다. 이렇게 결합하여 처리하면 동일한 열 구조를 가지게 되어 이후 모델링 시 더욱 일관되게 사용할 수 있습니다.

3. 발생 에러 해결

  • ValueError 해결: “ValueError: could not convert string to float: ‘Lenovo’“라는 에러는 범주형 데이터가 인코딩되지 않아 발생한 문제입니다. 원핫 인코딩 후 ‘train’과 ‘test’ 데이터를 분리할 때 데이터셋이 제대로 분할되지 않았을 수 있습니다.

올바른 방법은 다음과 같습니다:

  combined = pd.concat([train, test])
  combined_dummies = pd.get_dummies(combined)
  
  n_train = len(train)
  
  train = combined_dummies[:n_train]
  test = combined_dummies[n_train:]

인코딩 전후 데이터 분할을 확인하여 문제가 없는지 점검해 보세요.

유사 사례 및 추가 도움

유사 오류 및 해법에 대한 예시는 아래 게시물들을 참고하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

합격님의 프로필 이미지
합격

작성한 질문수

질문하기