머신러닝 - 선형 회귀분석 모델(Linear Regression) 2

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


실습해보기

문제1(단순 선형회귀): GrLivArea 를 사용해서 SalePrice 예측하기

  1. 테스트 데이터와 훈련 데이터를 각각 위치에 넣고
  2. 학습시키고 & 성능지표 확인하기
# 라이브러리 불러오기 
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 훈련 데이터 
df = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/house-prices/house_prices_train.csv')
# 테스트 데이터
df_t = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/house-prices/house_prices_test.csv')

# 데이터 불러오기 
X = df[['GrLivArea']]
y = df['SalePrice']

# 모델 정의
model = LinearRegression()
# 모델 훈련
model.fit(X,y)

# 모델 예측
X_t = df_t[['GrLivArea']]
y_pred = model.predict(X_t)

# 훈련 결과 확인 
print(f"단순 회귀 - 기울기(GrLivArea): {model3.coef_[0]:.2f}")
print(f"단순 회귀 - 절편: {model3.intercept_:.2f}")

plt.scatter(X, y, color="blue", label="실제 값")
plt.plot(X_t, y_pred, color="red", label="예측 값 (회귀선)")
plt.xlabel("GrLivArea")
plt.ylabel("SalePrice")
plt.legend()
plt.title("Simple_model: GrLivArea와 SalePrice")
plt.show()

문제2(다중 선형회귀): GrLivArea와 LotArea를 사용해 SalePrice를 예측

# 데이터 불러오기
X = df[['GrLivArea', 'LotArea']]
y = df['SalePrice']

# 모델 정의
model4 = LinearRegression()
# 모델 훈련
model4.fit(X, y)

# 모델 예측
y_pred = model4.predict(X)
X_t = df_t[['GrLivArea','LotArea']]
y_pred_t = model4.predict(X_t)  # 실제데이터가 아닌 테스트 데이터로 예측

MSE = mean_squared_error(y, y_pred)
MSE

# 3099258070.4722357

좋은 모델이란?

  1. Good Explanatory Model (좋은 설명 모델)
    • 현재 데이터(트레이닝 데이터)를 잘 설명
    • 트레이닝 에러가 작아야 함
    • 최소제곱법(Least Squares)을 통해 MSE 최소화
  2. Good Predictive Model (좋은 예측 모델)
    • 미래 데이터에 대한 예측 성능이 우수
    • 테스트 에러가 작아야 함
    • 일반화 성능이 중요
  • 1차 모델: 단순한 직선 (Underfitting)
    • High Bias, Low Variance
    • 트레이닝 에러와 테스트 에러 모두 높음
  • 2차 모델: 적절한 복잡도
    • Balanced Bias-Variance
    • 최적의 예측 성능
  • 4차 모델: 과도하게 복잡 (Overfitting)
    • Low Bias, High Variance
    • 트레이닝 에러는 낮지만 테스트 에러는 높음

Expected MSE의 분해

Expected MSE = Irreducible Error + Bias² + Variance

  • Irreducible Error: 모델로 제어할 수 없는 오차
  • Bias: 예측값과 실제값 사이의 체계적 차이
  • Variance: 예측값의 변동성

  1. 단순 선형회귀: y = β₀ + β₁x + ε
  2. 다중 선형회귀: y = β₀ + β₁x₁ + β₂x₂ + … + βₚxₚ + ε

단순에서 다중으로 갈수록 모델의 복잡도는 증가함.

  • 모델의 복잡도가 올라갈수록 성능은 초반엔 좋을 수 있지만 점점 성능이 떨어지는 경향이 보임
  • 이때 모델의 복잡도가 올라가는 것은 다항식의 항이 많아지는 것을 의미함!
  • 그래서 이에 대한 최적점을 찾는 것이 중요함!

그렇다면 이때 최적점을 찾는 방법은 무엇인가?

가장 관련없는 변수부터 제거해본다!

(β₁, β₂) β₁² + β₂² MSE 제약 만족 여부  
(4, 5) 41 20 ❌ 위반 (> 30)  
(3, 5) 34 23 ❌ 위반 (> 30)  
(4, 4) 32 25 ❌ 위반 (> 30)  
━━━━━━ ━━━━━━ ━━━ 제약: β₁² + β₂² ≤ 30  
(2, 5) 27 27 ✅ 만족  
(2, 4) 18 25 ✅ 만족 ⭐  
(2, 3) 13 29 ✅ 만족  

MSE 가 작은게 좋은것! 잊지말기 & 제약조건을 잘 보기

머신러닝 - 선형 회귀분석 모델(Linear Regression)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


머신러닝 모델의 훈련단계

0. 라이브러리 불러오기(import)
1. 데이터 불러오기
2. 전처리(데이터 클렌징, 정규화, 범주화 데이터 처리)
3. 데이터 스플릿/분리(train, test)
4. 모델 정의(내가 어떤 모델을 사용할지, 하이퍼파라미터 설정)
5. 모델 훈련(`.fit()` > 파라미터를 훈련시켜서 함수통을 만든다) 
6. 훈련 결과 확인(정확도, 시각적 방법을 통해 결과 확인)

