일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- IDE #spyder
- 티스토리블로그 #티스토리 #PDF #블로그PDF저장
- python #파이썬 #pandas #dataframe #dataframe생성 #valueerror
- 파이썬 #Python #가상환경 #anaconda #python설치 #python가상환경
- Chap4 #핸즈온머신러닝 #머신러닝 #핸즈온머신러닝연습문제
- Chap4 #ML #미니배치경사하강법 #경사하강법 #머신러닝 #핸즈온머신러닝
- 객체의종류 #리스트 #튜플 #딕셔너리 #집합 #Python #파이썬 #list #tuple #dictionary #set
- 확률적경사하강법 #경사하강법 #머신러닝 #선형회귀 #ML #Chap4
- 티스토리 #수학수식 #수학수식입력 #티스토리블로그 #수식입력
- 핸즈온머신러닝 #handson
- ML #핸즈온머신러닝 #학습곡선 #편향분산트레이드오프
- 선형회귀 #정규방정식 #계산복잡도 #LinearRegression #Python #ML
- adp #데이터분석전문가 #데이터분석자격증 #adp후기 #adp필기
- Chap4
- 인덱싱 #슬라이싱 #python #파이썬 #수정및삭제 #원소의수정 #객체의함수 #keys#values#items#get#len#append#sort#sorted
- python #dataframe #파생변수 #map #lambda #mapping
- Chap4 #ML #배치경사하강법 #경사하강법 #핸즈온머신러닝 #핸즈온
- Chap4 #다항회귀 #PolynomialRegression #ML #머신러닝
- 키워드추출 #그래프기반순위알고리즘 #RandomSurferModel #MarcovChain #TextRank #TopicRank #EmbedRank
- 라쏘회귀 #엘라스틱넷 #조기종료
- Chap4 #릿지회귀 #정규방정식 #확률적경사하강법 #SGD #규제가있는선형모델
- 경사하강법 #핸즈온머신러닝 #머신러닝 #ML
- Today
- Total
StudyStudyStudyEveryday
[파이썬머신러닝] 로지스틱 회귀 (Logistic Regression) 본문
[목차] 4.6 로지스틱 회귀
4.6.1 확률 추정
4.6.2 훈련과 비용 함수
4.6.3 결정 경계
4.6.4 소프트맥스 회귀
로지스틱 회귀 (= 로짓 회귀)
로지스틱 회귀는 샘플이 특정 클래스에 속할 확률을 추정하는 데 사용된다.
- 추정 확률 > 50% 이 되면, 모델은 해당 샘플이 해당 클래스에 속한다고 예측한다. (label=1인 양성클래스)
- 추정 확률 < 50% 이 되면, 모델은 해당 샘플이 해당 클래스에 속하지 않는다고 예측한다. (label=0 인 음성클래스)
확률 추정
그럼 확률은 어떻게 추정할까?
입력 특성의 가중치 합을 계산하고, 결괏값의 로지스틱을 출력한다.
< 로지스틱 회귀 모델의 확률 추정 (벡터 표현식) >
$$ \hat{p} = h_{\theta}(\textbf{x}) = \sigma( \mathbf{\theta}^{T} \textbf{x} ) $$
여기서 로지스틱 \(\sigma(·) \)은 0~1 사이 값을 출력하는 시그모이드 함수(sigmoid function)이다.
$$ \sigma(t) = \frac{1}{1 + exp^{-t}} $$
로지스틱 회귀 모델이 샘플 \(\textbf{x}\)가 양성 클래스에 속할 확률 \( \hat{p} = h_{\theta}(\textbf{x}) \) 을 추정하면 이에 대한 예측 \(\hat{y}\)를 쉽게 구할 수 있다.
여기서 \(t\)를 logit 이라고 부르기도 한다. 실제로 logit(p) = log(p/(1-p))로 정의되는 로짓 함수가 로지스틱 함수의 역함수이다.
< 로지스틱 회귀 모델 예측 >
$$ \hat{y} = \left\{\begin{matrix}
0 & \hat{p} < 0.5 \\
1 & \hat{p} \geq 0.5 \\
\end{matrix}\right. $$
즉, 로지스틱 회귀 모델은 \(\mathbf{\theta}^{T} \textbf{x}\)가 양수일 때 1 (양성 클래스)라고 예측하고, 음수일 때 0 (음성 클래스)라고 예측한다.
훈련과 비용 함수
이제는 로지스틱 회귀 모델이 데이터를 훈련 시키는 방법에 대해 알아보겠다.
훈련의 목적 : 양성 샘플 (y=1)에 대해서는 높은 확률을 추정하고, 음성 샘플 (y=0)에 대해서는 낮은 확률을 추정하는 모델 파라미터 벡터를 찾는 것
< 하나의 훈련 샘플에 대한 비용 함수 >
$$ c(\mathbf{\theta}) = \left\{\begin{matrix}
-log(\hat{p}) & y=1 \\
-log(1-\hat{p}) & y=0 \\
\end{matrix}\right. $$
위 비용 함수 식에 의해,
- 양성 샘플을 0에 가까운 확률로 추정하면 비용이 크게 증가하게 된다.
- 양성 샘플을 1에 가까운 확률로 추정하면 비용이 0에 가까워질 것이다.
전체 훈련 세트에 대한 비용함수는 모든 훈련 세트의 비용의 평균이다.
이를 로그 손실 (log loss)라고 부른다.
< 로지스틱 회귀의 비용 함수 (로그 손실) >
$$ J(\mathbf{\theta}) = -\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log(\hat{p}^{(i)}) + (1-y^{(i)})log(1-\hat{p}^{(i)})] $$
이 비용 함수의 최솟값을 계산하는 알려진 해는 없지만, 볼록 함수이기 때문에 경사 하강법이 전역 최솟값을 찾는 것을 보장한다.
이 비용함수를 \(\theta_{j{\)에 대해 편미분 해보자.
< 로지스틱 비용 함수의 편도 함수 >
$$ \frac{\partial }{\partial \theta_{j}}J(\mathbf{\theta}) = \frac{1}{m}\sum_{i=1}^{m}(\sigma(\mathbf{\theta}^{T}\textbf{x}^{(i)})-y^{(i)})x^{(i)}_{j} $$
각 샘플에 대해 예측 오차를 계산하고 j번째 특성값을 곱해 모든 훈련 샘플에 대한 평균을 냈다. 모든 편도함수에 대한 Gradient vector을 만들면 배치 경사 하강법 알고리즘을 사용할 수 있다.
결정 경계 (Decision boundary)
# 데이터 로드
from sklearn import datasets
iris = datasets.load_iris()
list(iris.keys())
X = iris["data"][:, 3:] # 꽃잎 너비
y = (iris["target"] == 2).astype(int) # Iris virginica이면 1 아니면 0
# 로지스틱 회귀 모델 훈련
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression(solver="lbfgs", random_state=42)
log_reg.fit(X, y)
# 모델의 추정확률 계산
X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
decision_boundary = X_new[y_proba[:, 1] >= 0.5][0]
plt.figure(figsize=(8, 3))
plt.plot(X[y==0], y[y==0], "bs")
plt.plot(X[y==1], y[y==1], "g^")
plt.plot([decision_boundary, decision_boundary], [-1, 2], "k:", linewidth=2)
plt.plot(X_new, y_proba[:, 1], "g-", linewidth=2, label="Iris virginica")
plt.plot(X_new, y_proba[:, 0], "b--", linewidth=2, label="Not Iris virginica")
* 사이킷런의 LogisticRegression 모델의 규제 강도를 조절하는 하이퍼파라미터는 (다른 선형 모델처럼) alpha가 아니고 그 역수에 해당하는 C이다. C가 높을수록 모델의 규제가 줄어든다.
1.6cm 근방에서 결정 경계가 만들어진다.
따라서, 꽃잎 너비 > 1.6cm 이면 Iris-Verginica, 꽃잎 너비 < 1.6cm 이면 아니라고 예측할 것이다.
log_reg.predict([[1.7], [1.5]])
>> array([1, 0])
위 그림에서 점선은 모델이 50% 확률을 추정하는 결정 경계이다.
15%부터 90%까지 수평한 직선들은 모델이 특정확률을 출력하는 포인트를 나타낸다.
모델은 맨 오른쪽 위 직선을 넘어서 있는 꽃들을 90% 이상의 확률로 Iris-Verginica로 판단한다.
소프트맥스 회귀 (softmax regression)
소프트맥스 회귀 (=다항 로지스틱 회귀) : 로지스틱 회귀 모델을 여러 개의 이진 분류기를 훈련시켜 연결하지 않고 직접 다중 클래스를 지원하도록 일반화
샘플 x가 주어지면
- 먼저 소프트맥스 회귀 모델이 각 클래스 k에 대한 점수를 계산하고
- 그 점수에 소프트맥스 함수(or 정규화된 지수 함수)를 적용하여 각 클래스의 확률 추정
< 클래스 k에 대한 소프트맥스 점수 >
$$ s_{k}(\textbf{x}) = (\mathbf{\theta}^{(k)})^{T}\textbf{x} $$
각 클래스는 자신만의 파라미터 벡터 \(\mathbf{\theta}^{(k)}\) 가 있다.
이 벡터들은 파라미터 행렬에 행으로 저장된다.
이 점수가 계산 되면 소프트맥스 함수를 통과시켜 클래스 k에 속할 확률을 추정할 수 있다.
< 소프트맥스 함수 >
$$ \hat{p}_k = \sigma(\mathbf{s(x)})_k = \frac{exp(s_k(\textbf{x}))}{\sum_{j=1}^{K}exp(s_j(\textbf{x}))} $$
- K : 클래스 수
- \(\mathbf{s(x)} \) : 샘플 x에 대한 각 클래스의 점수를 담은 벡터
- \( \sigma(\mathbf{s(x)})_k \) : 샘플 x에 대한 각 클래스의 점수가 주어졌을 때, 이 샘플이 클래스 k에 속할 추정 확률
소프트맥스 회귀 분류기는 추정 확률이 가장 높은 클래스를 선택한다.
< 소프트맥스 회귀 분류기의 예측 >
$$ \hat{y} = \underset{k}{argmax} \sigma(\mathbf{s(x)})_k = \underset{k}{argmax} s_k\mathbf{(x)} = \underset{k}{argmax}((\mathbf{\theta^{(k)})^{T}}\textbf{x}) $$
- 추정 확률 \(\sigma(\mathbf{s(x)})_k\)가 최대인 k값을 반환한다.
- 소프트맥스 회귀 분류기는 한 번에 하나의 클래스만 예측하므로 상호 배타적인 클래스에서만 사용해야한다.
- 즉, 하나의 사진에서 여러 사람의 얼굴을 인식하는 데는 사용할 수 없다.
그럼 훈련 방법에 대해 설명하겠다.
목적 : 모델이 타깃 클래스에 대해서 높은 확률을 추정하도록 하는 것
따라서, 크로스 엔트로피 (cross entropy) 비용 함수를 최소화하는 것은 타깃 클래스에 대해 낮은 확률을 예측하는 모델을 억제하므로 이 목적에 부합한다.
< 크로스 엔트로피 비용 함수 >
$$ J(\Theta ) = -\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K} y^{(i)}_k log(\hat{p}^{(i)}_k) $$
이 비용 함수에서 클래스가 딱 두 개일 때 (K=2), 이 비용 함수는 로지스틱 회귀의 비용 함수와 같다.
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)
softmax_reg.predict([[5, 2]])
softmax_reg.predict_proba([[5, 2]])
LogisticRegression은 클래스가 둘 이상일 때 기본적으로 일대다 (OvA) 전략을 사용하지만,
multi_class 매개변수를 'multinomial'로 바꾸면 소프트맥스 회귀를 사용할 수 있다.
이때, 소프트맥스 회귀를 사용하려면 solver에 'lbfgs'와 같은 소프트맥스 회귀를 지원하는 알고리즘을 지정해야한다.
* 해당 포스팅은 머신러닝 학습 중 핸즈온 머신러닝 2판을 참고하여 작성하였습니다. *
'DataScience > 핸즈온 머신러닝 Hands-on ML' 카테고리의 다른 글
[파이썬머신러닝] 비선형 서포트 벡터 머신 (SVM) 분류 (0) | 2022.04.02 |
---|---|
[파이썬머신러닝] 선형 서포트 벡터 머신 (SVM) 분류 (0) | 2022.04.01 |
[파이썬머신러닝] 규제가 있는 선형 모델 - 릿지 회귀 / 라쏘 회귀 / 엘라스틱 넷 (0) | 2022.03.26 |
성능 측정 - 학습 곡선 (0) | 2022.03.25 |
머신러닝 모델 - 다항 회귀 (Polynomial Regression) (0) | 2022.03.24 |