데이터 중 필요데이터만 요약
# feature와 label 나누기 X = df.drop('price', axis=1) y = df['price']
from sklearn.model_selection import train_test_split # 학습, 테스트 데이터로 나누기 (학습데이터 사이즈 = 75%, 테스트 데이터 사이즈 = 25%) X_train, X_test, y_train, y_test = train_test_split(X,y, train_size=0.75) X_train.shape, X_test.shape # # # out: # ((16209, 16), (5404, 16))
from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score from math import sqrt # 회귀모델 생성 lm = LinearRegression() # 두가지 특성열 선택하여 다중 회귀 모델 생성 X_train = X_train[['sqft_living', 'grade']] X_test = X_test[['sqft_living', 'grade']] # 학습 데이터 선형회귀모델로 학습 lm.fit(X_train, y_train) # 테스트 데이터에 대한 예측 pred = lm.predict(X_test) t_pred = lm.predict(X_train) # train 데이터에 대한 MSE, MAE, RMSE, R2 t_mse = mean_squared_error(y_train, t_pred) t_mae = mean_absolute_error(y_train, t_pred) t_rmse = sqrt(t_mse) t_r2 = r2_score(y_train, t_pred) # test 데이터에 대한 MSE, MAE, RMSE, R2 mse = mean_squared_error(y_test, pred) mae = mean_absolute_error(y_test, pred) rmse = sqrt(mse) r2 = r2_score(y_test, pred) print(f"모델의 절편 : {lm.intercept_}\n") print(f"모델의 sqft_living 특성에 대한 회귀 계수 : {lm.coef_[0]}") print(f"모델의 grade 특성에 대한 회귀 계수 : {lm.coef_[1]}\n") print("train data MSE, MAE, RMSE, R2") print(f"MSE : {t_mse}\nMAE : {t_mae}\nRMSE : {t_rmse}\nR2 : {t_r2}\n") print("test data MSE, MAE, RMSE, R2") print(f"MSE : {mse}\nMAE : {mae}\nRMSE : {rmse}\nR2 : {r2}") # # # out: # 모델의 절편 : -623763.8067710708 # 모델의 sqft_living 특성에 대한 회귀 계수 : 175.3032095614536 # 모델의 grade 특성에 대한 회귀 계수 : 104411.56033263664 # train data MSE, MAE, RMSE, R2 # MSE : 61475383701.26112 # MAE : 164744.54346371544 # RMSE : 247942.29913683774 # R2 : 0.5349424211836689 # test data MSE, MAE, RMSE, R2 # MSE : 66643527809.12729 # MAE : 162378.15102719804 # RMSE : 258154.0776534961 # R2 : 0.5324446606536419
결정계수 이 학습데이터와 테스트 데이터 간의 차이가 거의 없다고 볼 수 있기 때문에 "일반화가 잘 되었다" 고 판단할 수 있다.