티스토리 뷰

  1. Validation

    • 회귀분석 모형을 만들기 위해서는 모수 추정 즉 학습(training)을 위한 데이터 집합이 필요하다. 이 데이터 집합을 학습용 데이터 집합(traning data set)이라고 한다. 이 학습 데이터 집합의 종속 변수값을 얼마나 잘 예측하였는지를 나타내는 성능을 표본내 성능 검증(in-sample testing)이라고 한다.

      회귀분석 모형을 만드는 목적 중 하나는 종속 변수의 값을 아직 알지 못하고 따라서 학습에 사용하지 않은 표본의 대해 종속 변수의 값을 알아내고자 하는 것 즉 예측(prediction)이다. 이렇게 학습에 쓰이지 않는 표본 데이터 집합의 종속 변수 값을 얼마나 잘 예측하는가를 검사하는 것을 표본외 성능 검증(out-of-sample testing) 혹은 교차검증(cross validation)이라고 한다.

  2. Overfitting

    • 일반적으로 표본내 성능과 표본외 성능은 비슷한 수준을 보이지만 경우에 따라서는 표본내 성능은 좋으면서 표본외 성능이 상대적으로 많이 떨어지는 수도 있다. 이러한 경우를 과최적화(overfitting)라고 한다. 과최적화가 발생하면 학습에 쓰였던 표본 데이터에 대해서는 잘 종속 변수의 값을 잘 추정하지만 새로운 데이터를 주었을 때 전혀 예측하지 못하기 때문에 예측 목적으로는 쓸모없는 모형이 된다. 과최적화를 방지하기 위해 정규화(regularization) 과정이 필요하다.
  3. Cross-Validation

    • 교차검증을 하려면 두 종류의 데이터 집합이 필요하다.

      • 모형 추정 즉 학습을 위한 데이터 집합 (training data set)
      • 성능 검증을 위한 데이터 집합 (test data set)
    • 데이터 분리 (train_test_split) : 데이터를 학습용 데이터와 검증용 데이터로 분리한다.

      • train_test_split(data, data2, test_size, train_size, random_state)
        • data: 독립 변수 데이터 배열 또는 pandas 데이터프레임
        • data2: 종속 변수 데이터. data 인수에 종속 변수 데이터가 같이 있으면 생략할 수 있다.
        • test_size: 검증용 데이터 개수. 1보다 작은 실수이면 비율을 나타낸다.
        • train_size: 학습용 데이터의 개수. 1보다 작은 실수이면 비율을 나타낸다. test_size와 train_size 중 하나만 있어도 된다.
        • random_state: 난수 시드
    • train_test_split로 데이터를 분리할 때 검증 데이터의 수가 적은 경우에는 검증 데이터의 수가 적기 때문에 신뢰도가 떨어진다. 검증 데이터의 수를 증가시키면 학습용 데이터의 수가 적어지므로 정상적인 학습이 되지 않는다. 이 상황을 K-Fold 교차검증으로 개선할 수 있다.

    • K-Fold

      • 전체 데이터를 K개의 Fold로 분리하고, K번의 Loop를 돌면서 1번 ~ K번 까지 각 Fold를 검증 데이터로 지정하여 모델을 검증한다.

      • from sklearn.model_selection import KFold
        
        scores = np.zeros(5)
        cv = KFold(5, shuffle=True, random_state=0)
        for i, (idx_train, idx_test) in enumerate(cv.split(df)):
            df_train = df.iloc[idx_train]
            df_test = df.iloc[idx_test]
        
            model = sm.OLS.from_formula("MEDV ~ " + "+".join(boston.feature_names), data=df_train)
            result = model.fit()
        
            pred = result.predict(df_test)
            rss = ((df_test.MEDV - pred) ** 2).sum()
            tss = ((df_test.MEDV - df_test.MEDV.mean())** 2).sum()
            rsquared = 1 - rss / tss
        
            scores[i] = rsquared
            print("학습 R2 = {:.8f}, 검증 R2 = {:.8f}".format(result.rsquared, rsquared))
      • scikit-learn 패키지의 model_selection 서브 패키지는 KFold 클래스를 비롯한 다양한 교차검증 생성기를 제공한다.

    • cross_val_score

      • cross_val_score를 사용하면 교차검증을 간단하게 할 수 있다.
      • cross_val_score(model, X, y, scoring=None, cv=None)
           model : 회귀 분석 모형
           X : 독립 변수 데이터
           y : 종속 변수 데이터
           scoring : 성능 검증에 사용할 함수 이름
           cv : 교차검증 생성기 객체 또는 숫자.
               - None이면 KFold(3)
               - 숫자 k이면 KFold(k)
      • -

참고

'Programming > Machine Learning' 카테고리의 다른 글

[Scikit-Learn] Preprocessing  (0) 2019.07.07
[Scikit-Learn] 환경 설정  (0) 2019.07.07
텐서플로우 Docker 설치  (0) 2019.05.16
선형회귀 (Linear regression)  (0) 2019.05.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함