< 7주차 데이터 분석 과정 학습 및 시각화 실습 (4) >
데이터 모델링이란?
: 주어진 데이터에서 사용하고자 하는 x, 알고싶은 값 y에서
y=f(x)라는 함수로 x와 y 관계를 설명.
- 이때, x를 독립변수(feature), y를 종속변수(label)이라고 부름
-> 이 y와 x의 관계를 효과적으로 설명하는 f(x) 함수를 만드는 일을 모델링이라고 함
- y 값이 존재하는 경우 supervised learning,
-> y 값이 continuous(연속형) 값인 경우 regression task
-> y 값이 categorical 값인 경우 classification task
- y 값이 존재하지 않는 경우 unsupervised learning
Bayes theorem의 관점에서 데이터 모델링
: P(X|⍬)를 최대화하는 ⍬를 찾는 것. (가능도함수를 최대화하는 ⍬를 추정하는 것(MLE))
* P(⍬)는 데이터 관측 이전의 parameter 확률분포
P(X): 데이터 자체의 분포
⍬: 데이터에 대한 가설. 모델의 파라미터.
X: 관측된 데이터
P(X|⍬): 가능도함수, 파라미터가 주어졌을 떄 X데이터가 관측될 확률 분포
데이터 모델링 과정
1. 데이터 전처리 & 분석
2. 데이터를 training / test set으로 나눔
3. training set에 대해서 사용한 모델 학습
4. test set에 대해서 학습된 모델의 예측값을 통해 모델의 성능 평가(실제값과 예측값의 비교를 통해)
5. (모델의 성능이 충분할 때) 새로운 데이터에 대해 학습된 모델을 이용해 y 값을 예측(inference 과정)
선형회귀(Linear Regression)
: x와 y간에 선형의 관계(y=b+wx)가 있을 때 사용
예측값과 실제값이 최대한 가까워지는 편향(Bias), 기울기(Weight)를 찾는 것이 핵심
## baseline 코드
# Linear Regression
from sklearn.linear_model import LinearRegression
lr = LinearRegression(normalize=True)
# training
lr.fit(X_train, y_train)
# LInear regression evaluation
y_pred = lr.predict(X_test)
# Mean Absolute Error
from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(y_test, y_pred))
# Mean Squared Error
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_test, y_pred))
# R2 Score
from sklearn.metrics import r2_score
print(r2_score(y_test, y_pred))
오차항에 대해 가정하는 5가지
- 오차항의 기대치(기댓값)는 0
- 일정한 분산을 가짐
- 서로 다른 값에서 오차는 독립
- 피처와 오차는 독립
- 오차항은 정규분포를 따른다.
오차항을 통해 얻을 수 있는 것
- 회귀모형은 선형성을 가진다.
- 종속변수 Y의 분산은 일정한 값을 가진다.
- 오차항은 서로 독립이다.
- Y는 정규분포를 따른다.
Cost function(비용함수)
: 실제값과 예측값의 오차에 대한 식을 cost function 이라고 함
= loss function = cost function = object function
-> 선형회귀에서는 기본적으로 RSS, MSE를 사용
최소제곱법(OLS)
OLS, Ordinary Least Squares
: 오차를 최소화하는 편향, 기울기를 추정하는 방법
경사하강법(Gradient descent)
: 변수가 많아지거나 cost function이 복잡해지는 경우,
최소 제곱법을 통해 한 번에 loss가 최소인 파라미터를 추정하기 어려움.
-> 각 파라미터에 대해서 cost function을 편미분한 값(gradient, 기울기)을
learning rate 만큼 여러번 update 해주는 것을 gradient descent라고 함
-> 미니배치를 통해 데이터를 샘플링해서 학습하는 mini-batch stochastic gradient descent(SGD) 사용
과적합(Overfitting)
Overfitting(과적합, high variance) : 학습 데이터에 대해 과하게 fitting 되는 경우
-> test set에서 loss가 증가할 수 있음 -> 모델이 일반화되기 어려움
* 오버피팅은 보통 데이터에 내재된 복잡도보다
모델의 복잡도가 더 과한 경우나
데이터셋 사이즈가 작은 경우 발생
고려하는 변수가 많은 경우 발생 가능
* Generalization: 학습할 때와 추론할 때의 성능 차이가 많이 나지 않는 경우
즉, 모델이 여러 inference 상황에서 잘 쓰일 수 있음을 의미함.
오버피팅 방지 방법
- 모델의 복잡도 줄이기
: 모델이 가질 수 있는 파라미터 개수 줄이기(ex. 모델의 사이즈)
: 중요한 피터 선정
- 정규화(Regularization)
: 모델이 가지는 복잡도를 제한하는 방법
-> 모델의 파라미터가 가지는 값의 크기를 cost function에 추가 -> parameter 값의 크기 제한
Ridge Regression
: 선형회귀 모델에 L2 loss를 추가하여 parameter을 정규화해줌
: 패널티항은 모델의 weight parameter들의 제곱합이며, lambda hyper parameter을 이용해 모델에 주어지는 패널티 조정
## baseline code
# Ridge regression
from sklearn.linear_model import Ridge
rlr = Ridge(alpha=1.0)
# training
rlr.fit(X_train, y_train)
# Ridge regression evaluation
y_pred = rlr.predict(X_test)
Lasso Regression
: 선형회귀 모델에 L1 loss를 추가하여 정규화
: 모델의 패널티 항은 weight parameter들의 절대값의 합
## baseline code
# Lasso regression
from sklearn.linear_model import Lasso
llr = Lasso(alpha=1.0)
# training
llr.fit(X_train, y_train)
# Lasso regression evaluation
y_pred = llr.predict(X_test)
Logistic regression
-> 선형회귀의 output y 값에 'sigmoid function'을 적용하여 y 값이 0~1 사이 값이 되도록 만듦
==> 때문에 Classification(분류)에 적합된 Linear regression model이라고 생각하면 됨.
## baseline code
# Logistic Regression
from sklearn.linear_model import LogisticRegression
lgr = LogisticRegression()
# training
lgr.fit(X, y)
# Logistic regression evaluation
y_pred = lgr.predict(X_test)
from sklearn.metrics import accuracy_score
print('accuracy: ', accuracy_score(y_test, y_pred))
from sklearn.metrics import precision_score
print('precision: ', precision_score(y_test, y_pred))
from sklearn.metrics import recall_score
print('recall: ', recall_score(y_test, y_pred))
from sklearn.metrics import f1_score
print('f1: ', f1_score(y_test, y_pred))
SVM(Support Vecter Machine)
: 선형회귀와 비슷하지만 어느 정도의 허용 오차 안에 있는 오차값은 허용해줌.
(허용오차를 잘 설정해야 좋은 성능 가능)
## baseline code
# Support Vector Machines (SVM)
from sklearn.svm import SVR
svr= SVR(kernel='linear', C=10.)
# training
svr.fit(X_train, y_train)
# SVR evaluation
y_pred = svr.predict(X_test)
# Mean Absolute Error
from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(y_test, y_pred))
# Mean Squared Error
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_test, y_pred))
# R2 Score
from sklearn.metrics import r2_score
print(r2_score(y_test, y_pred))
Random Forest
: Decision Tree는 x를 기준삼아 "해당 기준을 만족/불만족 시 y값이 ~ 값일 것이다" 라는
조건(X)-결과(Y)를 나무처럼 발전시킴
: Random Forest는 Decistion Tree를 무작위로 여러 개 만든 후,
각 tree마다 나온 decision을 voting(앙상블)을 통해 최종적인 y 값 예측
: 트리의 개수, 깊이 등을 설정하여 모델 성능 조절
## baseline code
# Random Forest
from sklearn.ensemble import RandomForestRegressor
rfr= RandomForestRegressor(n_estimators=100, max_depth=200)
# training
rfr.fit(X_train, y_train)
# Random forest evaluation
y_pred = rfr.predict(X_test)
# Mean Absolute Error
from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(y_test, y_pred))
# Mean Squared Error
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_test, y_pred))
# R2 Score
from sklearn.metrics import r2_score
print(r2_score(y_test, y_pred))
'STUDY > DevCourse' 카테고리의 다른 글
[데브코스][데이터 분석] 머신러닝 기초와 수학적 배경 (0) | 2024.04.23 |
---|---|
[데브코스][데이터 분석] 회귀분석과 데이터 모델링 (2) (0) | 2024.04.05 |
[데브코스][데이터 분석] 데이터 시각화 (1) | 2024.04.03 |
[데브코스][데이터 분석] 통계적 분석 기초 (2) - 기술통계, 가설검정 (0) | 2024.04.02 |
[데브코스][데이터 분석] 통계적 분석 기초 (1) - 확률, 확률분포 (0) | 2024.04.01 |