머신러닝 | 최근접 이웃(KNN, K-Nearest Neighbor) 알고리즘 | 지도학습 | 회귀, 분류 분석

    728x90

     

    1. KNN (K-Nearest Neighbor) 알고리즘 

     

    ▶ 최근접 이웃 알고리즘

    : 거리를 기준으로 근접해 있는 데이터들의 양상을 보고 내가 알고싶은 데이터의 종류를 예측하는 방식

    : 주변 데이터 K개를 선정한 후에 K개의 데이터 내에 가장 많은 부분을 차지하는 데이터로 예측

    • K=3일 때, 주변에 별은 1개, 세모는 2개이므로 세모로 예측될 것
    • K=7일 때, 주변에 별은 4개, 세모는 3개이므로 별로 예측될 것

    ▶ K는 하이퍼 파라미터

     

    * 파라미터와 하이퍼파라미터

    • 파라미터(Parameter)  모델 내부에서 결정되는 값 
      • 머신러닝 모델 학습 과정에서 추정하는 내부 변수이며 자동으로 결정되는 값
      • ex. 선형회귀에서의 가중치와 편향
      • cf. 파이썬 함수 정의에서는 함수가 받는 인자(입력 값)를 말함
    • 하이퍼 파라미터(Hyper Parameter)  사용자가 지정해줘야 하는 값
      • 데이터 사이언티스트가 기계학습 모델 훈련을 관리하는 데에 사용하는 외부 구성 변수이며 모델 학습과정이나 구조에 영향을 미침
      • 모델의 파라미터 변수를 바꿔가면서 좋은 평가지표를 찾기 위해 실험하고 원리를 밝혀내야 함

    [참고 게시글]

    https://mozenworld.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8%EC%9D%98-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EC%99%80-%ED%95%98%EC%9D%B4%ED%8D%BC%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0

     

    머신러닝 모델의 파라미터와 하이퍼파라미터

    머신러닝 모델이 성공적으로 학습하고 예측을 수행하려면 여러 요소들이 결합되어야 합니다. 그중에서도 '파라미터(parameter)'와 '하이퍼파라미터(hyper-parameter)'는 모델의 성능을 결정하는 주요

    mozenworld.tistory.com


    ▶ 거리 계산법

    • 2차원 그래프에서 두 점 사이의 거리를 구하려면 피타고라스 정리(유클리드 거리_Euclidean Distance)를 사용하면 됨
    • 유클리드 거리 이외에도 맨해튼 거리 등 다양한 거리 계산법이 있음
    • 기본적으로 거리 기반 알고리즘이기 때문에 단위의 영향을 크게 받음. 그래서 변수에 대한 표준화(스케일링)를 반드시 해줘야 함
      • 유클리드 거리 공식

    ▶ KNN 모델 정리

    • 장점
      • 이해하기 쉽고 직관적
      • 모집단의 가정이나 형태 고려X
      • 회귀, 분류 모두 가능
    • 단점
      • 차원 수가 많을수록 계산량이 많아짐
      • 변수의 표준화가 필요
    • Python 라이브러리
      • sklearn.neighbors.KNeighborsClassifier
      • sklearn.neighbors.KNeighborsRegressor

     

    ▶ 최근접 이웃 실습

    # 라이브러리 가져오기
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import LabelEncoder
    from sklearn.neighbors import KNeighborsClassifier
    
    
    # 타이타닉 데이터셋 읽어오기
    # Kaggle 타이타닉 데이터셋 다운로드
    titanic_df = pd.read_csv('titanic/train.csv')
    
    
    # 데이터 전처리
    
    # Pclass: LabelEncoder
    # Sex : LabelEncoder
    # Age : 결측치 -> 평균으로 대체
    # Embarked : 결측치 -> 가장 빈도 수가 많은 값으로 대체
    
    le = LabelEncoder()
    titanic_df['Sex'] = le.fit_transform(titanic_df['Sex'])
    
    le2 = LabelEncoder()
    titanic_df['Pclass'] = le2.fit_transform(titanic_df['Pclass'])
    
    le3 = LabelEncoder()
    titanic_df['Embarked'] = le3.fit_transform(titanic_df['Embarked'])
    
    age_mean = titanic_df['Age'].mean()
    titanic_df['Age'] = titanic_df['Age'].fillna(age_mean)
    titanic_df['Embarked'] = titanic_df['Embarked'].fillna('S')
    
    
    # KNN 알고리즘 모델링
    
    model_knn = KNeighborsClassifier()
    
    X_features = ['Pclass','Sex', 'Age', 'Fare', 'Embarked']
    
    X = titanic_df[X_features]
    y = titanic_df['Survived']
    
    model_knn.fit(X,y) 
    y_knn_pred = model_knn.predict(X)
    
    
    # 정확도(Accuracy)와 f1-score를 출력하는 함수 만들기
    def get_score(model_name, y_true, y_pred):
        acc = accuracy_score(y_true, y_pred)
        f1 = f1_score(y_true, y_pred, average='weighted')
        print(model_name, ':', 'acc 스코어: ', acc, ',', 'f1 스코어: ', f1)
    
    
    # 모델링 결과 출력
    get_score('knn', y, y_knn_pred)

    728x90

    댓글