본문 바로가기
데이터 분석

[패스트 캠퍼스 수강 후기] 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online 22일차

by HIMMEL95 2021. 4. 26.
  • 수강한 강의
    : Ch04.sklearn-분류-12.정확도 (accuracy)의 함정 / Ch04.sklearn-분류-13. 오차행렬 (confusion matrix) / Ch04.sklearn-분류-14. 정밀도 (precision)와 재현율 (recall) / Ch04.sklearn-분류-15. f1 score / Ch05.sklearn-회귀-01. 회귀(Regression) / Ch05.sklearn-회귀-02. 보스턴 주택 가격예측 데이터 셋

오늘은 sklearn의 분류 중에서 정확도의 함정, 오차행렬, 정밀도와 재현율, f1 score 그리고 회귀 중에서 회귀에 관한 짧은 설명과 보스턴 주택 가격예측 데이터셋에 관하여 작성해보겠습니다.

  • Ch04.sklearn-분류-12.정확도 (accuracy)의 함정

    우선 데이터 예측의 정확도를 알기 위해서 먼저 예측을 할 데이터셋을 먼저 로드 한다. 여기서 우리가 사용할 데이터 셋은 유방암 환자 데이터셋을 사용할 예정이다.

          from sklearn.datasets import load_breast_cancer
      from sklearn.model_selection import train_test_split
      import numpy as np

    다음과 같이 from sklearn.datasets import load_breast_cancer이라고 작성을 하게 되면 유방암 환자 데이터 셋을 로드해 올 수 있다.

          cancer = load_breast_cancer()
      print(cancer['DESCR'])
      .. _breast_cancer_dataset:
    
      Breast cancer wisconsin (diagnostic) dataset
      --------------------------------------------
    
      **Data Set Characteristics:**
    
          :Number of Instances: 569
    
          :Number of Attributes: 30 numeric, predictive attributes and the class
    
          :Attribute Information:
              - radius (mean of distances from center to points on the perimeter)
              - texture (standard deviation of gray-scale values)
              - perimeter
              - area
              - smoothness (local variation in radius lengths)
              - compactness (perimeter^2 / area - 1.0)
              - concavity (severity of concave portions of the contour)
              - concave points (number of concave portions of the contour)
              - symmetry 
              - fractal dimension ("coastline approximation" - 1)
    
              The mean, standard error, and "worst" or largest (mean of the three
              largest values) of these features were computed for each image,
              resulting in 30 features.  For instance, field 3 is Mean Radius, field
              13 is Radius SE, field 23 is Worst Radius.
    
              - class:
                      - WDBC-Malignant
                      - WDBC-Benign
    
          :Summary Statistics:
    
          ===================================== ====== ======
                                                 Min    Max
          ===================================== ====== ======
          radius (mean):                        6.981  28.11
          texture (mean):                       9.71   39.28
          perimeter (mean):                     43.79  188.5
          area (mean):                          143.5  2501.0
          smoothness (mean):                    0.053  0.163
          compactness (mean):                   0.019  0.345
          concavity (mean):                     0.0    0.427
          concave points (mean):                0.0    0.201
          symmetry (mean):                      0.106  0.304
          fractal dimension (mean):             0.05   0.097
          radius (standard error):              0.112  2.873
          texture (standard error):             0.36   4.885
          perimeter (standard error):           0.757  21.98
          area (standard error):                6.802  542.2
          smoothness (standard error):          0.002  0.031
          compactness (standard error):         0.002  0.135
          concavity (standard error):           0.0    0.396
          concave points (standard error):      0.0    0.053
          symmetry (standard error):            0.008  0.079
          fractal dimension (standard error):   0.001  0.03
          radius (worst):                       7.93   36.04
          texture (worst):                      12.02  49.54
          perimeter (worst):                    50.41  251.2
          area (worst):                         185.2  4254.0
          smoothness (worst):                   0.071  0.223
          compactness (worst):                  0.027  1.058
          concavity (worst):                    0.0    1.252
          concave points (worst):               0.0    0.291
          symmetry (worst):                     0.156  0.664
          fractal dimension (worst):            0.055  0.208
          ===================================== ====== ======
    
          :Missing Attribute Values: None
    
          :Class Distribution: 212 - Malignant, 357 - Benign
    
          :Creator:  Dr. William H. Wolberg, W. Nick Street, Olvi L. Mangasarian
    
          :Donor: Nick Street
    
          :Date: November, 1995
    
      This is a copy of UCI ML Breast Cancer Wisconsin (Diagnostic) datasets.
      https://goo.gl/U2Uwz2
    
      Features are computed from a digitized image of a fine needle
      aspirate (FNA) of a breast mass.  They describe
      characteristics of the cell nuclei present in the image.
    
      Separating plane described above was obtained using
      Multisurface Method-Tree (MSM-T) [K. P. Bennett, "Decision Tree
      Construction Via Linear Programming." Proceedings of the 4th
      Midwest Artificial Intelligence and Cognitive Science Society,
      pp. 97-101, 1992], a classification method which uses linear
      programming to construct a decision tree.  Relevant features
      were selected using an exhaustive search in the space of 1-4
      features and 1-3 separating planes.
    
      The actual linear program used to obtain the separating plane
      in the 3-dimensional space is that described in:
      [K. P. Bennett and O. L. Mangasarian: "Robust Linear
      Programming Discrimination of Two Linearly Inseparable Sets",
      Optimization Methods and Software 1, 1992, 23-34].
    
      This database is also available through the UW CS ftp server:
    
      ftp ftp.cs.wisc.edu
      cd math-prog/cpo-dataset/machine-learn/WDBC/
    
      .. topic:: References
    
         - W.N. Street, W.H. Wolberg and O.L. Mangasarian. Nuclear feature extraction 
           for breast tumor diagnosis. IS&T/SPIE 1993 International Symposium on 
           Electronic Imaging: Science and Technology, volume 1905, pages 861-870,
           San Jose, CA, 1993.
         - O.L. Mangasarian, W.N. Street and W.H. Wolberg. Breast cancer diagnosis and 
           prognosis via linear programming. Operations Research, 43(4), pages 570-577, 
           July-August 1995.
         - W.H. Wolberg, W.N. Street, and O.L. Mangasarian. Machine learning techniques
           to diagnose breast cancer from fine-needle aspirates. Cancer Letters 77 (1994) 
           163-171.

    이렇게 데이터 셋을 로드한 다음에 내가 정한 변수에 load_breast_cancer() 을 지정해준다. 그러고 내가 정한 변수에 담겨있는 데이터의 정보를 보기 위해서 다음과 같은 코드를 입력하여 데이터의 정보를 확인해 본다.

    데이터셋 정보를 확인하게 되면 WDBC-Malignant와 WDBC-Benign라는 클래스 정보가 있다. WDBC-Malignant는 위스콘신 주 남부에 있는 위스콘신 대학 병원에서 제공해준 데이터에서 약성 종양에 관한 클래스이고, WDBC-Benign는 데이터셋에서 양성 종양에 관한 클래스를 의미한다. 전체 데이터의 양은 569개이고, 클래스 분배량은 약성이 212이고, 악성은 357의 데이터가 각각 분배되어 있다.

          df = pd.DataFrame(data=data, columns=feature_names)
      df['target'] = cancer['target']    
      df.head()

    데이터 셋의 정보를 확인한 다음에 cancer이라는 변수에 저장된 데이터셋에서 data에 해당하는 값은 data라는 변수에 저장하고, target은 target 변수에, feature_names는 feature_names변수에 저장한다. 그러고 각 저장된 정보를 데이터 프레임으로 작성해준다. 그러고 만들어진 데이터 프레임에 target이라는 컬럼을 생성해준 다음에 cancer데이터 셋의 target 데이터를 target 컬럼에 저장해준다. 이렇게 만들어진 데이터가 제대로 만들어 졌는지 df.head()를 작성하여 데이터 프레임을 확인해 본다.

          pos = df.loc[df['target']==1]
      neg = df.loc[df['target']==0]
      pos

    target값이 1에 해당하는 것을 pos 변수에 지정해주고, target값이 0에 해당하는 것은 neg 변수에 저장을 해준다. 그러고 pos 변수를 출력해본다. 그러면 target 값이 1인 데이터 357개로 형성된 row 데이터가 작성된다.

    그리고 건강검진 할 때 양성환자의 수 보다 악성환자의 수가 비교적 수가 적기 때문에 좀 극단적으로 표현하기 위해서 다음과 같이 데이터를 양성환자 357개 + 악성환자 5개의 샘플 데이터를 설정 해본다.

          sample = pd.concat([pos, neg[:5]] ,sort=True)
      x_train, x_test, y_train, y_test = train_test_split(sample.drop('target', 1), sample['target'], random_state=42)

    만들어진 샘플 데이터를 토대로 x_train, x_test, y_train, y_test를 설정한다. 여기서 stratify 옵션은 빼고, random_state값을 42로 설정해준다.

    그러고 다음과 같이 모델을 정의하고, 학습을 시킨다.

          model = LogisticRegression()
      model.fit(x_train, y_train)
      pred = model.predict(x_test)

    학습 시킨 모델의 예측값을 확인해본다.

      (pred == y_test).mean()

    0.978021978021978

    이번에는 my_prediction 이라는 변수에 모든 데이터 값을 1로 해서 모두 다 양성환자로 해서 예측을 해보도록 한다. 예측을 해본 결과값은 다음과 같이 나오게 된다.

          my_prediction = np.ones(shape=y_test.shape)
      (my_prediction == y_test).mean()

    0.989010989010989

    데이터 값을 모두 양성으로 변경한 예측값이 기존 데이터 예측 값보다 높게 나온 것을 확인할 수 있다.

    (기본 예측값) 0.978021978021978 < (모두 양성으로 변경된 예측값) 0.989010989010989

    이렇게 정확도만 놓고 본다면, 무조건 양성 환자로 예측하는 분류기가 성능이 좋다. 하지만 의사가 무조건 양성 환자로 예측해서 예측율 98.9%로 말하는 의사가 자질이 좋은 의사일지 의문이 든다.

    이러하듯이 정확도(accuracy)만 보고 분류기의 성능을 판별하는 것은 위와 같은 오류 에 빠질 수 있다. 그래서 이를 보완하고 생겨난 지표들이 있다.

  • Ch04.sklearn-분류-13. 오차행렬 (confusion matrix)

    오차 행렬은 test data set에 대한 분류기 (classifier) 즉, 분류의 성능을 평가하는 행렬이다.

    오차 행렬의 행은 실제 클래스, 열은 예측한 클래스를 나타낸다.

    사용 방법은 우선 sklearn.metrics 에서 confusion_matrix를 먼저 import 해준다. 그리고 confusion_matrix() 안에 y_test와 pred 변수를 입력해서 결과를 확인해본다.

          from sklearn.metrics import confusion_matrix
      confusion_matrix(y_test, pred)
      array([[ 1,  0],
          [ 2, 88]])

    confusion_matrix() 을 통해서 나온 결과는 오차 행렬의 모양을 나타낸 결과값이다.

    그리고 다음 결과값을 토대로 heatmap을 작성해 본다. x 축은 'Predict', y 축은 'Actual' 이라는 이름을 부여해준다. 색상은 붉은색 계열로 설정하고 annot 옵션으로 히트맵에 숫자를 표시해준다.

          sns.heatmap(confusion_matrix(y_test, pred), annot=True, cmap='Reds', )
      plt.xlabel('Predict')
      plt.ylabel('Actual')
      plt.show()

    실제값이 0이고, 예측 값이 0으로 된 것이 1개, 실제값 1, 예측값 1인 것은 88개로 나온 것을 확인할 수 있다. 이렇게 같은 데이터 값으로 맞춰진 것들은 True가 붙게 되고, 그렇지 못한 것은 False가 붙게 된다. 이러한 것을 나타내는 사진이 아래에 나와 있다.

    row부분은 위에서 설명한 것처럼 실제 클래스이고, column부분은 예측 클래스이다.

  • Ch04.sklearn-분류-14. 정밀도 (precision)와 재현율 (recall)

    정밀도 : 예측을 Positive로 한 대상 중 예측과 실제 값이 Positive 일치한 데이터의 비율 TP / (FP + TP)

    재현율 : 실제 값이 Positive인 대상 주에 예측과 실제 값이 Positive로 일치한 데이터의 비율 TP / (FN + TP)

    정밀도와 재현율을 실행하기 위해서 다음과 같이 실행을 한다.

    정밀도를 실행하기 위해서는 precision_score(y_test, pred)코드를 작성하면 된다.

      precision_score(y_test, pred)

    1.0

    다음과 같이 코드를 작성하게 되면 위에서 본 오차 행렬의 값을 토대로 정밀도를 구하기 때문에 최종 결과 값이 1이라는 결과값이 나오게 된다. 이는 무조건 양성으로 판단하기 때문에 좋은 정밀도를 얻기 때문에 유용하지 않다.

    재현율을 실행하기 위해서는 recall_score(y_test, pred)코드를 작성하면 된다.

      recall_score(y_test, pred)

    0.9777777777777777

      88/90

    0.9777777777777777

    다음이 정확하게 감지한 양성 샘플의 비율이다. 그리고 이것은 민감도(sensitivity) 혹은 True Positive Rate(TPR) 이라고도 불리운다.

  • Ch04.sklearn-분류-15. f1 score
    f1 score : 정밀도와 재현율의 조화 평균을 나타내는 지표이다.

    다음 사진은 f1 score을 나타내는 식을 나타낸 사진이다. 그리고 다음을 활용하는 코드는 다음과 같다.

          from sklearn.metrics import f1_score
      f1_score(y_test, pred)

    0.9887640449438202

    이렇게 코드를 실행해서 나온 결과값은 다음과 같이 나오게 된다.

  • Ch05.sklearn-회귀-01. 회귀(Regression)

    회귀분석 : 변수들 간의 함수관계를 분석하는 방법 중의 하나로 독립변수가 종속변수에 미치는 영향력의 크기를 파악하고, 이를 통해 독립변수의 일정한 값에 대응하는 종속변수값을 예측하는 모형을 산출하는 방법이다.
    수치형 값을 예측 (Y의 값이 연속된 수치로 표현)
    예시

          - 주택 가격 예측
      - 매출액 예측

    scikit-learn 설명

    다음 URL은 scikit-learn에 관한 설명이 나와있다.

  • Ch05.sklearn-회귀-02. 보스턴 주택 가격예측 데이터 셋
    요번에는 회귀 분석을 활용하여 보스턴 주택 가격 예측을 해본다.
    우선 보스턴 주택 가격 예측 데이터 셋을 먼저 로드한다.

          import pandas as pd
      import numpy as np
      np.set_printoptions(suppress=True)
      from sklearn.datasets import load_boston

    여기서 np.set_printoptions(suppress=True) 이 부분은 출력의 정밀도를 설정하는 데 사용한다. 이것은 예시로 1e-5로 값이 나오는 것을 0.00001으로 출력되게 해주는 코드이다.

          data = load_boston()
      print(data['DESCR'])

    데이터 셋을 먼저 data 변수에 지정하고, 지정된 변수 data의 정보를 알아본다. 그리고 다음 데이터를 토대로 데이터 프레임을 작성한다.

          df = pd.DataFrame(data['data'], columns=data['feature_names'])
      df['MEDV'] = data['target']
      df.head()

    data['data']에는 X 데이터, data['feature_names']에는 컬럼 명이다.

    여기에 나온 컬럼에 대한 정보는 다음과 같다.
    속성 수 : 13

          - CRIM: 범죄율
      - ZN: 25,000 평방 피트 당 주거용 토지의 비율
      - INDUS: 비소매(non-retail) 비즈니스 면적 비율
      - CHAS: 찰스 강 더미 변수 (통로가 하천을 향하면 1; 그렇지 않으면 0)
      - NOX: 산화 질소 농도 (천만 분의 1)
      - RM:주거 당 평균 객실 수
      - AGE: 1940 년 이전에 건축된 자가 소유 점유 비율
      - DIS: 5 개의 보스턴 고용 센터까지의 가중 거리
      - RAD: 고속도로 접근성 지수
      - TAX: 10,000 달러 당 전체 가치 재산 세율
      - PTRATIO 도시 별 학생-교사 비율
      - B: 1000 (Bk-0.63) ^ 2 여기서 Bk는 도시 별 검정 비율입니다.
      - LSTAT: 인구의 낮은 지위
      - MEDV: 자가 주택의 중앙값 (1,000 달러 단위)

    다음의 데이터 프레임을 토대로 train과 test 데이터를 분할한다.

          from sklearn.model_selection import train_test_split
      x_train, x_test, y_train, y_test = train_test_split(df.drop('MEDV', 1), df['MEDV'])
      x_train.shape, x_test.shape

    ((379, 13), (127, 13))

    x데이터의 train과 test의 모양을 출력하면 다음과 같이 나오게 된다.

      x_train.head()

      y_train.head()
          170    17.4
      290    28.5
      339    19.0
      468    19.1
      266    30.7
      Name: MEDV, dtype: float64

    이렇게 해서 보스턴 주택 가격예측 데이터 셋의 train과 test 데이터를 만들어 보았습니다.

이렇게 sklearn의 분류 중에서 정확도의 함정, 오차행렬, 정밀도와 재현율, f1 score 그리고 회귀 중에서 회귀에 관한 짧은 설명과 보스턴 주택 가격예측 데이터셋에 관하여 작성해보았습니다. 부족한 부분에 관해서는 아래에 댓글에 작성을 해주시면 수정하도록 하겠습니다.

  • 데이터 분석

  • 홈페이지에서 강의 찾는 방법
    패스트 캠퍼스 -> 온라인 -> 올인원 패키지 -> [데이터 분석 강의 보러 가기] -> 직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online.

패스트 캠퍼스 - [데이터 사이언스] 직장인을 위한 파이썬 데이터 분석

직장인을 위한 파이썬 데이터 분석 올인원 패키지 Online

댓글