오늘은 scikit-learn을 활용해서 선형회귀 모델을 생성하고, 학습하고, 평가하는 기본 흐름을 학습했다.
특히 LinearRegression() 모델을 만들고, fit()으로 학습한 뒤, coef_, intercept_를 통해 회귀식을 해석하는 방법을 익혔다.
또한 회귀 모델의 성능을 평가할 때 사용하는 MSE, RMSE, MAE, R² 개념도 함께 정리했다. 학습 자료에서는 MSE를 실제값과 예측값의 차이를 제곱한 뒤 평균낸 지표로 설명하고, RMSE는 MSE에 루트를 씌워 단위를 맞춘 지표, MAE는 절댓값 기반 오차 지표로 설명한다. R²는 회귀선이 전체 데이터를 얼마나 설명할 수 있는지를 나타내는 지표이다.
1. LinearRegression import
처음에는 아래처럼 잘못 import하려고 했다.
import scikit-learn as sklearn
하지만 파이썬에서 사용할 때는 패키지명을 그대로 쓰는 것이 아니라 sklearn으로 import해야 한다.
from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()
scikit-learn은 설치 이름이고, 코드에서 불러올 때는 sklearn을 사용한다는 점을 확실히 알게 되었다.
2. 모델 학습 흐름
선형회귀 모델의 기본 흐름은 다음과 같다.
from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()
X = tips_df[["total_bill"]]
y = tips_df["tip"]
model_lr.fit(X, y)
여기서 중요한 점은 X는 2차원 데이터로 넣어야 한다는 것이다.
X = tips_df[["total_bill"]]
반면 아래처럼 쓰면 1차원 Series가 되기 때문에 머신러닝 모델 입력값으로 적절하지 않을 수 있다.
X = tips_df["total_bill"]
3. 회귀계수와 절편 확인
학습된 모델에서는 coef_와 intercept_를 통해 회귀식을 확인할 수 있다.
w1 = model_lr.coef_[0]
w0 = model_lr.intercept_
print(f"y = {w1:.2f}x + {w0:.2f}")
의미는 다음과 같다.
| model_lr.coef_ | 기울기, 회귀계수 |
| model_lr.intercept_ | 절편 |
| y = w1*x + w0 | 선형회귀식 |
coef_가 array 형태로 나오는 이유는 입력 변수가 여러 개일 수도 있기 때문이다.
입력 변수가 1개라면 model_lr.coef_[0]으로 숫자만 꺼낼 수 있다.
4. 회귀 평가 지표
회귀 모델은 예측값과 실제값의 차이를 기준으로 평가한다.
MSE
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true, y_pred)
MSE는 오차를 제곱한 뒤 평균낸 값이다.
MSE가 작을수록 예측값이 실제값에 가깝다.
오늘 실습 중에는 함수명을 잘못 입력해서 에러가 났다.
mean_spuared_error(y_true, y_pred2)
올바른 함수명은 다음과 같다.
mean_squared_error(y_true, y_pred2)
즉, spuared가 아니라 squared이다.
RMSE
RMSE는 MSE에 루트를 씌운 값이다.
RMSE = √MSE
MSE는 오차를 제곱하기 때문에 단위가 달라질 수 있는데, RMSE는 루트를 씌워 원래 단위에 더 가깝게 해석할 수 있다.
MAE
MAE는 오차의 절댓값을 평균낸 값이다.
MAE = |실제값 - 예측값|의 평균
제곱을 하지 않기 때문에 MSE보다 이상치의 영향을 덜 받는다.
R²
R²는 회귀선이 데이터를 얼마나 잘 설명하는지를 나타내는 지표이다.
R²가 1에 가까울수록 설명력이 높다.
R²가 0에 가까울수록 평균값으로 예측하는 것과 큰 차이가 없다.
즉, 선형회귀에서는 단순히 오차만 보는 것이 아니라, 모델이 전체 데이터의 변동성을 얼마나 설명하는지도 함께 확인해야 한다.
5. Seaborn 시각화 에러 해결
산점도를 그리다가 아래와 같은 에러가 발생했다.
sns.scatterplot(data=tips_df, X="total_bill", y="tip")
에러 원인은 X를 대문자로 쓴 것이었다.
Seaborn에서는 x, y를 소문자로 써야 한다.
sns.scatterplot(data=tips_df, x="total_bill", y="tip")
회귀선까지 함께 보고 싶다면 regplot()을 사용할 수 있다.
sns.regplot(data=tips_df, x="total_bill", y="tip")
오늘 발생한 에러 정리
| NameError: name 'x' is not defined | x 변수를 만들지 않음 | X = df[["컬럼명"]] 생성 |
| UnicodeDecodeError: cp949 | 주피터가 sklearn 객체를 HTML로 표시하다 인코딩 충돌 | set_config(display="text") |
| NameError: mean_spuared_error | 함수명 오타 | mean_squared_error |
| unexpected keyword argument 'X' | scatterplot()에서 X 대문자 사용 | x 소문자로 수정 |
최종 정리 코드
from sklearn import set_config
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import seaborn as sns
import matplotlib.pyplot as plt
set_config(display="text")
X = tips_df[["total_bill"]]
y = tips_df["tip"]
model_lr = LinearRegression()
model_lr.fit(X, y)
y_pred = model_lr.predict(X)
w1 = model_lr.coef_[0]
w0 = model_lr.intercept_
print(f"회귀식: y = {w1:.2f}x + {w0:.2f}")
mse = mean_squared_error(y, y_pred)
print("MSE:", mse)
sns.regplot(data=tips_df, x="total_bill", y="tip")
plt.show()
오늘의 회고
오늘은 선형회귀의 전체 흐름을 직접 실습하면서, 단순히 모델을 만드는 것보다 데이터 형태, 함수명, 매개변수 이름을 정확히 쓰는 것이 중요하다는 것을 느꼈다.
특히 X는 머신러닝 모델의 입력값이라 2차원 형태로 준비해야 하고, coef_, intercept_를 통해 모델이 만든 회귀식을 직접 해석할 수 있다는 점이 중요했다.
또한 MSE, RMSE, MAE, R²는 회귀 모델을 평가할 때 각각 다른 관점에서 모델 성능을 보여주기 때문에, 앞으로 회귀분석을 할 때는 단순히 예측만 하는 것이 아니라 모델이 얼마나 잘 맞는지 평가하는 과정까지 함께 진행해야겠다.