import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression, LogisticRegression, Ridge, RidgeCV
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.model_selection import train_test_split
# X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
from sklearn.metrics import r2_score, mean_squared_error
* Train data / Test data
- 우리가 정말 관심있는것은 모델 학습에 사용한 훈련(train) 데이터를 잘 맞추는 모델이 아니라,
- 학습에 사용하지 않은 테스트(test) 데이터를 얼마나 잘 맞추는지 입니다.
- 데이터를 훈련/테스트 데이터로 나누어야 우리가 만든 모델의 예측 성능을 제대로 평가할 수 있습니다.
- =학습에 사용하는 데이터와 모델을 평가하는데 사용하는 데이터가 달라야 한다
**시계열 데이터를 가지고 과거에서 미래를 예측하려고 하는 경우는 train data보다 test data가 미래의 것이어야함
# df.sample(frac=0.75,random_state=1)
시계열 데이터란, 시간을 통해 순차적으로 발생한 관측치의 집합이라고 할 수 있다. 이렇게 순차적으로 발생한 연속적인 관측치는 서로 관련이 있다. 하지만 하나 알아두어야 할 점이 있다. 바로,
"이 때 시계열은 반드시 고정된(fixed) 시간 구간의 관측치어야 한다."
즉, 시계열이 불규칙적인 시간 구간이여서는 안된다는 것이다. 어떤 구간은 Daily 구간이였다가, 어떤 구간은 Monthly, 또 어떤 구간은 Yearly... 이렇게 다양한 구간이 동시에 존재해서는 안된다는 것이다.
#### process####
X데이터를 각각 X_train, X_test로 나누고
y데이터를 각각 y_train, y_test로 나눈다.
다음 X_train과 y_train으로 ML 모델을 만들고(= fit)
X_test를 모델에 넣으면 어떠한 y값이 나온다.(= predict)
이제 궁금한 건 모델을 통해 나온 y값이 우리가 가지고 있는 y_test와 같은지. (= y_test, y_pred)
*기준모델 ( Target )
- 먼저 해당 target 기준모델로 사용
- train= df.sample(frac=0.75,random_state=1) 75% train
- test= df.drop(train.index) 25% test
- y_train= train['target'] / predict= y_train.mean() # 평균값의로 예측(기준모델)
- y_test= test['target']
- 기준모델로 훈련 에러/ 테스트 에러 확인
- train mae = [predict] * len(y_train) // mean_absolute_error(y_train, [predict] * len(y_train))
- test mae = [predict] * len(y_test) // mean_absolute_error(y_test, [predict] * len(y_test))
* sklearn 단순선형
- 모델 설정 model= LinearReg
- feature 설정
- y_train= train['target'] // y_test= test['target']
- X_train= train['feature'] // X_test= test['feature']
- model.fit( train data )
- train error, test error ==> y_pred= model.predict(X_train) // model.predict(X_test)
- train, test mae 확인
해결하고자 하는 문제가 무엇인가? 특정 수치를 예측 -> 회귀
주어진 데이터를 분류 및 분류 기준을 파악 -> 분류
* sklearn 다중선형
- feature 설정시 ['ㅁㄴㅇㅁㄴㅇ', 'ㅁㄴㅇㅁㄴㅇ'] 설정해주고 이하는 같다
- 단순선형회귀식
- 2특성의 다중선형회귀 식:
## 절편(intercept)과 계수들(coefficients)
model.intercept_, model.coef_ ==> feature 순서대로 나옴
*평가지표(evaluation metrics)
==> 회귀직선의 방정식이 얼마나 원래자료를 잘 설명하는지 나타내는 수치
- MSE (Mean Squared Error) =
- MAE (Mean absolute error)
- RMSE (Root Mean Squared Error)
- ==> MSE를 실제값과 유사한 단위로 변화시켜주는 장점
- R-squared (Coefficient of determination) = 분포되있는 관측값과 추정값(회귀점들)을 비교
- ==> 1에 가깝다 = 회귀선이 데이터를 잘 설명해주고 있다.
- ==> (= 관측값과 예측값이 같다면 오차는 없으므로 SSR과 SST가 같음 / SSE가 0)
- 참고
- SSE(Sum of Squares Error, 관측치와 예측치 차이): 잔차
- SSR(Sum of Squares due to Regression, 예측치와 평균 차이): y의 평균
- SST(Sum of Squares Total, 관측치와 평균 차이):
, SSE + SSR
- SSE(Sum of Squares Error, 관측치와 예측치 차이): 잔차
mse = mean_squared_error(y, y_pred)
mae = mean_absolute_error(y, y_pred)
rmse = mse ** 0.5
r2 = r2_score(y, y_pred)
*결정 계수

