강의

멘토링

로드맵

Inflearn brand logo image

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

이지웡님의 프로필 이미지
이지웡

작성한 질문수

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

작업형2 모의문제2

작업형2_모의문제2

해결된 질문

작성

·

34

0

#1. 문제탐색
# 회귀모델 csv id,price
# target : price
# R-Squared, MAE, MSE, RMSE, RMSLE, MAPE

# 2. 데이터불러오기
import pandas as pd
import numpy as np

train = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/ab_nyc/train.csv")
test =  pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/ab_nyc/test.csv")
# train = pd.read_csv("train.csv")
# test =  pd.read_csv("test.csv")

#3 데이터 탐색

#print(train.shape, test.shape)
#print(train.head(3), test.head(3))
#print(train.isnull().sum(), test.isnull().sum())
#print(train.info(), test.info())

#4. 데이터 전처리
#print(train.shape, test.shape)
cols = ['name', 'host_name',  'host_id']
train = train.drop(cols, axis =1 )
test = test.drop(cols, axis =1 )
#print(train.shape, test.shape)
train['last_review'] = train['last_review'].mode(0)
test['last_review'] = test['last_review'].mode(0)
train['reviews_per_month'] = train['reviews_per_month'].fillna(0)
test['reviews_per_month'] = test['reviews_per_month'].fillna(0)
#변수부여
target = train.pop('price')
train = train.drop('id', axis=1)
id = test.pop('id')
cols = train.select_dtypes(include = 'object').columns

#print(train.shape, test.shape)

#레이블인코딩
from sklearn.preprocessing import LabelEncoder
for col in cols :
		le = LabelEncoder()
		train[col] = le.fit_transform(train[col])
		test[col] = le.transform(test[col])

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 = 2)


#6.모델 학습 및 평가
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state = 2)
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)

from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error, mean_absolute_percentage_error

mae = mean_absolute_error(y_val, pred)
mse = mean_squared_error(y_val, pred)
mape = mean_absolute_percentage_error(y_val, pred)
rmse = np.sqrt(mean_squared_error(y_val, pred))

print(f"mae: {mean_absolute_error(y_val, pred)}")
print(f"mse: {mean_squared_error(y_val, pred)}")
print(f"mape: {mean_absolute_percentage_error(y_val, pred)}")

pred = rf.predict(test)
submit = pd.DataFrame({'id' : id, 'price' : pred})
submit.to_csv("0516.csv", index = False)

pd.read_csv("0516.csv")

안녕하세요 모의문제 2-2번 레이블 인코딩으로 작성했는데 피드백주실 사항 있으실까요?
이 문제도 원핫인코딩으로 진행해야할까요?

답변 3

0

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

카테고리가 다르다면 train과 test 데이터를 합쳐서 진행이 필요합니다.


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

# 다시 분리
train = df.iloc[:len(train)]
test = df.iloc[len(train):]
print(train.shape, test.shape)

 

0

이지웡님의 프로필 이미지
이지웡
질문자

#1. 문제탐색
# 회귀모델 csv id,price
# target : price
# R-Squared, MAE, MSE, RMSE, RMSLE, MAPE

# 2. 데이터불러오기
import pandas as pd
import numpy as np

train = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/ab_nyc/train.csv")
test =  pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/ab_nyc/test.csv")
# train = pd.read_csv("train.csv")
# test =  pd.read_csv("test.csv")

#3 데이터 탐색

#print(train.shape, test.shape)
#print(train.head(3), test.head(3))
#print(train.isnull().sum(), test.isnull().sum())
#print(train.info(), test.info())

#4. 데이터 전처리
#print(train.shape, test.shape)
cols = ['name', 'host_name',  'host_id']
train = train.drop(cols, axis =1 )
test = test.drop(cols, axis =1 )
#print(train.shape, test.shape)
train['last_review'] = train['last_review'].mode()[0]
test['last_review'] = test['last_review'].mode()[0]
train['reviews_per_month'] = train['reviews_per_month'].fillna(0)
test['reviews_per_month'] = test['reviews_per_month'].fillna(0)
#변수부여
target = train.pop('price')
train = train.drop('id', axis=1)
id = test.pop('id')


# #레이블인코딩
train=pd.get_dummies(train)
test=pd.get_dummies(test)

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 = 2)


# #6.모델 학습 및 평가
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state = 2)
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)

from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error, mean_absolute_percentage_error

mae = mean_absolute_error(y_val, pred)
mse = mean_squared_error(y_val, pred)
mape = mean_absolute_percentage_error(y_val, pred)
rmse = np.sqrt(mean_squared_error(y_val, pred))

print(f"mae: {mean_absolute_error(y_val, pred)}")
print(f"mse: {mean_squared_error(y_val, pred)}")
print(f"mape: {mean_absolute_percentage_error(y_val, pred)}")

