08_ML(Machine_Learning)

08_선형회귀

chuuvelop 2025. 4. 4. 01:14
728x90
선형회귀

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

 

df = pd.read_csv("./data/Fish.csv")
df = df.loc[df["Species"] == "Perch", ["Species", "Length2", "Weight"]]

 

df.head()

 

x_train, x_test, y_train, y_test = train_test_split(df["Length2"], df["Weight"], test_size = 0.25, 
                                                    random_state = 23)
x_train = np.reshape(x_train.values, (-1, 1))
x_test = np.reshape(x_test.values, (-1, 1))

 

 

 

01. 선형 회귀(linear regression)

 

  • 피쳐를 가장 잘 표현하는 하나의 직선을 학습하는 알고리즘 (데이터의 일반적인 패턴을 파악 예)y = ax + b)
  • 장점
    • 계수들에 대한 해석이 간단
    • 학습과 예측 속도가 빠름
    • 회귀식이 만들어져서 예측이 어떻게 됐는지 쉽게 이해할 수 있음
  • 단점
    • 데이터가 선형적이지 않을 경우 모델이 데이터에 적합하지 않을 수 있음
    • 이상치에 민감

 

lr = LinearRegression()

 

# 선형회귀 모델 훈련
lr.fit(x_train, y_train)

 

# 50cm 농어에 대한 예측
lr.predict([[50]])
array([1180.93954674])

 

  • 선형회귀 모델이 찾은 가장 적합한 직선은 lr 객체에 저장되어 있음
# 계수(coefficient), y절편
print(lr.coef_, lr.intercept_)
[35.83686955] -610.9039309395812

 

  • 회귀식: 35.84 * Length2 + (-610.9)
  • coef_ 와 intercept_ 처럼 머신러닝이 찾은 값을 모델 파라미터(model parameter) 라고 부름
  • 즉, 머신러닝 알고리즘의 훈련 과정은 최적의 모델 파라미터를 찾는 것
  • 선형 회귀와 같이 모델 파라미터를 훈련하는 것을 모델 기반 학습 이라고 하고, KNN과 같이 모델 파라미터가 없이 훈련 데이터를 저장하는 훈련 방법을 사례 기반 학습 이라고 함

 

50 * lr.coef_[0] + lr.intercept_
1180.939546737759

 

 

# 훈련 데이터와 회귀선 시각화
plt.figure()

plt.scatter(x_train, y_train)
plt.plot([0, 50], [lr.intercept_, 50 * lr.coef_[0] + lr.intercept_])
plt.scatter(50, 1180, marker = "^")
plt.plot([0, 50], [0, 0], "k--")

plt.xlabel("length")
plt.ylabel("weight")
plt.show()

 

 

02. 모델 평가
lr.score(x_test, y_test)
0.962238206088814

 

pred = lr.predict(x_test)
mae = mean_absolute_error(y_test, pred)

 

mae
59.39567412291391

 

 

03. 다항 회귀
  • 실제 농어의 무게는 일직선 이라기 보다는 왼쪽 위로 구부러진 곡선에 가깝기 때문에 직선보다는 곡선으로 예측하는 것이 더 적합
  • 길이를 제곱한 항을 추가하여 2차 방정식의 그래프 형태로 학습
df["squared"] = df["Length2"] ** 2

 

df.head()

 

x_train, x_test, y_train, y_test = train_test_split(df[["Length2", "squared"]], df["Weight"],
                                                    test_size = 0.25, random_state =23)
lr = LinearRegression()

 

lr.fit(x_train, y_train)

 

lr.score(x_test, y_test)
0.9828804135599647

 

pred = lr.predict(x_test)
mae = mean_absolute_error(y_test, pred)

 

# 평균오차가 30.57으로 줆(독립변수가 늘어나면 종속변수에 대해 판단할 기준이 많아진다는 것이므로)
mae
30.56851982713119

 

 

# 50cm 농어에 대한 예측
lr.predict([[50, 2500]])
array([1597.75345786])

 

print(lr.coef_, lr.intercept_)
[-25.67925716   1.08528192] 168.5115152392617

 

  • 회귀식: -25.68 * Length2 + 1.09 * squared + 168.51
# 다항회귀 시각화
points = np.arange(51)

plt.scatter(x_train["Length2"], y_train)
plt.plot(points, lr.coef_[0] * points + lr.coef_[1] * (points ** 2) + lr.intercept_)
plt.scatter(50, 1597)

plt.xlabel("length")
plt.ylabel("weight")
plt.show()

728x90

'08_ML(Machine_Learning)' 카테고리의 다른 글

10_다중 선형 회귀 규제  (0) 2025.04.04
09_선형 회귀 실습  (0) 2025.04.04
07_KNN구현(Numpy(넘파이))  (0) 2025.04.04
06_KNN 심화  (0) 2025.04.04
05_KNN회귀  (0) 2025.04.04