두 곡선 사이의 공간이 존재, 훈련 데이터에서의 모델 성능이 검증 데이터에서보다 훨씬 낫다는 뜻 ← 이런 특성은 과대적합 모델의 특징
해결방안은 더 많은 훈련 세트를 사용하는 방법 (데이터 추가)
편향/분산 트레이드오프
모델의 일반화 오차는 세 가지 다른 종류의 오차의 합으로 표현할 수 있다는 사실
편향
일반화 오차중 편향은 잘못된 가정으로 인해 발생
실제는 2차인데 선형으로 가정하는 경우
편향이 큰 모델은 훈련 데이터에 과소적합되기 쉬움
분산
훈련 데이터에 있는 작은 변동에 모델이 과도하게 민감하기 때문에 발생
자유도가 높은 모델(고차원 다항 회귀 모델)이 높은 분산을 가지기 쉬워 훈련데이터에 과대적합하는 경향 발생
줄일 수 없는 오차
데이터 자체에 있는 잡음 때문에 발생
오차를 줄일수 있는 유일한 방법은 데이터에서 잡음을 제거하는 것
모델의 복잡도가 커지면 통상적으로 분산이 늘어나고 편향은 줄어듦, 반대로 모델의 복잡도가 줄어들면 편향이 커지고 분산이 작아짐 (그래서 편향 분산 트레이드 오프)
규제가 있는 선형 모델
과대적합을 감소시키는 좋은 방법은 모델을 규제하는 것
자유도를 줄이면 데이터에 과대적합되기가 더 어려워짐
다항 회귀모델을 규제하는 간단한 방법은 다항식의 차수를 감소시키는 것
선형 화귀 모델에서는 보통 모델의 가중치를 제한, 각기 다른 방법으로 가중치를 제한하는 ‘릿지’, ‘라쏘’, ‘엘라스틱넷’ 이 존재
릿지 회귀
규제가 추가된 선형 회귀
학습 알고리즘을 데이터에 맞추는 것뿐만 아니라 모델의 가중치가 가능한 작게 유지되도록 노력
규제항은 훈련하는 동안에만 비용 함수에 추가, 모델의 훈련이 끝나면 모델의 성능을 규제가 없는 성능지표로 평가
- alpha : 값이 클수록 강력한 정규화(규제) 설정하여 분산을 줄임, 양수로 설정
- fit_intercept : 모형에 상수항 (절편)이 있는가 없는가를 결정하는 인수 (default : True)
- normalize : 매개변수 무시 여부
- copy_X : X의 복사 여부
- max_iter : 계산에 사용할 작업 수
- tol : 정밀도
- solver : 계산에 사용할 알고리즘 (auto, svd, cholesky, lsqr, sparse_cg, sag, saga)
- auto : 데이터 유형에 따른 자동선택
- svd : x의 특이값 분해를 사용해 릿지 계수 계산, 가장 안정적 , cholesky 방식보다 느리지만 안정적
- cholesky : 표준 scipy.linalg.solve 사용한 행렬 분해
- lsqr : scipy.sparse.linalg.lsqr 사용, 가장 빠름, 최소제곱법 방식 사용해 선형 연립방정식 풀어냄
- sag : SGD 사용
- parse_cg : scipy.sparse.linalg.cg 사용, 대규모 데이터에서 cholesky 보다 적합
- lbfgs : scipy.optimize.minimize.positive 가 True 일때 사용가능
>> svd를 제외한 모든 다른 파라미터는 밀집데이터, 희소데이터 지원,
lsqr, sag, sparse_cg, lbfg는 fit_interceot가 True 인 경우만 희소 입력 지원
- random_state : 난수 seed 설정
일반적으로 훈련하는 동안 사용되는 비용 함수와 테스트에서 사용되는 성능 지표는 다름, 규제를 떠나서 이들이 다른 이유는 훈련에 사용되는 비용 함수는 최적화를 위해 미분 가능해야 하기 때문
반면 테스트에 사용되는 성능지표는 최종 목표에 가능한 가까워야 해서 로그 손실같은 비용함수를 사용해 훈련시킨 분류기를 정밀도/재현율을 사용해 평가하는 것이 좋은 예
릿지 비용함수
α는 모델을 얼마나 많이 규제할지 조절, α = 0 이면 선형회귀와 동일
α가 너무 커지면 모든 가중치가 거의 0에 가까워지며 결국 데이터의 평균을 지나는 수평선이 됨
편향(θ) 는 규제되지 않음, w를 특성의 가중치 벡터(θ_1 --> θ_n)이라고 정의 한다면 규제항은 아래와 같음
- 여기서
가 가중치 벡터의
노름
- 경사하강법에 적용하려면 MSE 그레이디언트 벡터에 αw를 더하면 됨
릿지 회귀는 입력 특성의 스케일에 민감하기 때문에 수행하기 전에 데이터 스케일 맞추는 것이 중요, 규제가 있는 모든 모델은 대부분 마찬가지
선형 데이터에 다른 α를 사용해 릿지 모델 훈련 시각화
왼쪽은 평범한 릿지 모델 사용, 오른쪽은 PolynomialFeatures(degree=10) 사용해 먼저 데이터를 확장후 StandardScaler 사용해 스케일을 조정한 뒤 릿지 모델 적용 (릿지 규제를 사용한 다항회귀)
로지스틱 회귀 모델은 여러 개의 이진 분류기를 훈련 시켜 연결하지 않고 직접 다중 클래스 지원하도록 일반화 시킨것이 소프트맥스 회귀
샘플 x가 주어지면 먼저 소프트맥스 회귀 모델이 각 클래스 k에 대한 점수
를 계산하는 식은 선형 회귀 예측을 위한 식과 매우 비슷
각 클래스는 자신만의 파라미터 벡터
가 있음, 이 벡터들은 파라미터 행렬
에 행으로 저장
샘플 x에 대해 각 클래스의 점수가 계산되면 소프트맥스 함수를 통과시켜 클래스k에 속할 확률
을 추정할 수 있음
소프트맥스 함수
K는 클래스 수
s(x)는 샘플 x에 대한 각 클래스의 점수를 담은 벡터
는 샘플 x에 대한 각 클래스의 점수가 주어졌을 때 이 샘플이 클래스 k에 속할 추정 확률
추정 확률이 가장 높은 클래스를 선택
소프트맥스 회귀 분류기는 한 번에 하나의 클래스만 예측, 종류가 다른 붓꽃같이 상호 배타적인 클래스에서만 사용 가능
각 점수에 지수 함수를 적용한 후 정규화, 일반적으로 이 점수를 로짓 또는 로그-오즈라고 함
훈련 방법
모델이 타깃 클래스에 대해서 높은 확률을 추정하도록 만드는 것이 목적
아래 공식의 크로스 엔트로피 비용 함수를 최소화하는 것은 타깃 클래스에 대해 낮은 확률을 예측하는 모델을 억제하므로 이 목적에 부합함
크로스 엔트로피 : 추정된 클래스의 확률이 타깃 클래스에 얼마나 잘 맞는지 측정하는 용도로 사용
크로스 엔트로피 비용 함수
이 식에서는
는 i번째 샘플이 클래스 k에 속할 타깃 확률을 의미, 일반적으로 샘플이 클래스에 속하는지 아닌지에 따라 1, 0 으로 판단
두 개의 클래스만이 존재할때는 비용함수는 로지스틱 회귀의 비용 함수와 같음
클래스 k에 대한 크로스 엔트로피의 그레이디언트 벡터
비용함수
에 대한 그레이디언트 벡터의 공식임
각 클래스에 대한 그레이디언트 벡터를 계산할 수 있으므로 비용 함수를 최소화하기 위한 파라미터 행렬
를 찾기 위해 경사하강법을 사용할 수 있음
소프트맥스 회귀를 통한 3 class 분류
sklearn Logistic Regression은 클래스 둘 이상일때 기본적으로 OvA 전량을 사용
multi_class 매개변수를 "multinomial"로 바꾸면 소프트맥스 회귀를 사용 가능, 소프트 맥스 회귀 사용시 solver 매개변수에 "lbfgs"와 같은 소프트맥스 회귀를 지원하는 알고리즘을 지정
C를 통해 l2 규제 조절
X = iris["data"][:, (2, 3)] # 꽃잎 길이, 꽃잎 너비
y = iris["target"]
softmax_reg = LogisticRegression(multi_class="multinomial",solver="lbfgs", C=10, random_state=42)
softmax_reg.fit(X, y)
결정경계가 맞나는 지점은 모두 33% 추정확률을 가짐
연습문제
1. 수백만 개의 특성을 가진 훈련 세트에서는 어떤 선형 회귀 알고리즘을 사용할 수 있을까요?
보통은 확률적 경사 하강법(SGD), 미니배치 경사 하강법을 사용한다. 훈련 세트의 크기가 메모리에 맞다면 배치 경사 하강법도 가능하다. 하지만 정규방정식은 계산 복잡도가 "특성의 갯수"에 따라 매우 빠르게 증가하기에 사용할 수 없다.
확률적 경사 하강법(SGD) O, 미니배치 경사 하강법 O, 배치 경사 하강법 O ,정규방정식 X
2. 훈련 세트에 있는 특성들이 각기 다른 스케일을 갖고 있다. 이런 데이터에 잘 작동하지 않는 알고리즘은 무엇일까요? 그 이유는 무엇일까요? 이 문제를 어떻게 해결할 수 있을까요?
경사하강법(GD) 는 특성의 스케일이 매우 다르면 수렴하는데 오랜 시간이 소요 <- scale 적용해서 해결
정규방정식, SVD는 스케일 조정 없이도 잘 작동
규제가 있는 모델은 특성의 스케일이 다르면 지역 최적점 수렴, 규제는 가중치가 커지지 못하게 제약을 가하므로 특성값이 작으면 큰 값의 특성에 의해 무시됨
3. 경사 하강법으로 로지스틱 회귀 모델을 훈련시킬 때 지역 최솟값에 갇힐 가능성이 있을까요?
로지스틱 회귀 모델의 비용함수는 볼록함수, 경사 하강법이 훈련될 때 지역 최솟값에 갇힐 가능성 없음
4. 충분히 오랫동안 실행하면 모든 경사 하강법 알고리즘이 같은 모델을 만들어낼까요?
최적화할 함수가 볼록 함수이고 학습률이 너무 크지 않으면 모든 경사하강법이 최적점에 도달
하지만 학습률을 감소시키지 않으면 SGD, 미니배치 GD는 최적점에 도달하지 못함
5. 배치 경사 하강법을 사용하고 에프크마다 검증 오차를 그래프로 나타내봤습니다. 검증 오차가 일정하게 상승되고 있다면 어떤 일이 일어나고 있는 걸까요? 이 문제를 어떻게 해결할 수 있나요?
epoch 마다 검증 에러가 지속적으로 상승한다면 학습률이 너무 높고 알고리즘 발산하는 것
훈련 에러도 올라간다면 학습률을 내려야함
만약 훈련 에러가 올라가지 않는다면 모델이 훈련 세트에 과대적합 되어 있는 것으로 훈련 정지
6. 검증 오차가 상승하면 미니배치 경사 하강법을 즉시 중단하는 것이 좋은 방법인가요?
SGD 나 미니배치 경사 하강법은 매 훈련 반복마다 학습의 진정을 보장하기 어려움
검증에러 올라갈때 바로 정지한다면 최적점 근처에 가지 못할수도 있음
조기종료에 모델의 결과를 계속저장하고 일정시간을 넘을때 저장된 모델중 최고를 불러오는 방법이 가장 좋음
7. 어떤 경사 하강법 알고리즘이 가장 빠르게 최적 솔루션의 주변에 도달할까요? 실제로 수렴하는 것은 어떤 것 인가요? 다른 방법들도 수렴하게 만들 수 있나요?
SGD > 미니배치 GD
SGD는 한 번에 하나의 훈련 샘플만 사용해 훈련 반복이 가장 빠름 그래서 가장 먼저 전역 최적점 근처에 도달 (그다음은 미니배치 GD)
훈련시간이 충분하면 배치 경사 하강법으로 실제 수렴가능
하지만 SGD, 미니배치 GD는 점진적으로 감소 시키지 않으면 최적점 주변에만 수렴
8. 다항 회귀를 사용했을 때 학습 곡선을 보니 훈련 오차와 검증 오차 사이에 간격이 큽니다. 무슨 일이 생긴 걸까요? 이 문제를 해결하는 세 가지 방법은 무엇인가요?
검증오차가 훈련 오차보다 훨씬 더 높으면 훈련 세트에 과대적합 가능성 높음
다항 차수를 낮추는 방법 (자유도 줄어듦)
모델 규제하는 방법 (자유도 줄어듦)
훈련 세트의 크기를 증가
9. 릿지 회귀를 사용했을 때 훈련 오차와 검증 오차가 거의 비슷하고 둘 다 높았습니다. 이 모델에는 높은 편향이 문제인가요, 아니면 높은 분산이 문제인가요? 규제 하이퍼파라미터 α를 증가시켜야 할까요, 아니면 줄여야 할까요?
훈련 에러와 검증 에러가 거의 비슷하고 매우 높다면 훈련 세트에 과소적합 가능성이 큼
높은 편향을 가진 모델로 판단됨, α를 줄여야 함
10. 다음과 같이 사용해야 하는 이유는?
평범한 선형 회귀 (아무런 규제가 없음) 대신 릿지 회귀
규제가 있는 모델이 없는 모델보다 일반적으로 성능이 좋음 그래서 선형모델보다 릿지를 사용
릿지 회귀 대신 라쏘 회귀
라쏘는 l1 규제를 사용해 가중치를 완전히 0으로 만드는 경향이 있습니다. 이는 희소한 모델을 만드는 위험이 있음 또한 자동으로 특성 선택의 효과를 가지므로 단지 몇 개의 특성만 실제 유용하다고 판단될때 사용하는 것이 좋음 아니라면 릿지
라쏘 회귀 대신 엘라스틱넷
라쏘가 몇 개의 특성이 강하게 연관되어 있거나 훈련 샘플보다 특성이 더 많을 때에는 불규칙적인 행동을 함으로 엘라스틱넷이 라쏘보다 일반적으로 선호, 그러나 추가적인 하이퍼파라미터가 생김, 불규칙적인 행동이 없는 라쏘를 원하면 엘라스틱 넷에 l1_ratio를 1에 가깝게 설정
11. 사진을 낮과 밤, 실내와 실외로 분류하려 한다. 두 개의 로지스틱 회귀 분류기를 만들어야 할까, 아니면 하나의 소프트맥스 회귀 분류기를 만들어야 할까?