가시화 예측 모델의 적용 범위와 적용 구역을 시험해 보다

13599 단어 기계 학습Python

입문


제작된 예측 모델에 따라 특정한 데이터의 예측을 할 때 이 예측 모델이 어떤 데이터를 활용할 수 있는지에 대한 적용 범위·적용 구역(Applicability Domain, AD)에 대한 생각이 중요해진다.적용 범위를 초과하고 적용 구역을 예측할 때 그 신뢰성은 의심을 받는다.
적용 범위, 적용 영역 정보
  • 학습 데이터 센터와의 거리
  • 데이터 밀도
  • 등등. 참조 URL에 설명된 바와 같이 여러 가지 방법이 있습니다.
    이번에 우리는 matplotlib를 통해 그 중의 데이터 밀도를 가시화시켰다.

    데이터 밀도 정의


    예측 모델은 특정한 데이터가 존재할 때 이 데이터 점의 데이터 밀도를 다음과 같이 정의한다.
    이 데이터와 가장 가까운 N개의 학습 데이터 거리의 총계
    요즘 이웃법 말이야.거리로서 이번에는 유클리드 거리를 이용했다.

    시각화 방법

  • 학습 데이터는 scikit-learn의make_regression을 사용하여 생성합니다.데이터 밀도의 표현을 확인하기 위해 학습 데이터를 두 집단으로 분리한다
  • 변수의 수량이 2개라는 것을 설명한다.PCA, UMAP 등을 통해 3개 이상의 설명 변수를 2차원으로 압축해 표시하는 것도 고려했지만 등고선도 제작이 어려워 방치됐다
  • 각 격자점의 데이터 밀도를 계산한다.(K의 최근 인접 법수 K=1, 3, 15는 모든 학습 데이터의 모델로 계산된다
  • 스캐너로 학습 데이터를 그립니다.데이터 밀도는 등고선도를 통해 가시화된다
  • 환경

  • python3.6
  • matplotlib 3.1.1
  • scikit-learn 0.21.2
  • 출처

    import numpy as np
    
    from sklearn.datasets import make_regression, make_classification
    import argparse
    import pandas as pd
    import numpy as np
    import umap
    import matplotlib
    import matplotlib.pyplot as plt
    
    
    def main():
    
        # --------------------------------------
        # データの生成
        # --------------------------------------
        dataX1, y1 = make_regression(n_samples=20, n_features=2, random_state=0)
        dataX2, y2 = make_regression(n_samples=30, n_features=2, random_state=0)
    
        dataX1 = dataX1 - 2
        dataX2 = dataX2 + 2
        datas = np.vstack((dataX1, dataX2))
    
        x = np.arange(-8, 8, 0.4)
        y = np.arange(-8, 8, 0.4)
    
        X, Y = np.meshgrid(x, y)
        Z = np.zeros([X.shape[0], X.shape[1]])
    
        # ------------------------------
        # データ密度の計算
        # ------------------------------
        for i in range(X.shape[0]):
            for j in range(X.shape[1]):
                query_x = X[i, j]
                query_y = Y[i, j]
    
                #count = len(datas)      #考慮する近傍の数
                count = 15  # 考慮する近傍の数
                #count = 3  # 考慮する近傍の数
                #count = 1  # 考慮する近傍の数
                distances = [] #近傍を格納する配列
    
                for target_x, target_y in datas:
                    distance = np.sqrt(np.square(query_x-target_x) + np.square(query_y-target_y))
    
                    if len(distances) < count:
                        distances.append(distance)
                        print("NEW IN {0} len={1}".format(distance, len(distances)))
                    else:
                        distances.sort(reverse=True)
                        for k, d in enumerate(distances):
                            if d > distance:
                                distances[k] = distance
                                print("IN {0} len={1}".format(distance, len(distances)))
                                print("OUT {0} len={1}".format(distance, len(distances)))
    
                sum = 0.0
                for d in distances:
                    sum += d
    
                print("SUM={0}".format(sum))
                Z[i, j] = sum
    
        fig = plt.figure(figsize=(12, 5))
        ax1 = fig.add_subplot(1, 2, 1)
        ax1.pcolormesh(X, Y, Z, cmap='hsv')
        ax1.scatter(datas[:, 0], datas[:, 1])
    
        plt.show()
    
    if __name__ == "__main__":
        main()
    

    가시화


    전체 데이터 (50개) 사용 시



    K=15시



    K=3시



    K=1시



    고찰

  • 모든 데이터를 사용할 때 예상되는 결과는 데이터 센터의 밀도가 가장 높다.이 예에서 두 묶음 사이의 밀도가 적은 곳도 밀도가 높다는 평가를 받아 데이터 밀도 평가에 문제가 있다
  • K=15, K=3 모두 묶음의 정중간 부분의 밀도가 낮아져 느낌이 좋다
  • K=1 시 왼쪽 아래에 고립된 1시 주위의 데이터 밀도도 높아져 극단적인 느낌이 든다
  • 참고 자료

  • 모델의 적용 범위 모델의 적용 범위(Applicability Domain, AD)~ 회귀 모델류 분류 모델을 사용할 때 필요한 개념~
  • 좋은 웹페이지 즐겨찾기