pred = rf.predict(test)
submit = pd.DataFrame({'id' : id, 'price' : pred})
submit.to_csv("0516.csv", index = False)

pd.read_csv("0516.csv")

말씀하신 대로 원핫인코딩으로 변환했는데 계속 에러가 뜨네요
컬럼 불일치 에러라고 해서 컬럼 비교해봤는데 동일해서요 ㅠㅠㅠ
이걸어떻게해결해야할까요!?

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-44571701743b> in <cell line: 0>()
     61 print(f"mape: {mean_absolute_percentage_error(y_val, pred)}")
     62 
---> 63 pred = rf.predict(test)
     64 submit = pd.DataFrame({'id' : id, 'price' : pred})
     65 submit.to_csv("0516.csv", index = False)

3 frames
/usr/local/lib/python3.11/dist-packages/sklearn/utils/validation.py in _check_feature_names(estimator, X, reset)
   2775             message += "Feature names must be in the same order as they were in fit.\n"
   2776 
-> 2777         raise ValueError(message)
   2778 
   2779 

ValueError: The feature names should match those that were passed during fit.
Feature names unseen at fit time:
- last_review_2019-07-01
Feature names seen at fit time, yet now missing:
- last_review_2019-06-23
- neighbourhood_Arden Heights
- neighbourhood_Bay Terrace, Staten Island
- neighbourhood_Breezy Point
- neighbourhood_Castleton Corners
- ...

0

안녕하세요, 인프런 AI 인턴입니다. 이지웡님이 작성하신 모의문제 2-2번 코드를 살펴보고 피드백을 드리겠습니다.

전반적인 피드백

이지웡님이 작성하신 코드는 회귀분석을 위한 데이터 처리 및 모델 학습 과정을 잘 구조화하여 작성하셨습니다. 데이터 불러오기, 전처리, 라벨 인코딩, 모델 학습 및 예측 전반에 걸쳐 체계적으로 진행하였습니다. 몇 가지 유의할 점과 추가 개선 사항을 안내드리겠습니다.

피드백 및 개선 제안

  1. 라벨 인코딩 vs 원핫 인코딩

    • 라벨 인코딩(Label Encoding)은 범주형 데이터를 수치형으로 변환하는데 사용됩니다. 그러나 이 방법은 범주 간의 순서를 생성하여 모델이 이를 학습할 수 있다는 단점이 있습니다. 연속적인 값의 차이가 의미가 없을 경우에는 원핫 인코딩이 더 적합합니다.
    • 원핫 인코딩(One-hot Encoding)은 각 범주형 변수를 별도의 이진 벡터로 인코딩하며, 범주형 변수 간의 순서나 크기에 대한 정보를 제거하여 모델이 이를 오해하지 않도록 합니다. 회귀와 같은 경우에서는 일반적으로 원핫 인코딩을 사용하는 것이 더 안전할 수 있습니다.

그러나 사용 가능한 메모리와 연산 능력 또는 데이터의 특징에 따라 어떤 인코딩 방법을 사용할 것인지는 상황에 따라 다릅니다.

  1. 결측값 대체

    • train['last_review']test['last_review']의 결측값을 대체하기 위해 최빈값(mode)을 사용하셨습니다. 다만, train['last_review'].mode(0) 방식이 적절하지 않습니다. .mode() 함수는 반환값으로 Series 객체를 반환하므로, [0]으로 접근하여 가장 빈번하게 등장하는 값을 참조해야 합니다. 예를 들면: train['last_review'] = train['last_review'].fillna(train['last_review'].mode()[0]).
  2. 모델 성능 평가지표

    • 성능 평가에서 여러 메트릭(R-squared, MAE, MSE, RMSE, MAPE)을 출력하고 계신데요, 이 메트릭들을 통해 모델의 성능을 다각도로 평가할 수 있습니다. 좋은 접근 방식입니다.
  3. 최종 예측 및 제출 파일

    • submit.to_csv("0516.csv", index=False)로 예측 결과를 CSV 파일에 저장하는 것은 잘하신 부분입니다. 다만, 예측된 결과를 다시 확인하기 위해 코드를 실행할 때는 제대로 저장되었는지 검토해 보시기 바랍니다.
  4. 성능 향상을 위한 추가 사항

    • 데이터 증강이나 특징 탐색(feature exploration)을 통해 모델에 투입할 변수를 바꾸거나, 특성을 추가해 모델 성능을 향상시킬 수 있습니다.
    • 하이퍼파라미터 최적화(예: GridSearchCV) 기법을 통해 모델을 개선할 수 있습니다.

관련된 문제를 다룬 유사한 질문과 답변의 예시 링크를 통해 더 많은 인사이트를 얻으실 수 있습니다.

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

이지웡님의 프로필 이미지
이지웡

작성한 질문수

질문하기