선형 결합이란? 선형 결합은 선의 관계, 다시 말해 직선 관계이다. y=x, y=2x, y=3x와 같은 꼴로 그래프를 그려보면 직선 관계이다.
선형 회귀 모델과 정규화 회귀 모델
- 모델 구조

->각 특징에 대해서 가중치가 붙은 형태로 되어있고 각각들이 선형 형태로 결합되어 있다.(각각, 특징 벡터와 가중치 벡터의 선형 결합(선의 형태)으로 표현)
- 비용 함수:오차제곱합

->선형 회귀 모델의 경우 비용 함수로 오차제곱합을 사용하고 정규화 회귀 모델의 경우 오차제곱합에 계수들의 패널티를 추가시킨다.
->오차제곱합을 쓰는 이유는 양의 오차와 음의 오차가 손실되는 것을 방지하기 위해서 쓴다.
->정규화 회귀 모델에서 패널티를 추가시킨 이유는 모델이 너무 복잡해지는 것을 방지하기 위해서이다. 즉, 계수들의 절대값이 너무 커지는 것을 방지하기 위해서이다. 람다의 경우 사용자가 설정하는 하이퍼 파라미터이고 람다가 크면 클수록 계수들의 패널티에 집중하고 단순한 모델이 만들어지고, 람다가 작으면 작을수록 오차제곱합에 집중하고 복잡한 모델이 만들어 진다.
- 특징과 라벨 간 비선형 관계가 무시될 수 있으므로, 특징 변환이 필요
->특징벡터와 가중치 벡터의 선형 결합으로 표현이 되어있는데 만약, 가중치 벡터와 특징벡터의 관계가 선형이 아니라 비선형 관계가 있으면 그 관계가 완벽하게 무시될수 있으므로 특징 변환이 필요하다.

데이터(파란색 선)의 분포를 보면, x와 y는 2차식 관계라는 것을 대략적으로 추정할 수 있다. x를 x^2으로 변환한다면 과소적합된 주황색 모델이 아닌 적절하게 적합된 초록색 모델을 학습할 수 있다.
이 과정을 코드를 통해서 확인해볼 것이다.
import numpy as np
from sklearn.linear_model import LinearRegression as LR
from matplotlib import pyplot as plt
## 가상 데이터 생성
X = np.linspace(-5,10,500) # -5부터 10까지 등간격으로 500개의 요소를 갖는 벡터
X_2 = X**2 # X의 모든 요소에 제곱이 된 형태
Y = 3*X**2 + np.random.normal(0,4,size=len(X)) # X와 Y는 2차식 관계
# np.random.normal:정규분포로부터 무작위 표본 추출
# 평균 0, 표준편차 4인 정규분포로 부터 난수 len(X)개를 생성
plt.scatter(X,Y)
# X는 1차원으로 sklearn의 인풋 구조와 맞지 않음->reshape 사용
# .fit(X,Y) => X = [[record1], [record2], ..., [record n]]
# 1차원: X = [record1, record2, ..., record n]
# reshape() 메소드는 차원을 변경할 때 사용
# reshape(-1,1)에서 -1은 원래 배열의 길이와 남은 차원으로부터 추정해서 알아서 지정하라는 의미
## 모델 학습
model_1 = LR().fit(X.reshape(-1,1), Y) # 인자가 2개이므로 2차원 변경
model_2 = LR().fit(X_2.reshape(-1,1), Y)
## 모델 적용
model_1_predict = model_1.predict(X.reshape(-1,1))
model_2_predict = model_2.predict(X_2.reshape(-1,1))
## 결과 시각화
%matplotlib inline
plt.xlabel("X")
plt.ylabel("Y")
plt.plot(X,Y,label="data", color='y')
plt.plot(X, model_1_predict, label="Y=f(x)")
plt.plot(X, model_2_predict, label="Y=f(x**2)", color='g')
plt.legend(loc='upper left')
데이터랑 초록색 모델은 거의 일치하는 것을 볼수있으나 파란색 모델은 실제 데이터의 분포를 거의 반영하지 못한다.
모델1은 X를 그대로 사용하고 모델2는 X^2을 사용한 것 밖에 차이가 없지만 단순한 변환임에도 불구하고 데이터의 X와 Y간 비선형 관계가 있는 경우에는 특징 변환을 해줬을 때 엄청난 퍼포먼스를 얻을 수 있다.
->MAE나 RMSE는 구하지 않아도 당연히 초록색 모델의 성능이 훨씬 우수할 것으로 예상한다.
- (선형 결합이기 때문에)특징 간 스케일 차이에 크게 영향을 받아, 예측 모델링을 할 때 스케일링이 필요함
- λ와 max_iter에 따라 과적합 정도가 직접 결정됨
로지스틱 회귀 모델
- 모델 구조

로지스틱 회귀 모델은 분류에 쓰는 회귀 모델로 라벨이 1일 확률을 출력해주는 모델이다.
라벨이 1일 확률이 cut-off-value 이상이면 1, 아니면 0으로 본다.
- 비용 함수:크로스 엔트로피

