close_btn
조회 수 114869 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files

[11기 김대웅]Logistic_Assignment_1.html 

[11기 김대웅]Logistic_Assignment_2.html


cf. 표 및 그래프를 포함한 결과는 위의 링크 파일을 참고하시기 바랍니다.

Assignment_1

  1. confusion matirx와 ROC curve 활용하여 cut-off만 조정
  2. 새로운 결과값 도출 및 의미해석

1. Confusion matrix와 ROC curve를 활용한 cut-off 조정

1.1. ROC curve 그리기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 0에서 1 사이를 1,000 등분하여 cut off로 대입.
# 각각의 cuf off에 대해 ACC, F1, TPR, FPR, BCR 구하기
 
list = []
for i in np.linspace(0,1,1000):
    pred = model.predict_proba(X_vld)[:,1> i
    cf_mtx = confusion_matrix(y_vld, pred)
    acc = accuracy_score(y_vld, pred)
    tpr = cf_mtx[0,0/ cf_mtx[0].sum()
    fpr = cf_mtx[1,0/ cf_mtx[1].sum()
    f1 = f1_score(y_vld, pred) # class 0 1 각각에 대한 f1을 구한뒤 가중평균함
    bcr = np.sqrt((cf_mtx[0,0]/cf_mtx[0].sum())*(cf_mtx[1,1]/cf_mtx[1].sum()))
    list.append([i, acc, f1, tpr, fpr, bcr])
 
cut_off = DataFrame(list)
cut_off.columns = ["CUTOFF""ACC""F1""TPR""FPR""BCR"]
 
# cut_off별 Performance Evaluation Index
cut_off
cs

1
2
3
4
5
6
7
8
9
10
11
from sklearn.metrics import roc_curve, auc
fpr, tpr, thersholds = roc_curve(y_vld, prediction)
roc_auc = auc(fpr, tpr)
 
plt.figure(figsize=(10,10))
plt.plot(cut_off["FPR"],cut_off["TPR"], color="darkorange", lw=1, label="ROC curve (area=%.2f)" %roc_auc)
plt.plot([0,1], [0,1], color='navy', lw=1, linestyle='--')
plt.title("ROC curve")
plt.xlabel("FPR")
plt.ylabel("TPR")
plt.legend(loc="lower right")
cs

1.2. cut off 선택

  1. ACC(Accuracy : 정분류율)가 최대가 되는 값
  2. F1(Recall과 Precision의 조화평균)이 최대가 되는 값
  3. ACC가 최대가되는 cut off값 중 F1 score이 최대가 되는 cut off 값

이 셋을 선택하여 특징을 살펴보자

1.2.1. ACC값이 최대가 되는 cut off

  • 아래 cutoff값의 평균을 선택한다.
1
2
3
4
5
6
7
8
9
10
11
12
# 1. ACC MAX
cut_off[cut_off["ACC"== cut_off["ACC"].max()]
cut_off_ACC_MAX = cut_off[cut_off["ACC"== cut_off["ACC"].max()]["CUTOFF"].mean()
 
# 2. F1 MAX
cut_off[cut_off["F1"== cut_off["F1"].max()]
cut_off_F1_MAX = cut_off[cut_off["F1"== cut_off["F1"].max()]["CUTOFF"].mean()
 
# 3. F1 MAX of ACC MAX
= cut_off[(cut_off["ACC"]==cut_off["ACC"].max())]
A[(A["F1"== A["F1"].max())]
cut_off_ACC_F1 = A[(A["F1"== A["F1"].max())]["CUTOFF"].mean()



2. 새로운 결과값 도출 및 의미해석

각 cut off 값에 대한 성능 비교

* cut off값별 분류결과 저장

1
2
3
4
5
model = LogisticRegression()
model.fit(X_tr, y_tr)
pred_ACC_MAX = model.predict_proba(X_vld)[:,1> cut_off_ACC_MAX
pred_F1_MAX = model.predict_proba(X_vld)[:,1> cut_off_F1_MAX
pred_ACC_F1 = model.predict_proba(X_vld)[:,1> cut_off_ACC_F1
cs


(1) ACC값 비교

  1. ACC MAX
  2. F1 MAX
  3. F1 MAX of ACC 
1
2
3
print('1. ACC_MAX : 총 {}명 중 {:.2f}% 정확도로 생존을 맞춤'.format(y_vld.shape[0], 100 * accuracy_score(y_vld,pred_ACC_MAX)))
print('2. F1_MAX : 총 {}명 중 {:.2f}% 정확도로 생존을 맞춤'.format(y_vld.shape[0], 100 * accuracy_score(y_vld,pred_F1_MAX)))
print('3. ACC_F1 : 총 {}명 중 {:.2f}% 정확도로 생존을 맞춤'.format(y_vld.shape[0], 100 * accuracy_score(y_vld,pred_ACC_F1)))
cs

   (2) Confusion matrix 비교 및 의미해석


  각 코드의 실행결과는 첨부한 파일을 통해 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.1. ACC MAX
confusion_matrix(y_vld,pred_ACC_MAX)
print(classification_report(y_vld,pred_ACC_MAX))
 
# 2.2. F1 MAX
confusion_matrix(y_vld,pred_F1_MAX)
print(classification_report(y_vld,pred_F1_MAX))
 
# 2.3. F1 MAX of ACC MAX
confusion_matrix(y_vld,pred_ACC_F1) 
print(classification_report(y_vld,pred_ACC_F1))
 
# 2.4. defult(0.5)
confusion_matrix(y_vld,prediction) 
print(classification_report(y_vld,prediction))
cs


(2.1.) ACC_MAX

array([[109,   6],
       [ 17,  47]], dtype=int64)


             precision    recall  f1-score   support

          0       0.87      0.95      0.90       115
          1       0.89      0.73      0.80        64

avg / total       0.87      0.87      0.87       179

(2.2.) F1_MAX

array([[103,  12],
       [ 12,  52]], dtype=int64)


             precision    recall  f1-score   support

          0       0.90      0.90      0.90       115
          1       0.81      0.81      0.81        64

avg / total       0.87      0.87      0.87       179

(2.3.) ACC_F1

array([[108,   7],
       [ 16,  48]], dtype=int64)

             precision    recall  f1-score   support

          0       0.87      0.94      0.90       115
          1       0.87      0.75      0.81        64

avg / total       0.87      0.87      0.87       179

(2.4.) Default (cut off = 0.5)

array([[103,  12],
       [ 12,  52]], dtype=int64)

             precision    recall  f1-score   support

          0       0.90      0.90      0.90       115
          1       0.81      0.81      0.81        64

avg / total       0.87      0.87      0.87       179


  • row : actual(P, N), col : prediction(P, N)

  • ACC를 최대로 하는 cut off는 F1 최대보다 Positive로 분류하는 경향이 더 커 실제 Positive를 Positive라 분류할 가능성은 커지고(= 1종 오류의 가능성 감소), Negative를 Negative라고 분류할 가능성이 작아짐(= 2종 오류의 가능성 증가)

  • F1을 최대로 하는 cut off는 ACC 최대보다 Negative로 분류하는 경향이 더 커 실제 Positive를 Positive라 분류할 가능성은 작아지고(= 1종 오류의 가능성 증가), Negative를 Negative라고 분류할 가능성이 커짐(= 2종 오류의 가능성 감소)

  • Positive로 분류할 경향이 높은 모델(ACC 최대)을 선택할지, Negative로 분류할 경향이 높은 모델(F1 최대)을 선택할지는 분류문제가 무엇이냐에 따라 달리 설정해야한다.


  • Positive로 분류할 경향이 높아야하는 문제 : 민감한 반응이 필요한 문제(경계근무 중 적 감시, 서버의 이상 침입 탐지, 게임 버그 탐지 등)
  • Negative로 분류할 경향이 높아야하는 문제 : 신중하고 정확한 분류가 필요한 문제(암환자 진단, 유무죄판단 등)

  • cf. 1종 오류 : 귀무가설(여기선 Positive)이 실제로 참임에도 대립가설을 선택할 확률. 통계적 추정법에서의 alpha값. 대립가설을 선택할 때 감수하는 위험
  • cf. 2종 오류 : 대립가설(여기선 Negative)이 실제로 참임에도 귀무가설을 선택할 확률. 통계적 추정법에서의 beta값. 반대로 1-beta는 검정력(Statistical Power)으로 대립가설이 실제로 참일 때 대립가설을 선택할 확률을 말한다.

  • 결론 : 민감한 반응이 필요한 문제는 ACC를 최대로 하는 cut off를 선택하고, 신중한 분류가 필요한(둔감한 반응) 문제는 F1을 최대로 하는 cut off를 선택


==============================================


Assignment_2


   MLE를  Gradient Descent Method를 이용해 실시해보자.
   제출된 과제의 1 ~ 3의 과정은 생략하였습니다.


4. MLE by GD method

  • 일반적인 convex optimization에서 사용할 수 있는 알고리즘으로 Gradient descent method, Newton method, 그리고 Lagrange multiplier 등이 있다.
  • 이들 중에서 Gradient descent method를 사용해 MLE를 실시해보자

절차

  1. 분류문제에 사용할 Logistic Regression model을 만든다.
  2. 이를 1(MALE)로 분류할 확률(P)에 대해 정리하여 로지스틱함수(P)를 만든다.
  3. Data set x가 주어졌을 때 Data set x를 생성했을 가능성이 가장 높은 모수(beta)를 찾기위해 Likelhood를 최대로 하는 값을 찾는다. 이것을 MLE(Maximum Likelhood Estimation)이라 한다.
    • 3.1. GD를 적용하기 위해 loss function을 설계한다. J(B) = -log(Likelihood)
    • 3.2. beta에 랜덤초기값 부여
    • 3.3. 랜덤초기값의 graidient와 반대방향으로 하강 : beta = beta - alpha*J'(B)
    • 3.4. 3.3.을 멈춤조건까지 반복
  • cf_1. Likelhood(우도): 미지의 모수(beta)에 의해 Data set X가 발생할 확률(각 샘플 x_i의 발생확률들의 곱으로 정의)
  • cf_2. (3.1.) -log(Likelihood)를 한 것은 convex function 형태를 만들어 경사하강을 하기 위함.


 # 아래 내용에선 과제 원안의 수식을 일부 수정하였습니다. 첨부파일을 참고하시기 바랍니다.

4.1. Logistic Regression model 

 
1
2
3
4
# 내적 -> 회귀계수와 X의 선형결합
def a(X, beta):
    out_a = X.dot(beta)
    return out_a

4.2. Logistic function P

1
2
3
def P(a):
    out_p = 1/(1+np.exp(-a))
    return out_p


4.3. MLE

4.3.1. Likelihood

4.3.2. Loss function J

1
2
3
def J(P, Y):
    out_j = (1/len(X))*- sum(Y*np.log(P)) - sum ((1-Y)*np.log(1-P)))
    return out_j
cs



4.3.3. Gradient of loss function

1
2
def GD(X, beta, T):
    return X.T.dot((P(a(X, beta))-T))
cs



4.3.4. Gradient Descent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# INPUT : Dataset X, Label T, Learning Rate alpha
# OUTPUT : bestfit beta
 
alpha = 0.000001 #aplha값이 매우 작아 학습이 더디게 이루어집니다.
 
# 1. 초기값 설정
beta = np.random.randn(3)
# 2. repeat until i = 16770000 #최저값을 발견한 지점. 처음부터 횟수를 이렇게 지정하진 않았습니다.
= 0
while(J(P(a(X, beta)), T) > 0):
    beta = beta - alpha*GD(X, beta, T)
    i = i +1
    if i % 10000 == 0:
        print(" %d 번째" %i)
        print(J(P(a(X, beta)), T))
    if i == 16770000:
        break

cs

 # 최적 beta값 저장

1
2
# 최적 beta 저장
best_fit_01 = deepcopy(beta) 
cs



5. Visualization


1
2
3
4
5
# Classifier Model 만들기
def clf(X, beta, cut_off = 0.5):
    return P(a(X, beta)) > cut_off
 
clf(X, beta)
cs


5.1. Classification Gradation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Mash grid
xx, yy =np.mgrid[min(data.iloc[:,2])-.5:max(data.iloc[:,2])+.5:0.1,
                 min(data.iloc[:,3])-.5:max(data.iloc[:,3])+.5:0.1]
 
# Logistic function P에 넣기 위해 값을 표준화
xx_r = (xx-np.mean(xx))/np.std(xx)
yy_r = (yy-np.mean(yy))/np.std(yy)
 
# 각 순서쌍에 대하여 P값을 구함
grid = np.c_[np.repeat(1,len(xx_r.ravel())), xx_r.ravel(), yy_r.ravel()]
probs = P(a(grid, best_fit_01)).reshape(xx_r.shape)
 
# grid의 각 지점에 대하여 Logistic Model의 P값을 contour로 표현
f, ax = plt.subplots(figsize=(10,10))
contour = ax.contourf(xx, yy, probs, 25, cmap="RdBu",
                      vmin=0, vmax=1)
ax_c = f.colorbar(contour)
ax_c.set_label("$P(y=1)$")
ax_c.set_ticks([0,.25,.5, .751])
ax.scatter(data.iloc[:,2], data.iloc[:,3], c=T, s=50,
          cmap = "RdBu", vmin=-.2, vmax=1.2,
          edgecolor="white", linewidth=1)
ax.set(xlim=(min(data.iloc[:,2]-.5), max(data.iloc[:,2])+.5), ylim=(min(data.iloc[:,3]-.5),max(data.iloc[:,3])+.5),
      xlabel="$X_1$", ylabel="$X_2$")
cs



5.2. Classification Boundary

1
2
3
4
5
6
7
8
9
# 분류선 
f, ax = plt.subplots(figsize=(12,12))
ax.contour(xx, yy, probs, levels=[.5], cmap="Greys",
                      vmin=0, vmax=.6)
ax.scatter(data.iloc[:,2], data.iloc[:,3], c=T, s=50,
          cmap = "RdBu", vmin=-.2, vmax=1.2,
          edgecolor="white", linewidth=1)
ax.set(xlim=(min(data.iloc[:,2]-.5), max(data.iloc[:,2])+.5), ylim=(min(data.iloc[:,3]-.5),max(data.iloc[:,3])+.5),
      xlabel='experience', ylabel='salary')
cs




cf. 아래는 데이터를 표준화한 시각화


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 연속형 그리드를 만들고 각각의 좌표점에 대한 확률 계산
xx, yy = np.mgrid[min(X[:,1])-.5:max(X[:,1])+.5:0.01,
                  min(X[:,2])-.5:max(X[:,2])+.5:0.01]
 
grid = np.c_[np.repeat(1,len(xx.ravel())), xx.ravel(), yy.ravel()]
probs = P(a(grid, best_fit_01)).reshape(xx_r.shape)
 
# grid의 각 지점에 대하여 Logistic Model의 P값을 contour로 표현
f, ax = plt.subplots(figsize=(12,12))
contour = ax.contourf(xx, yy, probs, 25, cmap="RdBu",
                      vmin=0, vmax=1)
ax_c = f.colorbar(contour)
ax_c.set_label("$P(y=1)$")
ax_c.set_ticks([0,.25,.5, .751])
 
ax.scatter(X[:,1], X[:,2], c=T, s=50,
          cmap = "RdBu", vmin=-.2, vmax=1.2,
          edgecolor="white", linewidth=1)
ax.set(aspect="equal",
      xlim=(min(X[:,1]-.5), max(X[:,1])+.5), ylim=(min(X[:,2]-.5),max(X[:,2])+),
      xlabel="$X_1$", ylabel="$X_2$")
cs



1
2
3
4
5
6
7
8
9
10
# 분류선 
f, ax = plt.subplots(figsize=(12,12))
ax.contour(xx, yy, probs, levels=[.5], cmap="Greys",
                      vmin=0, vmax=.6)
ax.scatter(X[:,1], X[:,2], c=T, s=50,
          cmap = "RdBu", vmin=-.2, vmax=1.2,
          edgecolor="white", linewidth=1)
ax.set(aspect="equal",
      xlim=(min(X[:,1]-.5), max(X[:,1])+.5), ylim=(min(X[:,2]-.5),max(X[:,2])+.5),
      xlabel="$X_1$", ylabel="$X_2$")





List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 우수 코드 게시판 이용 관련 공지사항 DataMarket 2014.05.21 315307
304 투빅스 9&10기 5주차 NLP Basic - 10기 장유영 장유영 2018.08.22 377558
303 투빅스 10기&11기 7주차 NLP - 11기 김유민 file 2019.03.21 350108
302 투빅스 10기&11기 1주차 Algorithm - 11기 한재연 1 file 한재연 2019.01.31 192388
301 투빅스 10기&11기 2주차 SVM, Naive Bayes, KNN - 11기 김대웅 file 김대웅 2019.01.31 142135
300 투빅스 6&7기 2주차 과제 - 회귀분석 6기 장재석 2 재석 2017.02.04 129788
» 투빅스 10&11기 1주차 Logistic Regression - 11기 김대웅 file 김대웅 2019.01.23 114869
298 투빅스 11기&12기 4주차 Decision Tree - 12기 김탁영 file 2019.08.17 113386
297 투빅스 9&10기 4주차 PCA-mnist - 10기 강인구 file kaig 2018.08.16 103585
296 투빅스 7&8기 1주차 과제 알고리즘 - 8기 김강열 file 김강열 2017.07.27 100420
295 SNA(Social Network Analysis) 분석 file 바키똥 2015.04.03 90781
294 투빅스 9&10기 2주차 Naive Bayes - 10기 장유영 2 file 장유영 2018.08.01 87647
293 투빅스 7&8기 6주차 과제 TF-IDF 문서유사도 측정 - 8기 최서현 최서현 2017.08.31 83266
292 인공신경망(Artificial Neural Network) 분석 3 file 권도영 2015.04.13 75729
291 KNN (K-Nearest Neighbor) file 바키똥 2015.09.28 68202
290 능형 회귀 분석 file 자꾸생각나 2015.05.05 62227
289 지도 만들기 file 조호 2015.04.15 61005
288 크롤링 - 전국 이디야 매장정보를 중심으로 (5기 이승은) 2 file 켜져있는멀티탭 2016.03.26 59629
287 인공신경망(Aritificial Neuron Network) file 자꾸생각나 2015.09.16 56994
286 NBA data 회귀분석 / Adult data 로지스틱 회귀분석, 나이브베이즈, 의사결정나무 - 5기 정현재 2 file 정현재 2016.03.03 56675
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 16 Next ›
/ 16

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5