[Python] K-Nearest Negihbors


K-Nearest Negihbors


基本概念
  • サポートラーニング
    与えられた
  • データのラベルの下でコンピュータを学習する方法
  • 指導学習なし
  • 明確な答えなしでコンピュータを学ぶ方法
  • データの非表示特性または構造を決定するための
  • 分類
  • 予測事前定義された複数のクラスラベルの1つ:
  • 属性値を入力、クラス値を出力型番
  • アヤメ属(Iris)の3品種の1つで、分類、暗分類など
  • バイナリ分類、多重分類など
  • がある
  • 回帰
  • 予測連続数字
  • 属性値を入力、連続実数値の型番
  • を出力する
  • ある人の教育の程度、年齢、居住地によって年収
  • を予測する.
  • 予測値のわずかな差は重要ではない
  • 一般(Generalization)
  • セットのトレーニング学習モデルによるテストセットの正確な予測
  • 遷移(Overfitting)
  • トレーニングキットの配合が多すぎて、テストキットの性能が
  • 下がった.
  • と小滴合(Underfitting)
  • の訓練セットを十分に反映できないため、訓練セット、試験セットともに性能低下の
  • が現れる.
  • ソリューション
  • は、所定のトレーニングデータの多様性(各種データ点を均一に表す)
  • を保証しなければならない.
  • 通常のデータ量は
  • の普及に大きく役立つ.
    大量の
  • セットのデータを収集するのは役に立たない
  • です.
  • 法規は、モデルの複雑さを適切な線
  • に設定する.
    K-Nearest Neighbors(K-NN)
  • k-近隣アルゴリズム
  • は、新しいデータポイントに最も近いトレーニングデータセットのデータポイントを検索し、
  • を予測する.
  • kの値は近隣の数
  • を決定する.
  • 分類と回帰は、
  • で使用できます.
    1つのアルゴリズム
  • は、入力値が
  • であり、k個の近似点がある場合、これらの点がどのラベルに最も近い(近隣)かを判断する.
  • パラメータ:データ点間の距離を測定(通常はユークリディアン距離を使用)、隣接点数
  • の利点:分かりやすいモデルで、少し調整すると良好な性能が得られる
  • 欠点:トレーニングキットが大きく、速度が遅く、多くの特性が処理しにくい
  • ユークリディアン距離:2点間の距離を計算する方法
  • 2 2点(p 1,p 2)と(q 1,q 2)の距離
    => ((p1-q1)^2 + (p2-q2)^2)^0.5
  • KNeighborsClassifier()
  • KNeighborsClassifier(n_neighbors, weights, algorithm, leaf_size, p, metric, metric_params, n_jobs)
    - n_neighbors : 이웃의 수 (default : 5)
    - weights : 예측에 사용된 가중 함수 (uniform, distance) (default : uniform)
    - algorithm : 가까운 이웃을 계산하는데 사용되는 알고리즘 (auto, ball_tree, kd_tree, brute)
    - leaf_size : BallTree 또는 KDTree에 전달 된 리프 크기
    - p : (1 : minkowski_distance, 2: manhattan_distance 및 euclidean_distance)
    - metric : 트리에 사용하는 거리 메트릭스
    - metric_params : 메트릭 함수에 대한 추가 키워드 인수
    - n_jobs : 이웃 검색을 위해 실행할 병렬 작업 수
    Irisデータを用いたKNN分類実験
  • のデータ特性
  • について
    # 데이터 가져오기
    from sklearn.datasets import load_iris
    import sklearn.datasets
    
    iris_dataset = load_iris()
    
    # 훈련 데이터와 테스트 데이터 준비
    from sklearn.model_selection import train_test_split
    
    X = iris_dataset.data
    y = iris_dataset.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
    # 75% : 25% default
    
    # 데이터 조사
    # 산점도 행렬 : 3개 이상의 특성을 표현
    # 4개의 특성을 갖는 붓꽃
    import pandas as pd
    
    iris_df = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
    pd.plotting.scatter_matrix(iris_df, c=y_train)
  • 学習と予測結果
  • #학습
    from sklearn.neighbors import KNeighborsClassifier
    
    model = KNeighborsClassifier(n_neighbors=1)
    model.fit(X_train, y_train)
    
    #예측
    from sklearn import metrics
    
    pred = model.predict(X_test)
    ac_score = metrics.accuracy_score(y_test, pred)
    ac_score
    
  • 決定境界(決定境界)
  • 隣接の数を増やすと、結晶化境界はより滑らかになります.
    より少ない
  • 隣接を使用するとモデルの複雑度が向上し、より多くの隣接を使用するとモデルの複雑度が低下する
  • .
    # KNeighborsClassifier 분석
    import mglearn
    import matplotlib.pyplot as plt
    
    X, y = mglearn.datasets.make_forge()
    
    fig, axes = plt.subplots(1, 3, figsize=(10, 3))
    
    for n, ax in zip([1, 3, 9], axes):
      model = KNeighborsClassifier(n_neighbors=n)
      model.fit(X, y)
      mglearn.plots.plot_2d_separator(model, X, ax=ax, fill=True, alpha=0.5)
      mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)
      ax.set_title(f'{n} neigbhors')