선형 회귀분석(Linear Regression)

  • 선형 회귀: 독립변수와 종속변수 간 선형관계를 모델링하는 통계학적 기법
  • 머신러닝의 가장 기본적이면서도 중요한 알고리즘 중 하나
  • 독립변수의 갯수에 따라 단순/다중 선형회귀로 나뉨

단순 선형회귀(Simple Linear Regression)

독립변수가 하나인 경우

y = β₀ + β₁x + ε
  • y: 종속변수 (예측하려는 값)
  • x: 독립변수 (설명변수)
  • β₀: 절편 (intercept)
  • β₁: 기울기 (slope)
  • ε: 오차항 (error term)

라이브러리 불러오기

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

데이터 불러오기

# 독립변수 > 공부시간 
X = np.array([1,2,3,4,5]).reshape((-1,1))
# 종속변수 > 시험점수
y = np.array([5,20,14,32,22])  

모델 정의 > LinearRegression()

# 모델이라는 변수에다가 정의 
model = LinearRegression()  

모델 훈련 > fit()

# 그래프에서 선을 긋는 것 
# y와 y^의 잔차를 줄이는 것이 목표 
# y^ (와이 헷)은 머신러닝 결과로 나오는 예상치를 말함
model.fit(X,y)

훈련 결과 확인

w = model.coef_[0]
b = model.intercept_

print(w,b)
# 4.6000000000000005 4.800000000000001
print(f'회귀식: y={w:.2f}x + {b:.2f}')
# 회귀식: y=4.60x + 4.80

모델 예측 > predict()

X1 = np.array([2,2,4,4,5]).reshape((-1,1))

# 만들어진 통계모델로 예측 
y_pred = model.predict(X1)  
y_pred

다중 선형회귀(Multiple Linear Regression)

독립변수가 여러개인 경우

y = β₀ + β₁x₁ + β₂x₂ + ... + βₚxₚ + ε
  • y: 종속변수 (예측하려는 값)
  • x: 독립변수 (설명변수)
  • β₀: 절편 (intercept)
  • β₁: 기울기 (slope)
  • ε: 오차항 (error term)

라이브러리 불러오기

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

데이터 불러오기 & train/test 분리

f(x)가 y가 되기 위해 학습해야하는 정보가 train이고 잘배웠는지 결과를 보는 것이 test

  • x1: 시험 공부시간
  • x2: 조명
  • x3: 수면시간
  • x4: 과제 참여도
X = np.array([[5,2,3],[10,3,5],[15,5,8],[7,2,4]])
y = np.array([10,20,30,40])

# test_size: 몇대몇으로 분리할 것이냐 > 0.2 : test에 20%, train에 80%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

모델 정의

model = LinearRegression()

모델 훈련

# 어떤 데이터가 들어가는 지 체크! 
model.fit(X_train, y_train)

모델 결과 확인

w = model.coef_
b = model.intercept_

print(w,b)
# [ 12.         -43.33333333   6.        ] 18.666666666666718

모델 예측

model_pred = model2.predict(X_test)
model_pred

# array([38.66666667])

이때 우리의 목표는 예측할 수 있는 함수통을 만드는 것이다!

MSE

MSE = mean_squared_error(y_test, model2_pred)
MSE

# 348.4444444444457

MSE, MAE, RMSE란?

모델의 평가 지표

  • MSE:잔차 제곱의 합
  • MAE: 잔차 평균의 합
  • RMSE: 평균 제곱근 오차 > MSE에 루트씌운 값

MSE, MAE 모두 작을수록 좋음!

[M A E=\frac{1}{n} \sum_{i=1}^n\left y_i-\hat{y}_i\right ]

[M S E=\frac{1}{n} \sum_{i=1}^n\left(y_i-\hat{y}_i\right)^2]

[R M S E=\sqrt{M S E}]

[R^2=1-\frac{\sum\left(y_i-\hat{y}_i\right)^2}{\sum\left(y_i-\bar{y}\right)^2}]

머신러닝 - 지도 & 비지도 학습 의미와 종류

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


참고한 블로그

지도학습(Supervised Learning)

지도학습 알고리즘은 정답이 있는 데이터(label)들을 학습한다. 그리고 이런 정답들은 사람들이 직접 데이터 하나하나에 표기(annotate)한다. 대표적인 기술로 분류(classification), 회귀(regression)이 있다.

예를 들어, 사진 분류의 문제 중 하나인 ‘개, 고양이 사진분류’를 지도학습을 통해 해결하고자 한다고 상상해보자.

  1. 지도학습 속 train을 위해 굉장히 많은 개, 고양이 사진들이 필요함
  2. 각 사진들이 개인지 고양인지 라벨(label)을 해줘야 함
  3. 이렇게 label 된 데이터 묶음을 training set, test set으로 나눔
  4. 기계는 training set을 통해 사진을 통과시켜 개인지 고양이인지를 예측
  5. 지도학습 훈련을 통해 예측값(predict)와 만들어둔 정답(label)이 같아지도록 함

