본문 바로가기
데이터 분석

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

by HIMMEL95 2021. 4. 27.
  • 수강한 강의
    : Ch05.sklearn-회귀-03.회귀 평가지표 (MSE, MAE, RMSE) / Ch05.sklearn-회귀-04.평가지표를 활용한 모델의 성능평가 / Ch05.sklearn-회귀-05.선형회귀모델 (Linear Regression) / Ch05.sklearn-회귀-06.규제에 대한 이해 (l1, l2 규제) / Ch05.sklearn-회귀-07.릿지 (Ridge)

오늘은 sklearn의 회귀 평가지표 (MSE, MAE, RMSE), 평가지표를 활용한 모델의 성능 평가, 선형회귀모델, 규제에 대한 이해, 릿지에 관한 내용을 작성해보겠습니다.

  • Ch05.sklearn-회귀-03.회귀 평가지표 (MSE, MAE, RMSE)
    회귀 평가지표에는 MSE, MAE, RMSE가 있다.
    MSE(Mean Squared Error)는 예측값과 실제값의 차이에 대한 제곱에 대하여 평균을 낸 값으로, 식은 다음과 같다.


    MAE(Mean Absolute Error)는 예측값과 실제값의 차이에 대해 절대값에 대하여 평균을 낸 값, 식은 다음과 같다.

    RMSE(Root Mean Squared Error)는 예측값과 실제값의 차이에 대한 제곱에 대하여 평균을 낸 뒤 루트를 씌운 값

    예시로 평가 지표를 만들어 보면, 코드는 다음과 같이 작성하면 된다.

          import numpy as np
      pred = np.array([3, 4, 5])
      actual = np.array([1, 2, 3])
    
      def my_mse(pred, actual):
          return ((pred - actual)**2).mean()
    
      my_mse(pred, actual)

    4.0

          def my_mae(pred, actual):
              return np.abs(pred - actual).mean()
      my_mae(pred, actual)

    2.0

          def my_rmse(pred, actual):
          return np.sqrt(my_mse(pred, actual))
      my_rmse(pred, actual)

    2.0

    여기서 pred는 예측값에 해당하는 것이고, actual은 실제값에 해당하는 것이다.

  • Ch05.sklearn-회귀-04.평가지표를 활용한 모델의 성능평가

    sklearn에는 위에 직접 작성한 MSE, MAE 평가지표가 sklearn.mertics에 만들어져 있기 때문에 import해서 사용하면 된다.

    다음은 위에서 직접 작성한 MSE, MAE를 sklearn의 평가지표를 활용해서 내가 직접 작성한 것과 비교를 해본다.

          from sklearn.metrics import mean_absolute_error, mean_squared_error
      my_mae(pred, actual), mean_absolute_error(pred, actual)

    (2.0, 2.0)

      my_mse(pred, actual), mean_squared_error(pred, actual)

    (4.0, 4.0)

    왼쪽의 결과가 우리가 직접 작성해서 출력한 결과값이고, 오른쪽은 sklearn에서 제공해주는 모듈로 실행한 결과값이다. 비교를 해본 결과 동일한 결과가 나온다. 따라서 직접 따로 만들지 않아도 sklearn.metrics에 있는 mean_absolute_error, mean_squared_error를 활용하면 된다.

    모델별 성능 확인을 위한 함수를 만든다.

      import matplotlib.pyplot as plt
      import seaborn as sns
    
      my_predictions = {}
    
      colors = ['r', 'c', 'm', 'y', 'k', 'khaki', 'teal', 'orchid', 'sandybrown',
            'greenyellow', 'dodgerblue', 'deepskyblue', 'rosybrown', 'firebrick',
            'deeppink', 'crimson', 'salmon', 'darkred', 'olivedrab', 'olive', 
            'forestgreen', 'royalblue', 'indigo', 'navy', 'mediumpurple', 'chocolate',
            'gold', 'darkorange', 'seagreen', 'turquoise', 'steelblue', 'slategray', 
            'peru', 'midnightblue', 'slateblue', 'dimgray', 'cadetblue', 'tomato'
           ]
    
      def plot_predictions(name_, pred, actual):
          ...
    
      def mse_eval(name_, pred, actual):
          ...
    
      def remove_model(name_):
          global my_predictions
          try:
            del my_predictions[name_]
          except KeyError:
              return False
          return True

    다음 함수를 만들기 위해서 my_predictions, plot_prediction(), mse_eval(), remove_model() 함수를 만들어 사용한다. 하지만 여기서 제공된 함수가 있는데 이것은 나중에 본인에 맞게 수정을 해서 사용을 해도 된다.

    함수의 전체적인 내용은 생략하겠습니다.

  • Ch05.sklearn-회귀-05.선형회귀모델 (Linear Regression)
    선형회귀모델 설명

    위 사이트 내용 중에서 parameter라는 값이 보인다. parameter 중 nomarlize의 기본값은 False로 지정 되어 있다. 나중에 이 값을 True로 변경해서 보게 되면 모델이 얼마나 개선이 되는지를 확인해 볼 수 있다.

    선형회귀모델을 import 하고 model이라는 변수에 넣어서 실행 시킨다. 여기서 n_jobs는 분석을 할 때 CPU코어 사용량이라고 보면 된다. 내가 지정한 숫자만큼의 코어를 사용하게 된다. 여기서 -1이라는 값을 주게 되면 CPU 코어의 모든 코어를 사용하겠다는 의미이다. 코어를 많이 쓸수록 빠르게 실행할 수 있다.

          from sklearn.linear_model import LinearRegression
      model = LinearRegression(n_jobs=-1)
      model.fit(x_train, y_train)

    LinearRegression(copy_X=True, fit_intercept=True, n_jobs=-1, normalize=False)

          pred = model.predict(x_test)
      mse_eval('LinearRegression', pred, y_test)

    여기서 .fit()은 학습을 시키는 코드이고, .predict(x_test)는 x_test 값을 예측하는 코드이다. 이렇게 작성을 마치고 난 다음에 위에서 만든 함수를 활용하여 실행을 시키면 다음과 같은 결과가 나오게 된다.

    위에는 실제값과 예측값에 대한 그래프가 나오게 되고 밑에는 MSE 오류에 대한 결과 값이 어느 정도 되는지에 관한 내용이 게이지와 퍼센트지로 나오게 된다.

  • Ch05.sklearn-회귀-06.규제에 대한 이해 (l1, l2 규제)

    Y = w * X + bias (Y = 예측값, X = input data, w = 가중치)

    규제 : 학습이 과대적합 되는 것을 방지하고자 일종의 penalty를 부여하는 것
    규제에는 2가지 종류의 규제가 있다. 그것은 L2, L1 규제가 있다.

    L2 규제 (L2 Regularization)

          - 각 가중치 제곱의 합에 규제 강도(Regularization Strength) λ를 곱한다.
      - λ를 크게 하면 가중치가 더 많이 감소되고(규제를 중요시함), λ를 작게 하면 가중치가 증가한다(규제를 중요시하지 않음).

    L1 규제 (L1 Regularization)

          - 가중치의 제곱의 합이 아닌**가중치의 합**을 더한 값에 규제 강도(Regularization Strength) λ를 곱하여 오차에 더한다.
      - 어떤 가중치(w)는 실제로 0이 된다. 즉, 모델에서 완전히 제외되는 특성이 생기는 것이다.

    L2 규제가 L1 규제에 비해 더 안정적이라 일반적으로 L2규제가 더 많이 사용된다.
    이러한 이유는 L1 규제 설명을 보게 되면, "어떤 가중치(w)는 실제로 0이 된다"는 내용이 있는데 이러한 내용으로 인해서 다음과 같은 결과가 나오게 된다.

  • Ch05.sklearn-회귀-07.릿지 (Ridge)

    이제 릿지, L2 규제를 import 해보겠습니다.

          from sklearn.linear_model import Ridge
    
      # 값이 커질 수록 큰 규제입니다.
      alphas = [100, 10, 1, 0.1, 0.01, 0.001, 0.0001]
    
      for alpha in alphas:
          ridge = Ridge(alpha=alpha)
          ridge.fit(x_train, y_train)
          pred = ridge.predict(x_test)
          mse_eval('Ridge(alpha={})'.format(alpha), pred, y_test)

    위 코드를 실행시키면 다음과 같은 그래프와 MSE 오류 수치가 각 alpha 값에 비교하면서 계속 출력되는 것을 확인할 수 있다.
    다음 사진에서 중요하게 볼 부분은 제일 마지막 부분이다. 그 윗부분들은 계속해서 같은 결과들이 연속해서 나오고, 맨 마지막에 최종적으로 결과값이 나오기 때문에 마지막 부분의 사진만 보면 된다. 가중치 값이 작아질 수록 오류값이 좀 더 낮게 나오는 것을 확인할 수 있다.

    가중치 별 결과값을 확인했으면 x_train의 컬럼명을 확인하고 릿지의 속성값을 출력한다.

      x_train.columns
      Index(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='object')

    다음이 x_train의 컬럼명을 출력한 것이다.

      ridge.coef_
      array([ -0.09565623,   0.05167497,   0.03285789,   2.9453933 ,
         -19.81037671,   3.84040632,   0.00216258,  -1.55629344,
           0.30843165,  -0.01189685,  -0.98660785,   0.00883429,
          -0.52826634])

    다음이 릿지의 각 속성값을 출력한 것이다.

    그리고 이제 컬럼명과 릿지의 속성값을 합쳐서 그래프로 출력해보겠습니다.

          def plot_coef(columns, coef):
          coef_df = pd.DataFrame(list(zip(columns, coef)))
          coef_df.columns=['feature', 'coef']
          coef_df = coef_df.sort_values('coef', ascending=False).reset_index(drop=True)
    
          fig, ax = plt.subplots(figsize=(9, 7))
          ax.barh(np.arange(len(coef_df)), coef_df['coef'])
          idx = np.arange(len(coef_df))
          ax.set_yticks(idx)
          ax.set_yticklabels(coef_df['feature'])
          fig.tight_layout()
          plt.show()
      plot_coef(x_train.columns, ridge.coef_)

    alpha 값에 따른 coef의 차이를 그래프로 나타낸 것이다.

          ridge_100 = Ridge(alpha=100)
      ridge_100.fit(x_train, y_train)
      ridge_pred_100 = ridge_100.predict(x_test)
    
      ridge_001 = Ridge(alpha=0.001)
      ridge_001.fit(x_train, y_train)
      ridge_pred_001 = ridge_001.predict(x_test)
      plot_coef(x_train.columns, ridge_100.coef_)


    다음 그래프는 alpha 값이 100에 해당 할 때 나오게 되는 그래프이다.

      plot_coef(x_train.columns, ridge_001.coef_)


    다음 그래프는 alpha 값을 0.001로 했을 때 나오게 되는 그래프이다.

    두 그래프를 보게 되면 alpha값에 따라 그래프가 다르게 나오는 것을 확인할 수 있다.

이렇게 sklearn의 회귀 평가지표 (MSE, MAE, RMSE), 평가지표를 활용한 모델의 성능 평가, 선형회귀모델, 규제에 대한 이해, 릿지에 관한 내용을 작성해보았습니다. 잘못된 부분이 있는 경우 아래 댓글에 알려주시면 수정하도록 하겠습니다.

  • 데이터 분석

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

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

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

댓글