라벨이 실제로 1인 샘플에 대해서는 1일 확률을 높게 잡아야 비용이 작아지고 실제로 0인 샘플에 대해서는 0일 확률을 높게 잡아야(1일 확률을 적게잡아야) 비용이 적게 받도록 설계된 함수이다.
- 특징의 구간 별로 라벨의 분포가 달라지는 경우, 적절한 구간을 나타낼 수 있도록 특징 변환이 필요함

이 과정을 코드를 통해서 확인해볼 것이다.
import numpy as np
from sklearn.linear_model import LogisticRegression as LR
from matplotlib import pyplot as plt
# np.random.random(size=10):개수가 10개인 0~1 사이의 난수 생성
# tolist():ndarray를 리스트로 변환
## 가상 데이터 생성
X = np.random.random(size=10).tolist() + (np.random.random(size=10)+1).tolist() + (np.random.random(size=10)+2).tolist()
Y = [0]*9 + [1]*1 + [0]*2 + [1]*8 + [0]*9 + [1]*1
plt.scatter(X,Y) # 명확하지는 않지만 2이상, 1이하에서는 0이 많고, 1~2 중간에서는 1이 많은 것을 확인
X = np.array(X) # array로 변환
Y = np.array(Y)
#조건 생성
cond = np.logical_and(X>1, X<=2) # np.logical_and(bool1, bool2):모든 조건을 충족할 경우 True, 아닐 경우 False
# 부울리스트가 둘 다 True이면 True 반환, 하나라도 False이면 False 반환
X_tilda = X.copy()
X_tilda[cond]=1 # X_tilda에 cond 조건을 만족시키면 1을 가지게 함
X_tilda[~cond]=0 # 아니면 0
## 모델 학습
model_1 = LR().fit(X.reshape(-1,1), Y) # X를 특징으로 그대로 사용한 모델
model_2 = LR().fit(X_tilda.reshape(-1,1), Y) # 변환한 특징을 사용한 모델(0과 1사이의 실수를 0과 1의 정수로 변환한 ndarray)
# decision boundary 유도
# Pr(y = 1 | x) >= 0.5
# <=> 1 / (1 + exp(-coef * x - intercept)) >= 0.5
# <=> (1 + exp(-coef * x - intercept)) <= 2
# <=> exp(-coef * x - intercept) <= 1
# <=> -coef * x - intercept <= 0
# <=> x >= - intercept(bias) / coef(계수)
# 위 식을 통해 decision boundary는 "- intercept / coef" 정의됨(참고)
## 결과 시각화(X를 특징으로 그대로 사용한 모델 시각화)
decision_boundary = -(model_1.intercept_[0] / model_1.coef_[0])
plt.plot([decision_boundary, decision_boundary], [-0.1, 1.1], color='r')
plt.scatter(X[Y==0], Y[Y==0]) # 실제로 Y가 0인 부분 시각화
plt.scatter(X[Y==1], Y[Y==1]) # 실제로 Y가 1인 부분 시각화
# 모든 샘플들이 decision_boundary를 기준으로 같은 공간에 있음->구분이 어려움
## 결과 시각화(변환한 특징을 사용한 모델 시각화)
decision_boundary = -(model_2.intercept_[0] / model_2.coef_[0])
plt.plot([decision_boundary, decision_boundary], [-0.1, 1.1], color='r')
plt.scatter(X[Y==0], Y[Y==0])
plt.scatter(X[Y==1], Y[Y==1])
# 오른쪽에는 주황색, 왼쪽에는 파란색으로 잘 분리된걸 확인
# 오차가 존재하긴 하지만 변환한 특징이 X를 특징으로 그대로 사용한 것 보다 확연히 좋아진 것을 확인
오늘은 예측 모델인 선형회귀모델, 정규화 회귀모델 / 분류 모델인 로지스틱 회귀모델을 알아보았다. 이 모델들은 선형성을 기반으로 한 모델이다. 학교를 다닐 때 회귀분석을 배운적이 있지만 지금 다시 복습을 해보니 그때보다는 조금 더 알 것 같다. 아직까지는 이 지식이 어렵게 와닿지만 후에 다시 머신러닝을 공부할 때 이 자료와 교재를 기반으로 한 번 더 리마인드를 할 것이다.
'데이터 전처리 > 지도학습 주요 모델 및 개념' 카테고리의 다른 글
| 지도학습 모델 및 파라미터 선택(데이터 크기)(맹신하면 안되고 참고만 하기) (0) | 2022.12.09 |
|---|---|
| 지도학습 모델 및 파라미터 선택(그리드 서치) (0) | 2022.12.08 |
| 주요 모델의 구조 및 특성(2) (0) | 2022.12.08 |
| 모델 개발 프로세스 (0) | 2022.12.05 |
| 지도학습 개요 (0) | 2022.12.05 |