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

김주원님의 프로필 이미지
김주원

작성한 질문수

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

모델링 및 평가(분류)

작업형 2 모의문제 2번

해결된 질문

작성

·

164

0

  • 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!

  • 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요

  • 먼저 유사한 질문이 있었는지 검색해보세요

안녕하세요 선생님! 항상 좋은 강의 제공해주셔서 감사합니다!

'작업형2 한가지 방법으로만 푸는 방법' 강의해주신 걸 기반으로 작업형 2 모의문제 2번 코드를 작성해 봤는데요 잘 실행되지가 않습니다.

import pandas as pd
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
y_test= pd.read_csv('y_test.csv')

print(train.shape, test.shape)

print(train.head())
print(test.head())
print(train.isnull().sum())
print(test.isnull().sum()) 
train['price'].describe()#분류는 밸류카운트로 타겟확인
train['reviews_per_month'].sample(10)
train.info()
# 월간리뷰는 mean으로, 라스트리뷰는 0으로

print(train.head(2))
train.nunique() #name, hostname lastreview 삭제
cols = ['name','host_name','last_review','host_id']
# print('삭제전',train.shape)
train = train.drop(cols, axis =1)
test = test.drop(cols, axis =1)
print('\n삭제한 후', train.shape)

train['reviews_per_month'] = train['reviews_per_month'].fillna(0)
test['reviews_per_month'] = test['reviews_per_month'].fillna(0)
train.isnull().sum()
train = train.drop('id',axis = 1)
testid = test.pop('id') #테스트아이디는 나중에 쓰니까
# test.head()
print(train.isnull().sum())
#test.info()
# print(train.shape)
# print(test.shape)
print(test.info())
print(train.info())
train = pd.get_dummies(train)
test = pd.get_dummies(test)

set1 = set(train.columns)
set2 = set(test.columns)
print('------------차이가없어야하는데',set1 - set2,'-----------------')

df = pd.concat([train, test], axis=0)
train = df.iloc[:len(train), :]
test = df.iloc[len(train):, :]
print('------------아직도 차이가 있나',set1 - set2,'-----------------')
# print(train.shape)
# print(test.shape)
# print(train.shape, test.shape)
# from sklearn.model_selection import train_test_split

# print(train.head(2))
# target = train['price']
# target.sample(3)
# xtr,xval,ytr,yval = train_test_split(train,target,test_size = 0.2, random_state=2)
# print('\n분할 데이터 크기', xtr.shape,xval.shape,ytr.shape,yval.shape)

# from sklearn.ensemble import RandomForestRegressor
# rf=RandomForestRegressor(random_state=0)
# rf.fit(xtr,ytr)
# pred = rf.predict(xval)

# from sklearn.metrics import mean_squared_error
# rmse = mean_squared_error(yval,pred)
# rmse = rmse ** 0.5
# rmse
# test.head()

#from sklearn.metrics import r2_score
#y_test = pd.read_csv("y_test.csv")
#print('r2도 좋다면',r2_score(y_test, pred))

pred = rf.predict(test)
submit = pd.DataFrame({'id':test_id,'output' :pred }).to_csv('왜안만들어지지;;.csv',index=False)
submit.to_csv("result.csv", index=False)

이렇게 코드를 작성해봤는데, r2 score로 평가가 안되고,
pred = rf.predict(test)에서 train, test의 컬럼수가 차이난다는 오류가 떠서 인코딩 후 concat 활용후 다시 분리하는 작업도 했는데 계속 안돌아갑니다...

답변 2

0

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

에러도 함께 주시면 파악이 쉬울 것 같아요

원핫인코딩 합쳐서 원핫 인코딩 한다면

train = pd.get_dummies(train)

test = pd.get_dummies(test)

는 삭제해주세요

지금 흐름이 각각 원핫 인코딩 했다가

df = pd.concat([train, test], axis=0) 으로 데이터를 합치긴 하셨는데

이러면 의미가 없습니다. 이미 원핫인코딩된 것을 합쳤네요~

 

그리고 합친 다음 원핫인코딩은 하지 않고 바로 나누기를 하고 있어요

df = pd.concat([train, test], axis=0)
# 여기에 원핫인코딩 필요 
train = df.iloc[:len(train), :]
test = df.iloc[len(train):, :]

 

 

  1. test_id와 testid 등 여러개의 변수를 혼용해서 사용하고 있어요

 

  1. to_csv를 두번이나 하고 있어요!

submit = pd.DataFrame({'id':test_id,'output' :pred }).to_csv('왜안만들어지지;;.csv',index=False) submit.to_csv("result.csv", index=False)

 

현 상황이 1개의 실수가 아니라 여러개의 실수가 있고,

위에서 실수를 발견하지 못한채 끝까지 코딩을 하고 있는 것으로 보여요. 이러면 시험에서도 에러찾기 어렵습니다.

중간중간 작업결과를 print()로 확인하면서 내려와주세요!

도전보다는 강의에서 제공된 코드를 따라하면서 익숙해지는 것이 우선으로 보여집니다.

김주원님의 프로필 이미지
김주원
질문자

import pandas as pd
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
y_test= pd.read_csv('y_test.csv')

