Gradient Decent를 이용한 로지스틱 회귀 구현 (1)
구현 시 외부 라이브러리 사용 없이 구현
<로지스틱 회귀 주요 포인트>
로지스틱 회귀(Logistic Regression): 범주형 종속 변수를 예측하는 목적. 회귀계수 추 시 최대우도추정법을 사용한다.
최대우도추정법(Maximum Likelihood Estimation): 확률분포의 모수(parameter)를 추정하는 하나의 방법. 확률변수의 우도(Likelihood)를 최대화하는 모수의 값을 모수 추정값으로 사용하는 방법
로그우도(Log Likelihood): 계산의 편의성을 위해 우도에 로그를 취하여 사용. 로그함수는 단조 증가함수이므로, 함수의 최적점을 왜곡시키지 않는다.
경사하강법(Gradient Descent Algorithm): 목적함수(Objective Function)의 값을 최소화하는 모수를 찾는 하나의 방법. 임의의 시작점에서 목적함수의 편미분 벡터(Gradient; 쉽게 기울기라고 생각하자)를 계산하여 가장 큰 그래디언트 값의 방향으로 움직이면서 목적함수의 값을 최소화함.
< 과제 수행 시 주요 고려 사항>
1) 로지스틱 회귀 모형의 Objective Function을 구현. 2) Gradient Descent 알고리즘을 구현하고, 1)을 이에 적용.
In [1]:
import math, random
from functools import partial,reduce
from assignment2 import *
import pandas as pd
from sklearn.model_selection import train_test_splitIn [2]:
"""
data 설명
1) Label: 유료 계정 등록 여부(target)
2) bias: 회귀 모형에서의 상수항을 위한 term (추정 시 포함하지 않아도 ok)
3) experience: 근속연수
4) salary: 연봉
어떤 사용자가 유료 계정을 등록할지(Label == 1)에 대한 예측을 로지스틱 회귀 모형으로 진행합니다.
"""In [3]:
0. Gradient Descent
경사하강법 구현
step: 어느 정도 이동할지 정의
safe: 예외처리
minimize_bgd: batch gradient descent (최소화)
In [5]:
In [6]:
In [7]:
In [8]:
1. 로지스틱 함수¶
해당 함수는 1/(1+exp[-(ax+b)]로 표현되었음을 기억합시다.
In [9]:
In [10]:
2. Likelihood 구현¶
그냥 Likelihood function 대신, log likelihood function을 이용해서 구현하세요.
In [11]:
In [12]:
3. Gradient for Log Reg¶
아래 3가지 함수에 대해 해당 함수의 인자와 기능을 자세히 설명하세요.
In [14]:
4. Model Fitting¶
위에서 구현한 log likelihood를 이용하여 Model을 Fitting 시켜보세요. 앞서 우리는 log likelihood를 maximize하는 방향으로 회귀계수를 추정한다고 배웠습니다. Gradient Descent는 경사 "하강법"으로 최솟값을 찾는 데에 사용되는 알고리즘입니다. 따라서 log likelihood를 적절히 변형을 해야 Gradient Descent 코드를 적용할 수 있습니다. log likelihood 변형 함수는 assignment2.py에 구현되어있으니, None값만 채워주시면 됩니다.
Out[16]:
Label
bias
experience
salary
0
1
1
0.7
48000
1
0
1
1.9
48000
2
1
1
2.5
60000
3
0
1
4.2
63000
4
0
1
6.0
76000
5
0
1
6.5
69000
6
0
1
7.5
76000
7
0
1
8.1
88000
8
1
1
8.7
83000
9
1
1
10.0
83000
10
0
1
0.8
43000
11
0
1
1.8
60000
12
1
1
10.0
79000
13
0
1
6.1
76000
14
0
1
1.4
50000
15
0
1
9.1
92000
16
0
1
5.8
75000
17
0
1
5.2
69000
18
0
1
1.0
56000
19
0
1
6.0
67000
20
0
1
4.9
74000
21
1
1
6.4
63000
22
0
1
6.2
82000
23
0
1
3.3
58000
24
1
1
9.3
90000
25
1
1
5.5
57000
26
0
1
9.1
102000
27
0
1
2.4
54000
28
1
1
8.2
65000
29
0
1
5.3
82000
...
...
...
...
...
170
0
1
6.2
70000
171
1
1
6.6
56000
172
0
1
6.3
76000
173
0
1
6.5
78000
174
0
1
5.1
59000
175
1
1
9.5
74000
176
0
1
4.5
64000
177
0
1
2.0
54000
178
0
1
1.0
52000
179
0
1
4.0
69000
180
0
1
6.5
76000
181
0
1
3.0
60000
182
0
1
4.5
63000
183
0
1
7.8
70000
184
1
1
3.9
60000
185
0
1
0.8
51000
186
0
1
4.2
78000
187
0
1
1.1
54000
188
0
1
6.2
60000
189
0
1
2.9
59000
190
0
1
2.1
52000
191
0
1
8.2
87000
192
0
1
4.8
73000
193
1
1
2.2
42000
194
0
1
9.1
98000
195
0
1
6.5
84000
196
0
1
6.9
73000
197
0
1
5.1
72000
198
1
1
9.1
69000
199
1
1
9.8
79000
200 rows × 4 columns
In [17]:
In [59]:

In [18]:
In [19]:
In [20]:
In [21]:
Out[22]:
5. scikit-learn과 비교¶
구현한 함수와 sklearn의 LogisticRegression을 비교.
In [23]:
In [24]:
In [63]:
In [44]:
In [45]:
Out[93]:
In [96]:

sklearn의 LogisticRegression에서 threshold 조정¶
In [74]:
Out[74]:
In [76]:
In [107]:

In [ ]:
데이터 출처: Data Science from Scratch: First Principles with Python (2015)
Last updated
Was this helpful?