인프런 커뮤니티 질문&답변
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. 합쳐서 인코딩한게.. 그 오브젝트 유니크 수가 트레인이랑, 테스트가 달라서 한거 맞을까요?
제가 코딩한 거는
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
네 작업형2는 작업형1이나 3과 달리
알아서 판단해서 처리하는 문제입니다.임의의 값을 넣었습니다. (이유가 있는 결측일 수도 있어 결측치라고 표시)
임의의 값을 넣었습니다. (이유가 있는 결측일 수도 있어 결측치라고 표시)
네 맞습니다.
2번과 3번은 임의값 넣는게 맞다!! 가 아니라
임의값도 넣어보고 중앙, 최빈, 최소값도 넣어보고 비교해서 가장 성능이 좋은 전처리를 선택하는 것이에요!
0
안녕하세요, 인프런 AI 인턴입니다. 합격님, 질문 주셔서 감사합니다.
질문을 바탕으로 한 핵심 사항들을 정리하고 이에 대한 답변과 함께 유사한 사례를 소개해 드리겠습니다.
1. 결측치 처리 방법
결측치 처리 여부: 데이터 분석 때 결측치는 반드시 고려해야 하는 요소 중 하나입니다. 결측값을 그대로 두면 머신러닝 모델이 이를 처리할 수 없어 에러가 발생할 수 있습니다. 따라서 명시적인 지시가 없더라도 적절한 방식으로 결측치를 처리하는 것이 일반적입니다.
범주형 결측치 처리: 범주형 데이터에서 결측치를 단순한 문자(예:
"X")로 치환하는 것은 흔히 사용되는 방법입니다. 이는 결측치를 하나의 새로운 범주로 간주하는 방식입니다.수치형 결측치 처리: 수치형 데이터에서 결측치를 -1로 대체하는 것은 데이터에 대한 구체적인 분석이나 도메인 지식이 있는 상황에서 종종 사용됩니다. -1은 해당 변수에 존재할 수 없는 값으로 결측치를 나타내기 위함입니다.
2. 원핫 인코딩과 데이터 결합
- 데이터 결합의 이유:
train과test데이터를 결합하여 원핫 인코딩을 하는 이유는 두 데이터셋에서의 범주형 피처의 유니크 값이 다를 수 있기 때문입니다. 이렇게 결합하여 처리하면 동일한 열 구조를 가지게 되어 이후 모델링 시 더욱 일관되게 사용할 수 있습니다.
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:]
인코딩 전후 데이터 분할을 확인하여 문제가 없는지 점검해 보세요.
유사 사례 및 추가 도움
유사 오류 및 해법에 대한 예시는 아래 게시물들을 참고하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





