- K-最近傍は、教師あり学習技術に基づいた最も単純な機械学習アルゴリズムの 1 つです。
- K-NN アルゴリズムは、新しいケース/データと利用可能なケースの間の類似性を仮定し、新しいケースを利用可能なカテゴリに最も類似したカテゴリに入れます。
- K-NN アルゴリズムは、利用可能なすべてのデータを保存し、類似性に基づいて新しいデータ ポイントを分類します。これは、新しいデータが出現したときに、K-NN アルゴリズムを使用してウェル スイート カテゴリに簡単に分類できることを意味します。
- K-NN アルゴリズムは分類だけでなく回帰にも使用できますが、ほとんどの場合は分類問題に使用されます。
- K-NNは ノンパラメトリックアルゴリズム これは、基礎となるデータに対して何も仮定を行わないことを意味します。
- とも呼ばれます 遅延学習アルゴリズム これは、トレーニング セットからすぐに学習するのではなく、データセットを保存し、分類時にデータセットに対してアクションを実行するためです。
- トレーニング段階の KNN アルゴリズムはデータセットを保存するだけで、新しいデータを取得すると、そのデータを新しいデータによく似たカテゴリに分類します。
なぜ K-NN アルゴリズムが必要なのでしょうか?
カテゴリ A とカテゴリ B の 2 つのカテゴリがあり、新しいデータ ポイント x1 があるとします。したがって、このデータ ポイントはこれらのカテゴリのどちらに位置することになります。この種の問題を解決するには、K-NN アルゴリズムが必要です。 K-NN の助けを借りて、特定のデータセットのカテゴリまたはクラスを簡単に識別できます。以下の図を考えてみましょう。
K-NNはどのように機能しますか?
K-NN の動作は、以下のアルゴリズムに基づいて説明できます。
新しいデータ ポイントがあり、それを必須のカテゴリに入れる必要があるとします。以下の画像を考えてみましょう。
javatable
- まず、近傍数を選択するので、k=5 を選択します。
- 次に計算してみます。 ユークリッド距離 データ点の間。ユークリッド距離は 2 点間の距離であり、幾何学ですでに学習しました。次のように計算できます。
- ユークリッド距離を計算することで、カテゴリ A の 3 つの最近傍とカテゴリ B の 2 つの最近傍として、最近傍を取得しました。以下の画像を考えてみましょう。
- 見てわかるように、3 つの最近傍はカテゴリ A のものであるため、この新しいデータ ポイントはカテゴリ A に属している必要があります。
K-NN アルゴリズムで K の値を選択するにはどうすればよいですか?
K-NN アルゴリズムで K の値を選択する際に留意すべき点を以下に示します。
- 「K」の最適な値を決定する特別な方法はないため、いくつかの値を試してその中から最適なものを見つける必要があります。 K の最も好ましい値は 5 です。
- K=1 や K=2 などの K の値が非常に低い場合、ノイズが多くなり、モデル内で外れ値の影響が生じる可能性があります。
- K の値を大きくすると良いですが、いくつかの問題が発生する可能性があります。
KNN アルゴリズムの利点:
- 実装は簡単です。
- ノイズの多いトレーニングデータに対して堅牢です
- トレーニング データが大きい場合は、より効果的になる可能性があります。
KNN アルゴリズムの欠点:
- K の値を常に決定する必要がありますが、場合によっては複雑になる可能性があります。
- すべてのトレーニング サンプルのデータ ポイント間の距離を計算するため、計算コストが高くなります。
KNN アルゴリズムの Python 実装
K-NN アルゴリズムの Python 実装を行うには、ロジスティック回帰で使用したものと同じ問題とデータセットを使用します。ただし、ここではモデルのパフォーマンスを向上させます。以下に問題の説明を示します。
K-NN アルゴリズムの問題: 新しいSUV車を製造した自動車メーカー会社があります。同社は、その SUV の購入に興味があるユーザーに広告を提供したいと考えています。したがって、この問題では、ソーシャル ネットワークを介した複数のユーザーの情報を含むデータセットを用意します。データセットには多くの情報が含まれていますが、 推定給与 そして 年 独立変数と 購入した変数 従属変数用です。以下はデータセットです。
K-NN アルゴリズムを実装する手順:
- データの前処理ステップ
- K-NN アルゴリズムをトレーニング セットに適合させる
- テスト結果を予測する
- 結果のテスト精度(混同行列の作成)
- テストセットの結果を視覚化します。
データの前処理ステップ:
データの前処理ステップはロジスティック回帰とまったく同じです。以下はそのコードです。
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test)
上記のコードを実行すると、データセットがプログラムにインポートされ、適切に前処理されます。特徴スケーリング後のテスト データセットは次のようになります。
上の出力画像から、データが正常にスケーリングされたことがわかります。
次に、K-NN 分類器をトレーニング データに適合させます。これを行うには、 KNeighborsClassifier のクラス スクラーンネイバーズ 図書館。クラスをインポートした後、 分類子 クラスのオブジェクト。このクラスのパラメータは次のようになります。
#Fitting K-NN classifier to the training set from sklearn.neighbors import KNeighborsClassifier classifier= KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2 ) classifier.fit(x_train, y_train)
出力: 上記のコードを実行すると、次のような出力が得られます。
Javaカウンター
Out[10]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform')
#Predicting the test set result y_pred= classifier.predict(x_test)
出力:
上記のコードの出力は次のようになります。
次に、K-NN モデルの混同行列を作成して、分類器の精度を確認します。以下はそのコードです。
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
上記のコードでは、confusion_matrix 関数をインポートし、変数 cm を使用して呼び出しています。
出力: 上記のコードを実行すると、以下のような行列が得られます。
上の画像では、64+29= 93 件の正しい予測と 3+4= 7 件の誤った予測があることがわかりますが、ロジスティック回帰では 11 件の誤った予測がありました。したがって、K-NN アルゴリズムを使用することでモデルのパフォーマンスが向上すると言えます。
ここで、K-NN モデルのトレーニング セットの結果を視覚化します。コードは、グラフの名前を除いて、ロジスティック回帰で行ったものと同じままです。以下はそのコードです。
#Visulaizing the trianing set result from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN Algorithm (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
出力:
上記のコードを実行すると、以下のグラフが得られます。
出力されるグラフは、ロジスティック回帰で発生したグラフとは異なります。それは以下の点で理解できます。
- ご覧のとおり、グラフには赤い点と緑の点が表示されています。緑色のポイントは購入済み(1)の変数、赤色のポイントは未購入(0)の変数です。
- グラフは、K-NN アルゴリズム、つまり最近傍を見つけるアルゴリズムであるため、直線や曲線を示す代わりに不規則な境界を示しています。
- SUV を購入しなかったユーザーのほとんどは赤色の領域にあり、SUV を購入したユーザーは緑色の領域にあるため、グラフではユーザーが正しいカテゴリに分類されています。
- グラフは良好な結果を示していますが、それでも、赤い領域内にいくつかの緑色の点があり、緑色の領域内に赤い点がいくつかあります。ただし、このモデルを実行することで過剰適合の問題が回避されるため、これは大きな問題ではありません。
- したがって、私たちのモデルは十分に訓練されています。
モデルのトレーニング後、新しいデータセット、つまりテスト データセットを配置して結果をテストします。コードは、いくつかの小さな変更を除いて同じままです。 x_train と y_train に置き換えられます x_test と y_test 。
以下はそのコードです。
#Visualizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN algorithm(Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
出力:
上のグラフは、テスト データ セットの出力を示しています。グラフからわかるように、赤い点のほとんどが赤い領域にあり、緑の点のほとんどが緑の領域にあるため、予測出力は良好です。
ただし、赤色の領域には緑色の点がほとんどなく、緑色の領域には赤色の点がいくつかあります。したがって、これらは混同行列で観察された誤った観察です (7 誤った出力)。