ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • KNN 간단 예제_1
    NAN/머신 러닝 2021. 7. 9. 18:15
    728x90

     


     

    # 데이터 시각 화를 위해 matplotlib 로드
    
    import matplotlib.pyplot as plt
    
    # 데이터 준비
    bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                    31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                    35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
    bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                    500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                    700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
    
    # 시각화 할 데이터 선별
    plt.scatter(bream_length, bream_weight)
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

     

    시각화된 데이터

     

    # 비교 데이터 선별
    
    smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
    smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
    
    # 기존 데이터와 비교를 위해 시각화 반복
    plt.scatter(bream_length, bream_weight)
    plt.scatter(smelt_length, smelt_weight)
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

     

    시각화로 비교 가능한 데이터

     

    # 데이터 타입 구분을 위해 더하기 
    lenght = bream_length + smelt_length
    weight = bream_weight + smelt_weight
    
    # 사이킷런 패키지를 사용하기 위해선 데이터가 2차원 리스트여야한다.
    # 합친 데이터를 2차원 리스트로 만들기위해 zip()함수와 리스트 내포를 사용
    # 반복문을 통해 각각의 2차원 리스트로 넣어 줄 수 있다.
    fish_data = [[l,w] for l,w in zip(lenght, weight)]
    print(fish_data)
    
    # 이를 출력하면 각 데이터 l,w가 하나의 원소로 구성된 리스트가 생성된다.
    [[25.4, 242.0], [26.3, 290.0], [26.5, 340.0], [29.0, 363.0], [29.0, 430.0], [29.7, 450.0], [29.7, 500.0], [30.0, 390.0], [30.0, 450.0], [30.7, 500.0], [31.0, 475.0], [31.0, 500.0], [31.5, 500.0], [32.0, 340.0], [32.0, 600.0], [32.0, 600.0], [33.0, 700.0], [33.0, 700.0], [33.5, 610.0], [33.5, 650.0], [34.0, 575.0],
    [34.0, 685.0], [34.5, 620.0], [35.0, 680.0], [35.0, 700.0], . . . .

     

    # 정답 데이터 준비
    
    fish_target = [1] * 35 + [0] * 14
    print(fish_target)
    
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

     

    # 데이터 적용을 위해 사이킷런 로드
    from sklearn.neighbors import KNeighborsClassifier
    kn = KNeighborsClassifier()
    
    # fit()는 사이킷런으로 데이터를 훈련시키는 함수
    kn.fit(fish_data,fish_target)
    
    # score()는 훈련된 데이터 값을 실제로 출력하는 함수
    # 0 - 1 사이의 값을 반환 1에 가까울수록 정확도가 높다.
    kn.score(fish_data, fish_target)
    
    1.0

     

    # predict( )메서드는 새로운 데이터의 정답을 예측해준다.
    # 새로운 데이터 역시 2차원 배열 규칙을 지켜준다.
    kn.predict([[30,600]])
    
    array([1])
    
    
    =====================참고 ======================
    # 이 과정을 통해 참고 데이터 수를 조절 할 수 있다.
    kn49 = KNeighborsClassifier(n_neighbors=49) # 기본 값은 5
    kn49.fit(fish_data, fish_target)             
    kn49.score(fish_data, fish_target)
    
    # 정확도
    0.7142857142857143
    # 기존 데이터를 통해 두 데이터를 구분 할 수 있었고
    # 새로운 데이터를 추가해 해당 데이터가 어디에 속하는지 알 수 있었다.
    # 시각화
    plt.scatter(bream_length, bream_weight)
    plt.scatter(smelt_length, smelt_weight)
    plt.scatter(30, 600, marker='^')
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

     

    최종 결과

     

     

    결과적으로 데이터와 샘플이 잘 나눠진걸로 보이지만, 사실 이렇게 모든 데이터를 훈련 데이터로 사용하여

     

    훈련된 데이터로 결과값을 확인하는건 좋은 분석 방법이 아니다.

     

    그 이유로 시험지의 답을 외우고 답을 적는것과 시험 범위를 공부하고 답을 적는 차이라고 생각하면 되는데

     

    올바른 훈련법과 데이터의 활용법은 다음 포스트에서 확인하자.

     

     


    'NAN > 머신 러닝' 카테고리의 다른 글

    KNN 간단 예제_3  (0) 2021.07.13
    KNN 간단 예제_2  (0) 2021.07.11
    K 평균(K Means) 실습  (0) 2021.07.08
    데이터 실습  (0) 2021.07.08
    세션 Session  (0) 2021.07.08
Designed by Tistory.