즉, 기계의 예측(prediction)이 우리가 의도하는 정답(label)과 같아지도록 지도(supervised) 하는 것!

위 지도학습은 분류모델을 사용한 것이었다면 또다른 지도학습으로는 회귀모델이 있다. 이 회귀 알고리즘은 주어진 데이터(X)를 기반으로 정답(Y)를 잘 맞추는 fit함수를 찾는 문제이다. 회귀 알고리즘은 예측값과 정답(Y)사이의 차이(거리)를 작게해 알고리즘을 학습하도록 한다.

  • 분류 종류: 선형분류기(linear classifier), 의사결정트리(decision tree), 랜덤포레스트(random forest), svm(suppor vector machine), KNN(k-nearest neighbor), 나이브베이즈(Naive Bayes)
  • 회귀 종류: 선형회귀(linear regression), 로지스틱회귀(logistic regression), 다항식회귀(polynomial regression)

비지도학습(Unsupervised Learning)

비지도학습 알고리즘은 정답(label) 없이 데이터를 학습한다. 목적은 인간의 개입이 없는 데이터를 스스로 학습하여 그 속의 패턴(pattern) 또는 각 데이터 간 유사도(similarity)를 학습하는 것이다.

대표적인 기술로 군집화(clustering), 연관(association), 차원축소(dimensionality reduction)이 있다.

  • clustering: 정해진 분류 없이 기계가 스스로 데이터들을 보고 학습하여 비슷한 특징의 데이터를 군집화시키는 기술
    • K-means..
  • association: 데이터 간 관계 혹은 패턴을 학습
    • 장바구니분석 및 추천 엔진
  • dimensionality reduction: 차원이 높은 데이터의 학습을 조금 더 효율적으로 하기 위해 사용되는 기술로 고차원의 데이터를 저차원의 데이터로 만드는 것이 목적임
    • 시각적 데이터에서 노이즈를 제거해 화질을 개선하는 경우와 같이 전처리 단계에서 사용

지도학습과 비지도 학습의 가장 큰 차이점

데이터 셋에 label이 지정되어 있는지 아닌지이다. 즉, 지도학습은 label이 있고 비지도 학습은 label이 없다.

  • 지도학습 > 목표: 새로운 데이터의 결과를 예측하는 것
    • label된 데이터 셋을 이용해 반복적으로 데이터를 예측하고 정답(label)과의 오차를 줄여나가며 학습함
    • 비지도 학습모델보다 더 정확한 경향이 있지만 데이터에 적절하게 레이블을 지정하려면 사람의 개입이 필요함
    • 활용 목표: 스팸탐지, 감정분석, 일기예보 및 가격 예측에 이상적
    • 단점: 훈련하는 데 시간이 많이 걸릴 수 있으며, 입력 및 출력 변수에 대한 label에는 전문지식이 필요함
  • 비지도학습 > 목표: 많은 양의 새로운 데이터에 대한 통찰력을 얻는 것
    • label이 지정되지 않은 데이터의 고유한 구조를 발견하기 위해 자체적으로 작동
    • 출력변수의 유효성을 검사하려면 여전히 사람의 개입은 필요함
    • 활용 목표: 이상감지, 추천엔진, 의료영상에 적합
    • 단점: 출력변수를 검증하기 위해 사람이 개입하지 않았을 경우, 부정확한 결과를 가질 수 있음

지도학습은 일반적으로 R or Python같은 프로그램을 사용해 계산되는 간단한 머신러닝 방법이다. 그러나 비지도학습에서는 대량의 분류되지 않은 데이터로 작업하기 위한 강력한 도구가 필요하다. 비지도 학습 모델은 의도한 결과를 생성하기 위해 대규모 훈련 셋이 필요하기 때문에 계산적으로 복잡하다.

지도학습, 비지도학습 중 뭐가 더 좋다고는 할 수 없고, 데이터 구조나 사용 분야에 맞게 적합한 방식을 선택하는 것이 중요하다!

머신러닝 - sklearn 알아보기

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


scikit-learn 특징

  • 다양한 머신러닝 알고리즘을 구현한 파이썬 라이브러리
  • 심플하고 일관성 있는 API, 유용한 온라인 문서, 풍부한 예제
  • 머신러닝을 위한 쉽고 효율적인 개발 라이브러리 제공
  • 다양한 머신러닝 관련 알고리즘과 개발을 위한 프레임워크와 API 제공
  • 많은 사람들이 사용하며 다양한 환경에서 검증된 라이브러리

Scikit-learn의 입력규칙

  • X : 2차원 배열 형태 (지금 처럼 데이터프레임으로 입력)
    • X값은 2개 이상의 컬럼을 설정할 수 있기 때문!
  • y : 1차원 배열 형태
    • 정답에 해당하는 y값은, 샘플마다 1개의 컬럼이기 때문!

250814 프로젝트(데이터 분석 및 문제 정의)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.