상관계수 = -1, 0, +1 인 것
상관계수는 공분산에선 대략적으로도 알 수 없던 선형관계를 대략적으로 알려주는 역할(= 방향)
독립변수(X)에 주택의 크기, 종속변수(Y)에 주택 가격으로 설정하여 그 데이터를 추출해 결정계수를 구하였는데 0.7788이 나왔다고 하자. 이때 결정계수의 의미는 "주택 가격이 변동하는 것의 77.88%는 주택의 크기가 변동에 의해 설명될 수 있다."
결정계수= 독립변수(X)의 변동에 의해 설명되는 종속변수(Y)의 변동 정도를 측정한다.
"독립변수(X)가 원인이기 종속변수(Y)가 결과이다."라고 해석할 수 있는데 이는 맞지 않다.
만일 독립변수(X)가 원인이라면 관측되지 않은 종속변수(Y)의 값에 대해서도 독립변수(X)만으로
설명할 수 있어야 하기 때문이다.
하지만 관측되지 않은 종속변수(Y)는 단순히 상관관계 분석만으로 예측할 수 없다.
그렇기 때문에 선형관계의 척도로는 독립변수와 종속변수에는 인과관계를 설명할 수 없고
단지 독립변수의 변동이 종속변수의 변동을 어느정도를 설명하는지 나타낸다는 것을 반드시 기억해야한다.
-켈러의 경영경제통계학 제 9판-
*과적합(Overfitting)과 과소적합(Underfitting) 트레이드 오프 == 면접질문 단골
* 일반화 = 모든 입수할 증거에 입각하여 문제에 대한 가장 논리적이고 조리있는 해결을 말하는 것이다.
- 테스트데이터에서 만들어내는 오차를 일반화 오차라고 부릅니다.
- 훈련데이터에서와같이 테스트데이터에서도 좋은 성능을 내는 모델은 일반화가 잘 된 모델이라고 부릅니다.
- 모델이 너무 훈련데이터에 과하게 학습(과적합)을 하지 않도록 하는 많은 일반화 방법들이 있습니다.
- train / test 의 오차가 비슷하다 = var 이 낮다 , bias 높다 (오차는 여전히 많지만)
과적합 overfitting = 복잡한 모델 | 과소적합 underfitting = 간단한 모델 |
variance error 크고 bias error 작을때 | variance error 작고 bias error 클때 |
train data에서는 오차가 작고 test data에서는 큼 | train data, test data 둘다 못함 = 오차가 크게나옴 |
비모수 or 비선형 (의사결정트리 , k 최근접 ) | 모수 선형모델 ( 선형회귀, 로지스틱 ) |
## train
* 좌측 편향이 큼(= 관찰값과 예측값의 오차가 큼 )
* 우측 train에선 오차가 없다.

## test
* 좌측 train 과 test의 분산이 낮다(= 오차가 다른 데이터 셋에서 비슷한 경향을 보이는 것)
* 우측 train에선 오차가 없었는데 test 데이터 셋에선 오차가 크다(= 과적합)

* bias // variance( 목표= bias도 낮고 var도 낮은 것을 찾는 것 )

bias 편향 | variance 분산 |
알고리즘에서 잘못된 가정을 했을때 발생하는 오차 | train data 내에 작은 변동 때문에 발생하는 오차 |
실제값과 얼마나 멀어져 있는가에 대한 척도 | 예측된 값들이 얼마나 멀어져 있는가에 대한 척도 |
*overfitting 일 경우
- 모델의 기능 또는 조정 가능한 매개 변수 수를 제한합니다. 피쳐 수가 증가하면 모델의 복잡성도 증가하여 과적 합 가능성이 높아집니다.
- 모델이 훈련 데이터를 "과도하게 학습"하지 않도록 훈련을 줄입니다.
- 보다 원활한 네트워크 매핑을 장려하기 위해 오류 / 비용 함수에 정규화 용어를 추가합니다 (Ridge 또는 Lasso 회귀는 일반적으로 사용되는 기술).
- 평균 제곱 오차를 최소화하기위한 교차 검증
*underfitting일 경우
- 오류 / 비용 함수 (예 : MSE 또는 SSE)가 충분히 최소화되도록 훈련 데이터가 충분한 지 확인합니다.
* 다항회귀모델(polynomial regression =선형관계가 아닌 비선형관계일때 )
과소적합 == > 과적합
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
==> 비선형관계에서 상관계수는 낮게 나올 수 있지만 변수간 관계가 존재하지 않는 것은 아님
==> 비선형으로 회귀식을 잡으면 충분히 관계를 설명할 수 있음
회귀모델의 목적이 해석이 아니라 예측이라면 비선형모델은 굉장히 유연하기때문에
복잡한 패턴을 가진 데이터 모델링 가능
def PolynomialRegression(degree=2, **kwargs):
return make_pipeline(PolynomialFeatures(degree),
LinearRegression(**kwargs))
poly_features = PolynomialFeatures(degree=2, include_bias=False)
파라미터 degree=2는 2차다항을 생성한다는 것이고, (x1, x2) -> (1, x1, x2, x1**2, x1x2, x2**2)
(새로운 특성을 생성)
include_bias=False는 default가 True인데 True이면 편향을 위한 변수(X0)인 1이 추가된다.
이와 같이 각 변수(X)값들을 제곱하여(degree=2), 새로운 변수를 만들어 주는 역할을 한다.
'기계학습(ML) > Linear Models' 카테고리의 다른 글
n214 Logistic Regression / validation (0) | 2021.06.14 |
---|---|
n213 Ridge Regression, onehotencoding (0) | 2021.06.12 |
n211 Simple Regression (0) | 2021.06.12 |
댓글