ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2022_하계_모각코] 2회차(07/11)
    [CNU] Mogakco 2022. 7. 11. 16:55

    2회 차 목표

    03. 평가
    04. 분류 - 결정 트리, 앙상블 학습

    [LG Aimers] 품질 및 신뢰성 공학 강의 Part3~6 수강



    03. 평가

    머신러닝은 데이터 가공/변환 - 모델학습/예측 - 평가의 프로세스로 구성된다.

    머신러닝 모델은 여러 가지 방법으로 예측 성능을 평가할 수 있으며, 성능 평가 지표는 일반적으로 모델이 분류냐, 회귀냐에 따라 여러 종류로 나뉜다.

    회귀의 경우 대부분 실제값과 예측값의 오차 평균값에 기반한다. 기본적으로 예측 오차를 가지고 정규화 수준을 재가공하는 방법이 회귀의 성능 평가 지표 유형이다.

    분류의 평가 방법도 일반적으로는 실제 결과 데이터와 예측 결과 데이터가 얼마나 정확하고 오류가 적게 발생하는가에 기반하지만, 단순히 이런 정확도만 가지고 판단할 수만은 없다.

     

    1. 정확도(Accuracy)

    -실제 데이터에서 예측 데이터가 얼마나 같은지를 판단하는 지표

    #정확도(Accuracy) = 예측 결과가 동일한 데이터 건수/전체 예측 데이터 건수

    정확도 평가 지표는 불균형한 레이블 데이터 세트에서는 성능 수치로 사용될 수 없으므로, 여러 가지 분류 지표와 함께 사용해야 한다.

     

    2. 오차행렬 (Confusion Matrix)

    -이진 분류에서 성능 지표로 잘 활용되는 오차행렬은 학습된 분류 모델이 예측을 수행하면서 얼마나 헷갈리고 있는지도 함께 보여주는 지표이다.

    실제 클래스 \ 예측 클래스 Negative Positive
    Negative TN FP
    Positive FN TP

    -TP : 실제 True인 정답을 모델이 True라고 예측 (정답)

    -FP : 실제 False인 정답을 모델이 False라 예측 (오답)

    -TN : 실제 False인 정답을 모델이 False라고 예측 (정답)

    -FN : 실제 True인 정답을 모델이 False라고 예측 (오답)

     

    사이킷런은 오차행렬을 구하기 위해 confusion_matrix API를 제공한다.

    from sklearn.metrics import confusion_matrix
    
    confusion_matrix(y_test,fakepred)

    불균형한 이진 분류 데이터 세트에서는 Positive 데이터 건수가 매우 작기 때문에 데이터에 기반한 ML알고리즘은 Positive보다는 Negative로 예측 정확도가 높아지는 경향이 발생한다.

    결과적으로 정확도 지표는 비대칭한 데이터 세트에서 Positive에 대한 예측 정확도를 판단하지 못한 채 Negative에 대한 예측 정확도만으로도 분류의 정확도가 매우 높게 나타나는 수치적인 판단오류를 일으키게 된다. 정확도는 분류 모델의 성능을 측정할 수 있는 한 가지 요소일 뿐이다 불균형한 데이터 세트에서 정확도만으로는 모델 신뢰도가 떨어질 수 있다.

     

    3. 정밀도(precision)와 재현율(recall)

    정밀도와 재현율은 positive 데이터 세트의 예측 성능에 좀 더 초점을 맞춘 평가 지표이다.

    #정밀도 = TP/(FP+TP)
    #재현율 = TP/(FN+TP)

     

    1) 정밀도

    모델이 True라고 분류한 것 중 실제 True인 것의 비율

    2) 재현율

    실제 True인 것 중에서 모델이 True라고 예측한 것의 비율

    3) 정확도

    TP + TN/TP + FN + FP + TN

     

    *정밀도와 재현율 지표 중에 이진 분류 모델의 업무 특성에 따라서 특정 평가 지표가 더 중요한 지표로 간주될 수 있다.

    # 재현율이 상대적으로 더 중요한 지표는 실제 positive 양성인 데이터 예측을 negative로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우.
    # 정밀도가 상대적으로 더 중요한 지표인 경우는 실제 nagative 음성인 데이터 예측을 positive양성으로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우.

    가장 좋은 성능은 재현율과 정밀도 둘 다 높은 수치를 얻는 것이다.

     

    사이킷런은 정밀도 계산을 위해 precision_score()를, 재현율 계산을 위해 recall_score()을 api로 제공한다.

    from sklearn.metrics import accuracy_score,precision_score,recall_score,confusion_matrix
    
    def get_clf_eval(y_test,pred):
      confusion=confusion_matrix(y_test,pred)
      accuracy=accuracy_score(y_test,pred)
      precision=precision_score(y_test,pred)//정밀도
      recall=recall_score(y_test,pred)//재현율
      print('오차행렬')
      print(confusion)
      print('정확도:{0:.4f}, 정밀도:{1:.4f},재현율:{2:.4f}'.format(accuracy,precision,recall))

    4. 정밀도/재현율 트레이드 오프

    분류하려는 업무의 특성상 정밀도 또는 재현율이 특별히 강조되어야 할 경우 분류의 결정 임곗값을 조정해 정밀도 또는 재현율의 수치를 높일 수 있다. 하지만 정밀도와 재현율은 상호 보완적인 평가지표이기 때문에 어느 한 쪽을 강제로 높이면 다른 하나의 수치는 떨어지기 쉽다. 이를 정밀도/재현율의 트레이드 오프(trade-off)라고 부른다.

     

    이킷런은 개별 데이터별로 예측 확률을 반환하는 메서드인 predict_proba()를 제공한다.

    predict_proba() 메서드는 학습이 완료된 사이킷런 classifier 객체에서 호출이 가능하며, 테스트 피처 데이터 세트를 파라미터로 입력해주면 테스트 피처 레코드의 개별 클래스 예측 확률을 반환한다.

     

    predict_proba()

    import numpy as np
    
    pred_proba=lr_clf.predict_proba(X_test)
    pred=lr_clf.predict(X_test)
    print(pred_proba.shape)
    print("pred_proba array에서 앞 3개만 샘플로 추출 : ",pred_proba[:3])
    
    #예측 확률 array와 예측 결괏값 array를 병합해 예측 확률과 결괏값을 한눈에 확인
    pred_proba_result=np.concatenate([pred_proba,pred.reshape(-1,1)],axis=1)
    print("두 개의 class 중에서 더 큰 확률을 클래스 값으로 예측 \n",pred_proba_result[:3])
    (179, 2)
    pred_proba array에서 앞 3개만 샘플로 추출 :  [[0.85200153 0.14799847]
     [0.89279033 0.10720967]
     [0.9336069  0.0663931 ]]
    두 개의 class 중에서 더 큰 확률을 클래스 값으로 예측 
     [[0.85200153 0.14799847 0.        ]
     [0.89279033 0.10720967 0.        ]
     [0.9336069  0.0663931  0.        ]]

    반환 결과인 ndarray는 0과 1에 대한 확률을 나타내므로 첫 번째 칼럼과 두 번째 칼럼 값을 더하면 1이 된다. 맨 마지막 줄의 predict() 메서드의 결과 비교에서도 나타나듯이, 두 개의 칼럼 중에서 더 큰 확률 값으로 predict() 메서드가 최종 예측하고 있다. 

     

    사이킷런은 분류 결정 임곗값을 조절해 정밀도와 재현율의 성능 수치를 상호 보완적으로 조정할 수 있다.

     

    Binarizer

    from sklearn.preprocessing import Binarizer
    
    X=[[1,-1,2],
       [2,0,0],
       [0,1.1,1.2]]
    
    #X의 개별 원소들이 threshold값보다 같거나 작으면 0을 크면 1을 반환
    binarizer=Binarizer(threshold=1.1)
    print(binarizer.fit_transform(X))

     

    [[0. 0. 1.]
     [1. 0. 0.]
     [0. 0. 1.]]

    입력된 X 데이터 세트에서 Binarizer의 threshold 값이 1.1보다 작거나 같으면 0, 크면 1로 변환됨을 알 수 있다.

     

    LogisticRegression 객체의 predict_proba() 메서드로 구한 각 클래스별 예측 확률값인 pred_proba() 객체 변수에 분류 결정 임곗값을 0,5로 지정한 Binarizer 클래스를 적용해 최종 예측값을 구해보자!

     

    임곗값 0.5

    from sklearn.preprocessing import Binarizer
    
    #Binarizer의 thereshold 설정값, 분류 결정 임곗값임.
    custom_threshold=0.5
    
    #predict_proba() 반환 값의 두 번째 칼럼, 즉 positive클래스 칼럼 하나만 추출해 binarizer을 적용
    pred_proba_1=pred_proba[:,1].reshape(-1,1)
    binarizer=Binarizer(threshold=custom_threshold).fit(pred_proba_1)
    custom_predict=binarizer.transform(pred_proba_1)
    
    get_clf_eval(y_test,custom_predict)
    오차행렬
    [[92 18]
     [16 53]]
    정확도:0.8101, 정밀도:0.7465,재현율:0.7681

    임계값 0.4

    from sklearn.preprocessing import Binarizer
    
    #Binarizer의 thereshold 설정값, 분류 결정 임곗값임.
    custom_threshold=0.4
    
    #predict_proba() 반환 값의 두 번째 칼럼, 즉 positive클래스 칼럼 하나만 추출해 binarizer을 적용
    pred_proba_1=pred_proba[:,1].reshape(-1,1)
    binarizer=Binarizer(threshold=custom_threshold).fit(pred_proba_1)
    custom_predict=binarizer.transform(pred_proba_1)
    
    get_clf_eval(y_test,custom_predict)
    오차행렬
    [[86 24]
     [13 56]]
    정확도:0.7933, 정밀도:0.7000,재현율:0.8116

    임계값을 낮추니 재현율값이 올라가도 정밀도가 떨어진 것을 확인할 수 있다. 분류 결정 임곗값은 positive 예측값을 결정하는 확률의 기준이 된다.

    -> 확률이 0.5가 아닌 0.4 부터 positive로 예측을 더 너그럽게 하기 떄문에 임곗값을 낮출수록 true값이 많아진다.

    -> positive 예측값이 많아지면 상대적으로 재현율 값이 높아진다.

    임계값이 0.5에서 0.4로 낮아지면서 TP가 47에서 50으로 늘었고, FN은 13에서 10으로 줄었다. 그에 따라 재현율이 0.78에서 0.83으로 좋아졌다. 그리고 정확도는 나빠졌다. 정밀도도 나빠졌다.

     

    임곗값의 증가에 따른 평가 지표 변화 조사 (0.4에서 0.6까지 0.05씩 증가시킴)

    #테스트를 수행할 모든 임곗값을 리스트 객체로 저장
    thresholds=[0.4,0.45,0.5,0.55,0.60]
    
    def get_eval_by_threshold(y_test,pred_proba_c1,thresholds):
      #thresholds list 객체 내의 값을 차례로 iteration하면서 Evaluation 수행
      for custom_threshold in thresholds:
        binarizer=Binarizer(threshold=custom_threshold).fit(pred_proba_c1)
        custom_predict=binarizer.transform(pred_proba_c1)
        print('임계값:',custom_threshold)
        get_clf_eval(y_test,custom_predict)
    
    get_eval_by_threshold(y_test,pred_proba[:,1].reshape(-1,1),thresholds)
    임계값: 0.4
    오차행렬
    [[86 24]
     [13 56]]
    정확도:0.7933, 정밀도:0.7000,재현율:0.8116
    임계값: 0.45
    오차행렬
    [[91 19]
     [14 55]]
    정확도:0.8156, 정밀도:0.7432,재현율:0.7971
    임계값: 0.5
    오차행렬
    [[92 18]
     [16 53]]
    정확도:0.8101, 정밀도:0.7465,재현율:0.7681
    임계값: 0.55
    오차행렬
    [[97 13]
     [18 51]]
    정확도:0.8268, 정밀도:0.7969,재현율:0.7391
    임계값: 0.6
    오차행렬
    [[99 11]
     [25 44]]
    정확도:0.7989, 정밀도:0.8000,재현율:0.6377

    사이킷런은 위의 처럼 임곗값 변화에 따른 평가 지표값을 알아보는 코드와 유사한 precision_recall_curve() API를 제공한다.

     

    precision_recall_curve()

    from sklearn.metrics import precision_recall_curve
    
    #레이블 값이 1일 때의 예측 확률을 추출
    pred_proba_class1=lr_clf.predict_proba(X_test)[:,1]
    
    #실제값 데이터 세트와 레이블 값이 1일 떄의 예측 확률을 precision_recall_curve 인자로 입력
    precisions,recalls,thresholds=precision_recall_curve(y_test,pred_proba_class1)
    print('반환한 분류 결정 임곗값 배열의 shape:',thresholds.shape)
    
    #반환된 임계값 배열 로우가 147건이므로 샘플로 10건만 추출하되, 임곗값을 15step으로 추출.
    thr_index=np.arange(0,thresholds.shape[0],15)
    print('샘플 추출을 위한 임계값 배열의 index 10개 : ',thr_index)
    print('샘플용 10개의 임곗값 : ',np.round(thresholds[thr_index],2))
    
    #15 step 단위로 추출된 임계값에 따른 정밀도와 재현율 값
    print('샘플 임게값별 정밀도 : ', np.round(precisions[thr_index],3))
    print('샘플 임계값별 재현율 : ',np.round(recalls[thr_index],3))
    반환한 분류 결정 임곗값 배열의 shape: (166,)
    샘플 추출을 위한 임계값 배열의 index 10개 :  [  0  15  30  45  60  75  90 105 120 135 150 165]
    샘플용 10개의 임곗값 :  [0.06 0.1  0.11 0.15 0.19 0.28 0.43 0.57 0.65 0.8  0.91 0.97]
    샘플 임게값별 정밀도 :  [0.399 0.418 0.464 0.52  0.594 0.659 0.724 0.803 0.826 1.    1.    1.   ]
    샘플 임계값별 재현율 :  [1.    0.957 0.928 0.928 0.913 0.87  0.797 0.71  0.551 0.449 0.232 0.014]

    추출된 임계값 샘플 10개에 해당하는 정밀도 값과 재현율 값을 살펴보면 임곗값이 증가할수록 정밀도 값은 동시에 높아지나 재현율 값은 동시에 낮아진다.

    import matplotlib.pyplot as plt
    import matplotlib.ticker as ticker
    %matplotlib inline
    
    def precision_recall_curve_plot(y_test,pred_proba_c1):
      #threshold ndarry와 이 threshold에 따른 정밀도, 재현율 ndarray 추출
      precisions,recalls,thresholds=precision_recall_curve(y_test,pred_proba_c1)
    
      #X축을 threshold값으로, y축은 정밀도, 재현율 값으로 각각 plot 수행, 정밀도는 점선으로 표시
      plt.figure(figsize=(8,6))
      threshold_boundary=thresholds.shape[0]
      plt.plot(thresholds,precisions[0:threshold_boundary],linestyle='--',label='precision')
      plt.plot(thresholds,recalls[0:threshold_boundary],label='recall')
    
      #threshold 값 X축의 scale을 0.1 단위로 변경
      start,end=plt.xlim()
      plt.xticks(np.round(np.arange(start,end,0.1),2))
    
      #X축,y축 label과 legend 그리고 grid 설정
      plt.xlabel('Threshold value')
      plt.ylabel('Precision and Recall value')
      plt.legend()
      plt.grid()

    정밀도와 재현율의 임곗값 그래프로 시각화

    5. F1 스코어

    정밀도와 재현율을 결합한 지표, F1 스코어는 정밀도와 재현율이 어느 한 쪽으로 치우치지 않는 수치를 나타낼 떄 상대적으로 높은 값을 가진다.

    F1 스코어의 공식

    사이킷런은 F1를 구하기 위해 f1_score()라는 API를 제공한다.

     

    f1_score

    from sklearn.metrics import f1_score
    
    f1=f1_score(y_test,pred)
    print('F1 스코어: {0:.4f}'.format(f1))
    F1 스코어: 0.7571
    def get_clf_eval(y_test,pred):
      confusion=confusion_matrix(y_test,pred)#오차행렬
      accuracy=accuracy_score(y_test,pred)#정확도
      precision=precision_score(y_test,pred)#정밀도
      recall=recall_score(y_test,pred)#재현율
    
      #f1 스코어 추가
      f1=f1_score(y_test,pred)
      print(confusion)
    
      #f1 score print 추가
      print("정확도 :{0:.4f}, 정밀도 : {0:.4f}, 재현율 : {0:.4f}, f1 : {0:.4f}".format(accuracy,precision,recall,f1))
    
    
    thresholds=[0.4,0.45,0.5,0.55,0.6]
    pred_proba=lr_clf.predict_proba(X_test)
    get_eval_by_threshold(y_test,pred_proba[:,1].reshape(-1,1),thresholds)
    임계값: 0.4
    [[86 24]
     [13 56]]
    정확도 :0.7933, 정밀도 : 0.7933, 재현율 : 0.7933, f1 : 0.7933
    임계값: 0.45
    [[91 19]
     [14 55]]
    정확도 :0.8156, 정밀도 : 0.8156, 재현율 : 0.8156, f1 : 0.8156
    임계값: 0.5
    [[92 18]
     [16 53]]
    정확도 :0.8101, 정밀도 : 0.8101, 재현율 : 0.8101, f1 : 0.8101
    임계값: 0.55
    [[97 13]
     [18 51]]
    정확도 :0.8268, 정밀도 : 0.8268, 재현율 : 0.8268, f1 : 0.8268
    임계값: 0.6
    [[99 11]
     [25 44]]
    정확도 :0.7989, 정밀도 : 0.7989, 재현율 : 0.7989, f1 : 0.7989

    이 API를 사용하면 적당한 수치의 임곗값을 찾아낼 수 있다.

     

    ROC 곡선과 AUC

    ROC 곡선과 이에 기반한 AUC 스코어는 이진 분류의 예측 성능 측정에서 중요하게 사용되는 지표이다. ROC 곡선은 우리말로 수신자 판단 곡선으로 불린다. 머신러닝의 이진 분류 모델의 예측 성능을 판단하는 중요한 평가 지표이기도 하다.

     

    ROC 곡선 : FPR이 변할 때 TPR이 어떻게 변하는지를 나타내는 곡선

    TPR : 재현율 민감도라고 불리기도 하며, 실제값 Positive(양성)가 정확히 예측되어야 하는 수준을 나타낸다.

    TNR : 특이성, 실제값 Negative(음성)가 정확히 예측되어야 하는 수준을 나타낸다.

    가운데 직선은 ROC 곡선의 최저값으로, ROC 곡선이 가운데 직선에 가까울수록 성능이 떨어지는 것이고 멀어질수록 성느이 뛰어난 것이다.

     

    사이킷런은 ROC곡선을 구하기 위해 roc_curve() API를 제공한다.

     

    roc_curve

    from sklearn.metrics import roc_curve
    
    #레이블 값이 1일때의 예측 확률을 추출
    pred_proba_class1=lr_clf.predict_proba(X_test)[:,1]
    
    fprs,tprs,thresholds=roc_curve(y_test,pred_proba_class1)
    #반환된 임계값 배열에서 샘플로 데이터를 추출하되, 임곗값을 5 steps로 추출
    #thresholds[0]은 max(예측확률)+1로 임의설정, 이를 제외하기 위해 np.arange는 1부터 시작
    thr_index=np.arange(1,thresholds.shape[0],5)
    
    print('샘플 추출을 위한 임곗값 배열의 index:',thr_index)
    print('샘플 index로 추출한 임곗값 : ',np.round(thresholds[thr_index],2))
    
    #5 step 단위로 추출된 임계값에 따른 fpr,tpr 값
    print('샘플 임곗값별 fpr:' ,np.round(fprs[thr_index],3))
    print('샘플 임곗값별 tpr: ',np.round(tprs[thr_index],3))
    샘플 추출을 위한 임곗값 배열의 index: [ 1  6 11 16 21 26 31 36 41 46]
    샘플 index로 추출한 임곗값 :  [0.97 0.69 0.63 0.57 0.38 0.29 0.16 0.11 0.11 0.07]
    샘플 임곗값별 fpr: [0.    0.045 0.091 0.109 0.227 0.264 0.473 0.673 0.791 0.918]
    샘플 임곗값별 tpr:  [0.014 0.551 0.594 0.739 0.812 0.87  0.913 0.928 0.942 0.971]
    def roc_curve_plot(y_test,pred_proba_c1):
      #임곗값에 따른 fpr,tpr 값을 반환 받음
      fprs,tprs,thresholds=roc_curve(y_test,pred_proba_c1)
    
      #roc 곡선을 그래프 곡선으로 그림
      plt.plot(fprs,tprs,label='ROC')
    
      #가운데 대각선 직선을 그림.
      plt.plot([0,1],[0,1],'k--',label='Random')
    
      #FPR X축의 Scale을 0.1 단위로 변경, X,Y 축 명 설정 등
      start,end=plt.xlim()
      plt.xticks(np.round(np.arange(start,end,0.1),2))
      plt.xlim(0,1)
      plt.ylim(0,1)
      plt.xlabel('FPR(1-sensitivity)')
      plt.ylabel('TPR(Recall)')
      plt.legend()
    
    roc_curve_plot(y_test,pred_proba[:,1])

    ROC 곡선 자체는 FPR과 TPR의 변화 값을 보는 데 이용하며 분류의 성능 지표로 사용되는 것은 ROC 곡선 면적에 기반한 AUC 값으로 결정한다.

    AUC(Auc Under Curve)값은 ROC 곡선 밑의 면적을 구한 것으로서 일반적으로 1에 가까울수록 좋은 수치이다. AUC 수치가 커지려면 FPR이 작은 상태에서 얼마나 큰 TPR을 얻을 수 있느냐가 관건이다.

     

    04. 분류 - 결정 트리, 앙상블 학습

    1. 분류(Classification)의 개요

    지도학습은 레이블, 즉 명시적인 정답이 있는 데이터가 주어진 상태에서 학습하는 머신러닝 방식이다. 지도학습의 대표적인 유형인 분류는 학습 데이터로 주어진 데이터의 피처와 레이블값을 머신러닝 알고리즘으로 학습해 모델을 생성하고, 이렇게 생성된 모델에 새로운 데이터 값이 주어졌을 때 미지의 레이블 값을 예측하는 것이다. 즉, 기존 데이터가 어떤 레이블에 속하는지 패턴을 알고리즘으로 인지한 뒤 새롭게 관측된 데이터에 대한 레이블을 판별하는 것이다.

     

    • 베이즈 통계와 생성 모델에 기반한 나이브 베이즈(Naive Bayes)
    • 독립변수와 종속변수의 선형 관계성에 기반한 로지스틱 회귀(Logistic Regression)
    • 데이터 균일도에 따른 규칙 기반의 결정트리(Decision Tree)
    • 개별 클래스 간의 최대 분류 마진을 효과적으로 찾아주는 서포트 벡터 머신(Support Vector Machine)
    • 근접 거리를 기준으로 하는 최소 근접(Nearest Neighbor) 알고리즘
    • 심층 연결 기반의 신경망(Neural Network)
    • 서로 다른(또는 같은) 머신러닝 알고리즘을 결합한 앙상블(Ensemble)

    앙상블은 서로 다른 또는 같은 알고리즘을 단순히 결합한 형태도 있으나 일반적으로 배깅과 부스팅 방식으로 나뉜다. 배깅 방식의 대표인 랜덤 포레스트는 뛰어난 예측 성능, 상대적으로 빠른 수행시간, 유연성 등으로 애용하는 사람이 많다. 하지마 근래의 앙상블 방법은 부스팅 방식으로 지속해서 발전하고 있다. 그래디언트 부스팅의 경우 뛰어난 예측 성능을 가지고 있지만 수행 시간이 너무 오래 걸리는 단점으로 인해 최적화 모델 튜닝이 어려웠다. 그러나 기존 그래디언트 부스팅의 예측 성능을 한 단계 발전시키면서도 수행 시간을 단축시킨 알고리즘이 계속 등장하면서 정형 데이터의 분류 영역에서 가장 활용도가 높은 알고리즘으로 자리잡았다.

     

    2. 결정트리

    데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리 기반의 분류 규칙을 만드는 것이다. 일반적으로 규칙을 가장 쉽게 표현하는 방법은 if/else 기반으로 나타내는 것이다. 데이터의 어떤 기준을 바탕으로 규칙을 만들어야 가장 효율적인 분류가 될 것인가가 알고리즘의 성능을 크게 좌우한다.

    규칙 노드로 표시된 노드는 규칙 조건이 되는 거고, 리프 노드로 표시된 노드는 결정된 클래스 값이다. 새로운 규칙 조건마다 서브 트리가 생성된다. 데이터 세트에 피처가 있고 이러한 피처가 결합해 규칙 조건을 만들 떄마다 규칙 노드가 만들어진다. 하지만 많은 규칙이 있다는 것은 곧 분류를 결정하는 방식이 더욱 복잡해진다는 얘기이고, 이는 곧 과적합으로 이어지기 쉽다. 즉 트리의 깊이가 깊어질수록 결정트리의 예측 성능이 저하될 가능성이 높다.

    -> 데이터를 분류할 때 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록 결정 노드의 규칙이 정해져야 한다. 이를 위해서는 어떻게 트리를 분할할 것인가가 중요하다.

     

    결정노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙조건을 만든다.

    C, B, A 순으로

    정보 균일도가 데이터 세트로 쪼개질 수 있도록 조건을 찾아 서브 데이터 세트를 만들고 다시 이 서브 데이터 세트에서 균일도가 높은 자식 데이터 세트를 쪼개는 방식을 자식 트리로 내려가며 반복하는 방식으로 데이터값을 예측하게 된다.

     

    정보이득

    엔트로피 : 데이터 집합의 혼잡도.
    서로 다른 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮다. 
    
    정보 이득 지수 : 1 - 엔트로피지수
    
    결정트리는 이 정보 이득 지수로 분할 기준을 정한다. 즉 정보 이득이 높은 속성을 기준으로 분할한다.

     

    지니계수

    지니계수 : 불평등 지수를 나타낼 때 사용하는 계수
    
    0이 가장 평등하고 1로 갈수록 불평등하다. 머신러닝에 적용될 때는 지니 계수가 낮을 수록 데이터의 균일도가 높은 것으로 해석해 지니계수가 낮은 속성을 기준으로 분할한다.

     

    결정 트리 모델의 특징

     

    장점

    • 정보의 균일도가 기반이기 때문에 알고리즘이 쉽고 직관적
    • 정보의 균일도만 신경쓰면 되므로 특별한 경우를 제외하고 각 피처의 스케일링과 정규화 같은 전처리가 필요없다.

    단점

    • 과적합으로 정확도가 떨어짐.
    • 좋은 모형을 만들기 위한 많은 데이터가 필요함
    • 데이터의 변화에 민감하다
    • 선형 구조형 데이터 예측 시 더 복잡하다

    -> 트리의 크기를 사전에 제한하는 것이 오히려 성능 튜닝에 큰 도움이 된다. 

     

    결정 트리 파라미터

     

    사이킷런은 결정 트리 알고리즘을 구현한 DecisionTreeClassifier와 DecisionTreeRegressor 클래스를 제공한다.

     

    DecisionTreeClassifier는 분류를 위한 클래스. DecisionTreeRegressor는 회귀를 위한 클래스.

    사이킷런의 결정 트리 구현은 CART(Classification and Regression trees) 알고리즘 기반이다.

     

    파라미터명 설명
    min_samples_split - 노드를 분할하기 위한 최소한의 샘플 데이터 수로 과적합을 제어하는 데 사용.
    - 디폴트는 2이고 작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성 증가 
    -과적합을 제어. 1로 설정할 경우 분할되는 노드가 많아져서 과적합 가능성 증가
    min_samples_leaf - 말단 노드가 되기 위한 최소한의 샘플 데이터 수 - Min_samples_split와 유사하게 과적합 제어 용도. 그러나 비대칭적 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이 경우는 작게 설정 필요.
    max_features - 최적의 분할을 위해 고려할 최대 피처 개수. 디폴트는 None으로 데이터 세트의 모든 피처를 사용해 분할 수행. - int 형으로 지정하면 대상 피처의 개수. float 형으로 지정하면 전체 피처 중 대상 피처의 퍼센트임. - sqrt 는 전체 피처 중 sqrt. 즉 root(전체 피처 개수)만큼 선정 - auto로 지정하면 sqrt와 동일 - log는 전체 피처 중 log2(전체 피처 개수) 선정 - None은 전체 피처 선정
    max_depth - 트리의 최대 깊이를 규정 - 디폴트는 None. None으로 설정하면 완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 키우며 분할하거나 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이를 증가시킨다. - 깊이가 깊어지면 min_samples_split 설정대로 최대 분할하여 과적합할 수 있으므로 적절한 값으로 제어 필요.
    max_leaf_nodes 말단 노드의 최대 개수

     

    결정 트리 모델의 시각화

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    import warnings
    warnings.filterwarnings('ignore')
    
    #decisionTree Classifier 설정
    dt_clf=DecisionTreeClassifier(random_state=156)
    
    #붓꽃 데이터를 로딩하고 학습과 테스트 데이터 세트로 분리
    iris_data=load_iris()
    X_train,X_test,y_train,y_test=train_test_split(iris_data.data,iris_data.target,test_size=0.2,random_state=11)
    
    #DecisionTreeClassifier 학습
    dt_clf.fit(X_train,y_train)

     

    사이킷런의 트리 모듈은 Graphviz를 이용하기 위해 export_graphviz()함수를 제공한다. export_graphviz()에 인자로 학습이 완료된 estimator,output 파일 명 결정 클래스의 명칭, 피처의 명칭을 입력해주면 된다.

     

    from sklearn.tree import export_graphviz
    
    #export_graphviz()의 호출 결과로 out_file로 지정된 tree.dot 파일을 생성
    export_graphviz(dt_clf,out_file='tree.dot',class_names=iris_data.target_names,
                    feature_names=iris_data.feature_names,impurity=True,filled=True)
    
    import graphviz
    #위에서 생성된 tree.dot 파일을 graphiz가 읽어서 주피터 노트북상에서 시각화
    with open('tree.dot') as f:
      dot_graph=f.read()
      
    graphviz.Source(dot_graph)

    피처 중요도

     

    사이킷런은 결정 트리 알고리즈밍 학습을 통해 규칙을 정하는데 있어 피처의 중요한 역할 지표를 DecisionTreeClassifier 객체의 feature_importances_ 속성으로 제공한다.

     

    import seaborn as sns
    import numpy as np
    %matplotlib inline
    
    #feature importance 추출
    print("feature importances:\n{0}".format(np.round(dt_clf.feature_importances_,3)))
    
    #feature별 importance 매핑
    for name,value in zip(iris_data.feature_names,dt_clf.feature_importances_):
      print('{0} : {1:.3f}'.format(name,value))
    
    #feature importance를 columns 별로 시각화
    sns.barplot(x=dt_clf.feature_importances_,y=iris_data.feature_names)
    feature importances:
    [0.025 0.    0.555 0.42 ]
    sepal length (cm) : 0.025
    sepal width (cm) : 0.000
    petal length (cm) : 0.555
    petal width (cm) : 0.420


    [LG Aimers] 품질 및 신뢰성 공학 Part 3~Part 6

    Part 3. 스마트 품질 경영

     

    품질 4.0과 스마트 품질경영

    전사적 품질관리 : 우수한 제품 및 서비스 등을 고객에 제공하기 위해 품질에 중점을 두고 기업 전 부문의 참여를 통해 고객만족과 이익창출로 회사의 장기적인 성공에 목표를 두는 조직 전체의 체계적 노력

     

    소비자들의 요구사항은 증가하는 반면에, 많은 기업들은 여전히 전통적인 방식의 품질관리 및 경영기법에 머물러 있음

    이로 인해 기업들은 기존 방식들이 비교적 덜 효과적이라는 인식을 가지고 있는 것이 현실이다

     

    품질 4.0 : ICT 융합을 통해 사전에 수집, 분석된 빅데이터를 활용하여 선제적 불량 예지 및 보전 중심으로 진화된 품질경영시스템

    *기존의 품질경영시스템과 ICT, 빅데이터 기술이 융합

     

    스마트 공장

    -빠르고 역동적인 시장 변화에 대하여 능동적으로 대응할 수 있는 지능형 디지털 시스템

    -디지털 기술을 활용하여 사회와 개인, 기업을 변화시키는 총체적 활동

    -실시간 데이터를 이용하여 혁신적으로 공정이나 비즈니스 최적화를 도출해나가는 경영활동

     

    품질관리 개선 영역

    -예방적 품질관리 : 전 과정 상에서 제품의 품질을 보장하기 위해 설계된 프로세스

    -반응적 품질관리 : 제품 판매 이후의 품질 관리 즉, 수리 및 애프터서비스, 고장 처리 및 지속적인 개선 프로세스를 의미한다.

    -품질관리 문화 

    품질은 단순히 제조 과정에서 제품 품질을 의미하는 것이 아니라, 가치사슬의 첫 단계인 개념 정의부터 품질이 관리되어야 한다.

     

    품질 4.0

    품질경영 시스템의 Digital Transformation

    빅데이터 - 4V (크기/Volume, 다양성/Variety, 속도/Velocity, 정확성/Veracity)

     

    설명적 애널리틱스 : 기존의 잘 알려진 혹은 의심되는 상관관계를 모니터링하고 분석

    진단적 애널리틱스: 과거의 축적된 데이터를 바탕으로 인과관계를 찾아내어 이벤트를 밝혀내는 기법

    예측적 애널리틱스 : 통계학적 모델들을 활용하여 미래에 어떠한 사건이 어느 정도의 확률로 발생할지를 예측하는 분석기법

    처방적 애널리틱스 : 어떠한 의사결정을 내려야 하는지를 알려주는 분석기법

     

    연결성

    -IoT를 기반으로 실시간으로 작업자, 제품, 설비 및 프로세스들의 연결성 보장 가능

    -작업자들과의 연결성 보장 : 스마트 웨어러블 기기 등 활용 -> 작업효율 등 안전 향상 기여

    -제품들과의 연결성 보장 : 예지보전에 필요한 다양한 설비 센싱 정보 수집이 가능

     

    협업

    -품질 이슈는 기업 내 여러 부서에 걸쳐있음

    -소셜 미디어의 성장은 기업 내 혹은 기업 간, 더 나아가 고객과의 협업 환경을 급속도로 변경

    -소셜 미디어를 통해 고객의 목소리를 반영하려고 하고 있음

     

    빅데이터를 활용한 스마트 품질경영

    -데이터의 규모, 속도, 정확성 및 다양성 등의 특성을 갖는데 이 중에서도 다양성이 매우 중요

    -기업의 빅데이터 분석의 시작은 데이터의 확보에 있으며, 새로운 공정의 품질상태를 파악하기 위해서는 특히 가공하는 데 사용한 적이 없는 기계와 시스템으로부터 확보된 원천 데이터가 필요

     

    스마트 품질경영 혁신방안

    1) 실시간 커뮤니티 피드백을 제공하는 방안

    *소셜미디어 레이더 : 고객 시장에서 의미 있는 패턴뿐만 아니라 정서 분석을 바탕으로 적절한 조치 방안을 모색

    2) 원격진단 및 유지보수

    -온라인으로 장비 상태를 모니터링하고, 가능하면 예방적 유지보수를 원격으로 수행하고 필요한 경우에 서비스 담당자를 파견

    *원격 유지 보수 솔루션

    3) 고도화된 공급망 품질관리

    -공급업체 성과지표와 공장 및 공급망 수준의 사고 데이터 등 주요 데이터들을 적극적으로 취득하는 것이 중요

    -지능형 알고리즘이나 애널리틱스는 사례기반 추론뿐만 아니라 경험적 방법을 활용하여 지속적으로 데이터를 분석

     

    공정 모니터링 시스템의 품질 예측 및 불량 요인 분석 알고리즘 개발

    1) 공정 변수와 품질 계측치의 상관관계를 파악할 수 있는 지표 도출

    -군집분석, 변수 선택법, 기여도 분석

    2) 공정 변수를 통하여 품질 계측치를 예측할 수 있는 가상 계측 시스템 구축

    -회귀분석(R^2, RMESP:평균 예측 오차)

    -주성분 회귀 및 부분 최소 제곱 회귀

    3)

     

    Part 4. 신뢰성 개념과 중요성

     

    신뢰성의 중요성

    -제품 라이클 사이클 관점의 Total Cost 관리가 필요하다

    -개발단계에서 시장 품질은 예측 가능하고 Control 되어야 한다

     

    신뢰성의 정의 

    주어진 작동 환경에서 주어진 시간 동안 시스템이 고유의 기능을 수행할 확률

     

    품질과 신뢰성은 어떻게 다른가?

     

    기존의 기업은 품질 개선에만 노력하고, 신뢰성에 대해서는 크게 노력하지 않았다.

     

    신뢰성 분석의 필요성

    패러다임의 변화

    시스템이 어떻게 작동하는가?

    시스템이 어떻게 하면 작동하지 않게 되는가?

    시스템의 고장을 피할 수 있는 방법은 무엇인가?

    시스템의 신뢰성을 높일 수 있는 방법은 무엇인가? 

     

    고장의 원인

    1. 취약한 설계

    2. 과부하

    3. 강도와 부하의 산포

    4. 마모

    5. 시간 메커니즘

    6. 잠재된 오작동

    7. 오류

     

    신뢰성 공학의 학문적 발전

    -1950년 후반~1960년대 : 확률분포로 고장 현상 모형화, 지수 분포에 관한 통계적 분석법 개발, NASA 창설 등

    -1970년대 : 원자력 발전소를 비롯한 복합시스템에 초점을 맞춘 신뢰도와 안전을 고려

    -1980년대 : 가속수명시험 방법론, 베이지안 방법론, 네트워크 신뢰성 분야가 활발히 연구됨

    -1990년대 : 가속 열화 시험방법과 분석법, 초가속수명시험, 강건설계, 부하 분석 등

    -2000년대 : 고장 물리 분야, 대형 시스템 분석을 위한 상용 소프트웨어의 개발

    -21세기의 특징 : 기계학습과 강화 학습 등, 긴급 회복성과 같은 일시적 돌발 현상에서의 대응능력에 관한 지표들이 정의되고 분석

     

    개요

    -시스템 부품 고장

    신뢰성 문제를 체계적으로 과학적으로 취급하기 위해서는 시스템의 고장을 수학적으로 설명할 수 있어야 함

    -고장

    -불확실성을 내포하기 때문에 확률/통계 기반으로 모형 추론

    -수명분포

     

    신뢰성 척도

    -신뢰도

    -순간 고장률

    -평균 고장률

    -평균 고장시간

    -평균 고장 간격

    -보전도

    -가용도

     

    신뢰성 데이터

    -수명 데이터 : 의도된 기능을 제대로 수행하고 있거나 고장인지의 여부로 판정

    -성능 데이터 : 시간 경과에 따른 제품의 성능을 측정

    -이외에도 완전 데이터, 정시 중단 데이터, 장수 중단 데이터, 구간 데이터 등이 있음

     

     

    Part 5. 신뢰성 분포와 신뢰성 척도

     

    지수 분포

    -확률밀도함수 및 누적분포함수

    -고장률 함수 

    -평균 수명 : 고장률 함수의 역수

    -메디안 수명

    -무기억성 : 이산형에서 기하분포가 무기역성을 갖는 것처럼 연속형 분포에서는 지수분포가 무기역성을 가짐

     

    감마 분포

    와이블 분포

    -신뢰성 데이터 분석에 가장 널리 사용되는 분포

    -형상모수에 의해서 분포의 형태가 달라지고 다른 분포로 변환됨

    -최약 연결

     

    정규 분포

    -평균이 0이고 분산이 1인 정규분포를 표준정규분포라고 한다.

    -정규분포를 따르는 n개의 표본으로부터 얻어진 평균의 분포는 감마^2/n의 정규 분포를 따른다.

    -n이 충분히 크면 표본 평균은 근사적으로 정규 분포를 따른다.

     

    대수정규 분포

    -고장데이터 등을 모형화하는 경험적 모형으로 폭넓게 사용됨

    -단순히 대수만 취하면 되므로, 정규분포의 다양한 성질들을 사용할 수 있음

     

    이산형 신뢰성 분포

    베르누이와 이항 분포

    결과값이 성공과 실패로 나누어지는 실험을 수행했다고 가정하자

    포아송 분포

    -일정한 단위 시간 동안 발생하는 사건의 수에 대해 관심이 있을 때, 이 확률변수를 어떻게 표현할 수 있을까?

     

    Part 6. ICT 기반 예지보전

     

    시스템 열화

    -시스템은 사용시간/빈도의 증가에 따라 열화

    -특정 운용조건에서 요구된 기능을 수행하지 못하는 경우, 시스템 고장 발생

    -고장난 부품으로 인해 전체 시스템 작동 중단, 시스템 운용자의 안전까지 위험

    ex) 체르노빌 원자력 발전소 사고, 후쿠시마 원전 사고, 중국 고속열차 부실로 인한 충돌사고

    -일반적으로 고장 후 교체 비용이 예방보전 비율보다 훨씬 높음

     

    보전의 목적

    -안전하고 경제적으로 운전될 수 있는 조건으로 장비유지

    -비용검토와 관련된 문제의 인식

    -Safety risk

     

    보전도

    -사후보전 : 점검 및 정기교환을 전혀 하지 않고 장비 고장 후 수리

    -예방보전은 시간과 상태를 기준으로 하여 TBM과 CBM으로 나뉜다.

    -예지보전은 발전된 센서, ICT 기반의 의사결정 시스템을 바탕으로 전개되어야 함

    보전 비용 비교

    예지보전의 역할

    -실질적인 시스템의 운용 및 열화 상태에 따라 고장발생 시점을 사전에 예측, 선행보전활동을 수행하는 것을 지향

    -예지보전의 핵심 요소는 설비의 열화를 특정, 분석하여 설비의 잔여수명을 정확하게 예측하며 고장이 일어나기 바로 직전에 유지보수를 실시함으로써 시간 기준 유지보수 방식의 유지보수 주기보다 간격을 확장, 유지보수비용 및 인력을 최소화

    -사이버물리시스템에서는 IoT를 통한 지능형 생산뿐 아니라 지능형 모니터링을 통해 설비상태를 미리 예지하여 선행적으로 유지보수를 실시

     

    CBM의 구체적 추진방법

    1) 목적은 무엇인가

    2) 유닛 단위인가, 부품 단위인가

    3) 이들의 성능열화상태는 알 수 있는가

    4) 파라미터로서 생각할 수 있는 것은 무엇인가

    5) 파라미터의 측정 방법은 어떤 것인가

    6) 정기적으로 장비 측정

    7) 파라미터와 기능 열화간의 상관관계는 존재하는가

    8) 잠정 기준의 설정

    9) 현물의 분해 조사

    10) 상관 관계를 입증

    11) 경향 관리 시스템 구축

    CBM의 구체적 추진방법

    1) 목적은 무엇인가

    2) 유닛 단위인가, 부품 단위인가

    3) 이들의 성능열화상

     

    상태기반보전 프로세스

    복합 시스템 - 데이터 획득 - 데이터 처리 - 상태 감시 - 건강 평가 - 예측 - 자동의사추론 - 휴먼 <-> 컴퓨터

     

    신호전처리 프로세스

    -시스템에서 추출되는 신호 데이터는 잡음을 포함하는 경우가 대부분이며, 원신호만으로 시스템의 이상여부를 판단하기 힘든 특징

    -신로 데이터로부터 잡음을 제거하고 유의미한 특성을 추출하기 위해서 가장 널리 사용되는 신호 처리 기법

     

    특징추출 프로세스

    -허스트 지수는 각 수준에서 산출된 웨이블릿 계수의 분산에 대한 기울기이며, 신호 데이터의 특정 구간에 대하여 웨이블릿 변환을 실시한 후 웨이블릿 계수의 분산에 대하여 회귀분석을 실시, 허스트 지수를 추정 가능

    -허스트 지수는 특정 구간에서 신호 데이터의 특징을 대표하며, 고장 진단 및 예지를 하기 위한 기초 데이터로 활용될 수 있음

     

    이상진단 및 예측 프로세스

    -신호 데이터로부터 웨이블릿 변환 후 허스트 지수 또는 주성분분석을 통하여 특징을 추출하고, 추출된 특징에 대하여 다양한 통계적 방법을 사용하여 고장 진단 및 예지를 할 수 있음

    -관리도는 제조공정에서 이상원인이 발생할 경우 원인 추적 및 조치를 통하여 제품의 불량을 사전에 억제할 수 있는 방법론

     

    최적의사결정시스템 구출 프로세스

    -언제 어떠한 방법으로 설비에 대한 보전 업무를 수행하느냐에 따라, 보전 만족도 및 보전 비용이 변화

    Case study - CBM (PSM Lab)


    2회차 회고록 (2022.07.11)

     

    오늘은 지난 시간에 비교한다면 거의 두 배 정도의 학습량을 공부한 것 같다. 품질 및 신뢰성 공학 강의 모듈이 종료되어서 뿌듯하고, 본 전공에서는 배우기 어려운 분야의 내용을 공부할 수 있어서 의미있었다. 홈페이지 설명을 잘 읽어보니 AI 기반의 지식 전달보다도 곧 있을 해커톤 주제의 이해를 돕기 위해서 해당 커리큘럼이 구성되어 있다고 하였다. 강의를 잘 듣고 해커톤에서도 좋은 결과를 얻을 수 있으면 좋겠다. 머신러닝 공부는 하면 할수록 이론보다는 실습과 병행하여 진행하는 것이 훨씬 효과적이라는 사실을 느낀다. 이전에도 얕게는 알고 있었지만 이번 기회를 통해 깊고 넓게 학습하고 실제 데이터를 가공하는 경험을 해볼 수 있을 것 같아서 뿌듯하다. 남은 4회차에도 잘해내고 싶다!

    댓글

Designed by Tistory.