# print(train.shape, test.shape)
train.head()
# print(train.head())
# print(test.head())
# print(train.isnull().sum())
# print(test.isnull().sum())
# train['price'].describe()#분류는 밸류카운트로 타겟확인
# train['reviews_per_month'].sample(10)
# train.info()
# 월간리뷰는 mean으로, 라스트리뷰는 0으로

print(train.head(2))
train.nunique() #name, hostname lastreview 삭제
cols = ['name','host_name','last_review','host_id']
print('삭제전',train.shape)
train = train.drop(cols, axis =1)
test = test.drop(cols, axis =1)
print('\n삭제한 후', train.shape)
train['reviews_per_month'] = train['reviews_per_month'].fillna(train['reviews_per_month'].mean())
test['reviews_per_month'] = test['reviews_per_month'].fillna(test['reviews_per_month'].mean())
train.isnull().sum()
train = train.drop('id',axis = 1)
test_id = test.pop('id') #테스트아이디는 나중에 쓰니까
# test.head()
# print(train.isnull().sum())
# #test.info()
# # print(train.shape)
# # print(test.shape)
# print(test.info())
# print(train.info())

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


df=pd.get_dummies(df)


train = df.iloc[:len(train), :]
test = df.iloc[len(train):, :]
print('=======\n get dummies 후=========')
print(train.shape, test.shape)

from sklearn.model_selection import train_test_split

# print(train.head(2))
target = train['price']
# target.sample(3)
xtr,xval,ytr,yval = train_test_split(train,target,test_size = 0.2, random_state=2)
print('\n분할 데이터 크기', xtr.shape,xval.shape,ytr.shape,yval.shape)

print('\n =====xtr 결측치=====', xtr.isnull().sum().sum())

from sklearn.ensemble import RandomForestRegressor
rf=RandomForestRegressor(random_state=0)
rf.fit(xtr,ytr)
pred = rf.predict(xval)



from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(yval,pred)
rmse = rmse ** 0.5
print('\n rsme값은 : ', rmse)
print(train.shape, test.shape)


이렇게 수정하니까 이제 rf.fit(xtr,ytr) 에서 xtr에서 결측치가 있다는 오류가 발생합니다. 결측치 다 처리하고, 확인한 후 인코딩했는데 왜 발생하는지 모르겠습니다. 범주형 데이터 때문인가요?

 

0

안녕하세요, 인프런 AI 인턴입니다. 김주원님의 질문에 답변드리겠습니다.

작업형 2 유형의 문제 해결 과정에서 나타나는 train과 test 데이터의 컬럼 수 불일치 문제는 종종 발생하는 일반적인 문제입니다. 이 문제는 주로 범주형 변수의 라벨이 train 데이터와 test 데이터에서 다르게 구성되어 있을 때 발생합니다. 이 경우, pd.get_dummies() 함수를 사용할 때 train 데이터에는 존재하나 test 데이터에는 존재하지 않는, 또는 그 반대의 경우의 더미 변수(컬럼)가 생성됩니다. 이로 인해 두 데이터 세트의 컬럼 수가 달라질 수 있습니다.

김주원님께서 코드를 작성하신 방식은 기본적으로 올바른 방향입니다. 다만, 이 문제를 해결하기 위해서는 다음과 같은 추가 단계를 고려할 수 있습니다.

  1. 데이터 병합 전에 라벨 인코딩 적용: pd.get_dummies()를 이용하기 전에 train과 test 데이터를 합친 후 라벨 인코딩을 적용하면, 모든 범주형 변수에 대해 일관된 컬럼을 생성할 수 있습니다.

  2. 컬럼 일치 확인 및 조정: train과 test 데이터에 대해 더미 변수를 생성한 후, 양쪽 데이터 세트에서 공통되지 않는 컬럼을 확인하고, 이를 수동으로 추가하거나 제거해 주어야 합니다. 컬럼을 추가할 때는 값으로 0을 채워 넣어 주면 됩니다.

하지만, 김주원님의 경우에는 rf.predict(test)에서 오류가 발생하기 전에, 모델 학습에 필요한 부분(rf.fit(X, y) 등)이 코드에서 누락된 것으로 보입니다. 아래는 모델을 학습시키는 예시 코드입니다.

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=0)
X_train = train.drop('price', axis=1) # 여기서 'price'는 타겟 변수 이름에 해당합니다.
y_train = train['price']
rf.fit(X_train, y_train)

본 문제와 유사한 경우를 다룬 기존 게시글이 있어 추천드립니다. 다음 링크는 작업형 2 모의문제 2에 대한 질문과 해당 문제에 대한 해결 방법이 담긴 게시글입니다:
- 작업형2 모의문제2

이 게시글은 데이터 전처리, 더미 변수 생성, 모델 학습 및 예측값 제출의 전체적인 과정을 다루고 있습니다. 특히, pandas 라이브러리를 사용한 데이터 전처리와 RandomForestRegressor 모델을 사용한 학습 및 예측 과정에서 도움을 받을 수 있을 것입니다.

분석 과정에서 나타날 수 있는 일반적인 문제와 해결 팁 외에도, 정확한 컬럼 일치성 확보 및 모델 학습 부분에 조금 더 주의를 기울여야 할 것 같습니다.

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

김주원님의 프로필 이미지
김주원

작성한 질문수

질문하기