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_split

In [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?