해결된 질문
작성
·
174
·
수정됨
0
안녕하세요, 5회 작업형을 풀면서 궁금한게 생겨 질문 드립니다.
from sklearn.model_selection import train_test_split
X_tr,X_val,y_tr,y_val = train_test_split(train,y,test_size = 0.1,random_state= 2022)
#modeling # randomForestRegressor, XGBRegressor
from sklearn.ensemble import RandomForestRegressor
#RandomForest
model = RandomForestRegressor()
model.fit(X_tr, y_tr)
pred = model.predict(X_val)
print("rmse:", (mean_squared_error(y_val,pred))**0.5)
이 과정에서는 문제가 생기지 않습니다. X_tr, y_tr 그리고 X_val로 만들어진 pred, y_val의 크기가 각각 일치하기 때문인데 제출을 위해
pred = model.predict(test)
print("rmse:", (mean_squared_error(y,pred))**0.5) # y는 test data에서 pop한 타겟(=price)
이걸 돌리면 사이즈가 맞지 않아 rmse가 나오지 않는다고 합니다. 그도 당연한게 test = pred 는 애초에 train데이터보다 숫자가 훨씩 적은 상태고, y는 train데이터에서 와서 데이터 개수가 훨씬 크기 때문인데요.
전에 똑같은걸 풀어서 그 때는 어떻게 해결했나 보니 y데이터를 따로 주셨더라구요 그건 test data와 크기가 같았고요.
근데 https://www.kaggle.com/competitions/big-data-analytics-certification-kr-2023-5th/data
여기에는 y데이터 값이 존재하지 않는데 이런..경우는 어떻게 해결하나요??
정리하자면, pred의 데이터 사이즈와, 타겟의 데이터 사이즈의 불균형으로인한 rmse 오류를 어떻게 해결하는지 궁금합니다!
아, 그리고 concat 관련 질문도 있습니다.
#get dummies
train_c = pd.get_dummies(train[cols_c],dtype=int) #cols_c는 범주형 데이터 columns list
test_c = pd.get_dummies(test[cols_c],dtype=int)
#concat
train = pd.concat([train,train_c],axis = 1)
test = pd.concat([test,test_c],axis = 1)
train = train.drop('transmission',axis =1 )
test = test.drop('transmission',axis =1)
train = train.drop('fuelType',axis =1 )
test = test.drop('fuelType',axis =1)
제가 get_dummies를 활용해서 one-hot 인코딩을 했는데요,
train[cols_c] = pd.get_dummies(train[cols_c],dtype=int) 이것도.. 사실 새로운 컬럼들이 만들어지는거라 안된다는 판단하에, 아예 새로운 변수에다가 저장해서 원래 데이터에 추가를 했습니다.
저는 회귀를 돌리기 위해 (그리고 원핫인코딩을 한 이유도) 범주형 데이터는 없애야 되잖아요? 그래서 train, test데이터 각각에서 기존 train[col_c]에 해당하는 애들이 없어졌으면 좋겠는데
이런 상황에서 위와 같이 .. 주먹구구식으로 하나씩 안 빼고 한번에 (one-hot 인코딩 + 싹 합치는) ..방법이 있나요???
답변 1
1
1
우선, 아래 코드와 같이 test데이터의 결과를 확인할 수 없습니다. (제공되지 않는 데이터입니다.)
시험에서는 수험생이 나눈 임의의 val로 확인해볼 수 있는 것입니다.
pred = model.predict(test)
print("rmse:", (mean_squared_error(y,pred))**0.5) # y는 test data에서 pop한 타겟(=price)
2
아래와 같이 진행하면 범주형 변수만 인코딩해서 저장합니다.💪
train = pd.get_dummies(train)