04단계 · 2유형 — 예측과 제출
회귀 모델과 RMSE
연속값을 예측하고 RMSE·R² 로 평가한다.
먼저 알아볼게요
코드로 이동 ↓예측할 값이 0/1 이 아니라 숫자(대여량·가격·매출)면 회귀다. RandomForestRegressor 를 쓰고, 쓰는 법은 분류와 같다.
RMSE(평균제곱근오차)는 예측이 정답에서 평균적으로 얼마나 떨어졌는지를 원래 단위로 말해 준다. 작을수록 좋다.
이 수업에서는 from sklearn.metrics import root_mean_squared_error 를 쓴다. 같은 값을 직접 계산하는 방식은 np.sqrt(mean_squared_error(...)) 를 썼다. 두 값은 같다 — 아래에서 직접 확인한다.
옛 자료에는 mean_squared_error(..., squared=False) 로 적힌 풀이가 많은데, 이 실행 환경(scikit-learn 1.8)은 그 인자를 아예 받지 않는다 — 실행하면 TypeError: got an unexpected keyword argument 'squared' 다(실측). 그대로 베끼면 오류를 만난다.
R² 는 모델이 정답의 변동을 얼마나 설명하는지다. 1 에 가까울수록 좋고, 0 이면 평균으로 찍는 것과 같으며 음수도 나온다.
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import root_mean_squared_error
train = pd.read_csv("bike_train.csv")
X = train[["기온", "습도", "시간대"]]
y = train["대여량"]
m = RandomForestRegressor(n_estimators=30, random_state=0).fit(X, y)
print(round(root_mean_squared_error(y, m.predict(X)), 4))RMSE 는 root_mean_squared_error. 이 수업의 실행 환경에서는 squared=False 대신 이 함수를 쓴다.
bike_train.csv 에서 요일 을 get_dummies 로 바꾸고 대여량 을 y 로 두어, test_size=0.2, random_state=42 로 나눈 뒤 RandomForestRegressor(n_estimators=100, random_state=42) 를 학습시키세요. ① RMSE(소수 4) ② np.sqrt(mean_squared_error(...))(소수 4) ③ R²(소수 4) ④ 예측값의 최솟값(소수 4)을 출력하세요.
제공 파일 1개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
기온,습도,풍속,요일,공휴일,시간대,대여량 22.8,47,1.9,월,0,3,3 20.6,73,3.5,목,0,3,2 20.0,88,1.7,월,0,13,17 4.5,91,3.0,목,0,22,2 16.0,32,2.9,일,0,8,13 0.3,59,0.6,금,1,22,3 19.5,70,2.6,일,0,17,23 10.4,41,2.5,일,0,9,22 18.6,92,2.1,금,0,21,8 18.0,44,2.9,목,0,22,15 19.2,41,3.4,금,0,9,31 26.7,41,4.0,화,0,0,6 19.0,89,2.0,목,0,14,10 11.3,36,3.6,금,1,16,6 12.7,42,2.4,일,0,18,19 11.0,84,2.8,월,1,14,2 16.2,70,2.5,수,0,4,1 22.2,86,1.1,수,0,4,3 12.1,77,4.6,목,0,10,3 11.4,85,2.1,토,0,3,2 29.8,44,-0.2,토,0,20,25 13.3,72,2.0,수,0,13,6 15.7,78,5.3,토,0,13,7 13.3,57,2.7,금,0,16,10 31.7,91,2.1,일,0,19,44 17.7,39,1.9,금,0,16,9 5.9,59,2.7,수,1,3,1 16.2,65,2.1,월,0,6,14 3.7,77,2.1,목,0,11,5 18.5,56,2.5,수,1,6,5 14.8,87,1.8,금,0,21,5 21.4,78,2.2,토,0,16,12 26.8,37,3.4,수,0,18,69 24.3,40,2.5,화,0,5,2 17.2,53,4.2,금,0,1,3 11.2,66,2.0,금,0,2,1 23.0,31,1.7,토,0,20,13 10.3,84,4.4,토,1,12,5 7.2,43,3.2,화,0,22,9 26.4,57,3.8,월,0,4,3 21.2,74,1.5,토,0,0,2 6.4,86,1.7,금,0,19,17 17.2,53,3.5,일,0,6,13 12.7,44,1.5,목,1,11,9 16.0,62,3.5,화,0,2,2 23.1,87,1.3,목,0,5,3 22.8,40,2.0,목,0,15,14 16.6,51,4.3,월,0,4,4 38.0,46,3.8,일,0,22,44 21.7,47,0.7,금,0,11,11 23.7,36,4.1,목,0,4,3 15.5,46,2.5,화,0,4,2 6.9,32,2.2,금,0,12,8 16.5,50,3.3,목,0,9,28 9.4,80,2.3,수,0,15,6 20.2,83,3.2,일,0,8,21 11.4,60,1.2,화,0,21,12 20.4,91,2.9,금,0,14,5 9.2,77,2.2,목,0,21,5 11.6,92,2.5,화,0,5,1 21.0,89,2.5,토,0,4,2 8.3,95,1.6,월,0,11,4 10.7,63,2.0,월,0,11,5 26.5,30,3.0,목,0,23,8 25.5,74,4.0,화,0,21,14 1.7,39,2.1,일,0,18,13 30.7,77,2.4,수,0,20,13 19.4,72,1.8,목,0,17,24 21.2,62,2.8,수,1,13,12 4.5,44,2.9,토,0,1,2 15.5,35,2.5,월,0,10,6 29.3,45,1.7,금,0,1,4 31.0,82,3.2,목,0,22,13 16.1,46,3.6,화,0,23,6 18.8,76,2.1,금,0,10,13 22.9,90,3.0,토,1,2,1 21.0,44,3.1,목,0,0,3 15.6,30,0.6,목,1,6,9 28.6,46,2.6,일,0,19,63 18.4,42,1.9,수,0,10,9 14.7,39,1.4,월,0,20,6 15.8,32,2.4,토,0,15,8 13.7,49,2.0,금,0,11,6 20.2,93,1.7,월,0,0,1 29.5,46,2.2,수,1,8,28 9.7,57,2.4,수,0,13,4 7.8,73,3.6,토,0,19,15 28.6,53,2.2,금,0,16,20 17.0,44,3.7,토,0,15,13 26.7,91,3.2,토,1,15,7 3.3,87,2.5,화,1,18,5 4.8,87,3.8,토,0,13,6 10.0,56,3.7,수,0,10,10 19.3,88,-0.6,일,0,23,5 21.0,70,3.4,화,1,19,9 26.8,48,3.1,일,0,8,21 11.8,67,3.8,화,0,3,2 18.5,59,3.9,토,0,8,18 -5.2,54,2.1,토,0,17,6 17.2,93,2.2,금,0,6,6 12.3,85,2.3,수,0,18,15 8.0,65,2.8,목,0,3,4 11.0,91,0.8,일,0,3,1 12.5,87,3.7,토,1,23,6 23.2,63,2.6,월,0,14,9 9.7,53,3.1,수,1,21,9 17.5,40,2.0,화,0,23,15 24.8,34,3.4,수,0,2,3 0.5,31,4.0,토,0,21,9 17.5,58,0.5,토,0,5,1 17.8,76,2.5,금,0,13,5 14.5,78,1.7,화,0,0,1 16.8,31,1.8,금,0,3,4 26.1,39,0.5,토,0,21,32 14.7,84,3.3,금,0,17,19 33.6,88,1.6,금,0,16,33 16.4,57,2.9,월,0,6,14 18.3,94,2.2,월,0,5,2 16.4,43,3.4,화,0,16,8 18.1,61,3.6,수,1,3,2 16.9,64,3.8,수,0,12,7 29.7,42,4.3,화,0,20,10 15.0,92,4.9,금,1,12,6 25.2,47,3.5,목,1,3,3 13.8,51,2.3,목,0,10,10 11.5,40,3.1,목,1,19,20 29.0,66,2.9,금,0,19,25 12.6,31,2.4,월,0,3,2 26.9,75,2.7,일,0,8,40 24.3,41,2.2,화,1,22,13 7.3,93,3.0,목,0,18,10 26.5,63,2.4,수,1,10,16 25.5,79,2.1,일,1,21,11 20.3,89,2.8,일,0,12,5 9.0,74,3.6,수,0,8,10 20.1,88,1.7,토,0,22,6 22.4,48,2.7,토,0,2,2 22.7,52,3.1,토,0,6,10 17.9,92,2.9,일,1,5,1 16.2,78,2.2,수,0,2,1 23.4,40,2.9,일,0,13,17 25.0,53,1.8,금,0,17,28 24.7,31,0.1,금,0,7,60 16.6,68,0.7,월,1,21,5 14.5,90,2.4,일,0,7,22 7.7,84,3.9,수,0,19,23 17.3,59,-0.2,화,0,13,10 11.9,38,3.6,금,0,14,9 7.8,49,4.0,목,0,7,9 4.5,46,2.5,금,0,19,16 23.0,58,1.9,금,1,1,3 26.8,85,2.4,토,0,12,14 21.9,91,4.3,화,0,5,2 16.0,95,3.8,목,0,14,9 13.6,49,1.9,토,0,3,3 16.7,48,2.2,목,0,5,1 19.0,31,3.3,금,0,12,13 27.3,37,2.1,일,0,4,4 37.6,90,3.6,목,0,14,19 18.0,91,1.9,일,0,21,10
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score, root_mean_squared_error
from sklearn.model_selection import train_test_split
train = pd.read_csv("bike_train.csv")
X = pd.get_dummies(train.drop(columns=["대여량"]), columns=["요일"])
y = train["대여량"]
x_tr, x_va, y_tr, y_va = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestRegressor(n_estimators=100, random_state=42).fit(x_tr, y_tr)
pred = model.predict(x_va)
print(round(root_mean_squared_error(y_va, pred), 4))
print(round(float(np.sqrt(mean_squared_error(y_va, pred))), 4))
print(round(r2_score(y_va, pred), 4))
print(round(float(pred.min()), 4))