今回は、KaggleのWinner solutionにもなった「K近傍を用いた特徴量抽出」を紹介します。
Rでの実装は公開されていますが、Pythonでの実装は確認できなかったので、自前のPython実装も公開しています。
近傍数を、分類するクラス数を
とした場合に、アルゴリズムは
個の特徴量を生成します。生成される特徴量は下記のように、観測値と各クラス内の
最近傍点との間の距離から計算されます。
上記の手順を全てのクラスについて繰り返すことで、個の特徴量が生成されます。実際は過学習を避けるため、n-foldで分割して特徴量を生成しています。
Notebook version can be seen [here](https://github.com/upura/knnFeat/blob/master/demo.ipynb).
import numpyas np%matplotlib inlineimport matplotlib.pyplotas plt
x0 = np.random.rand(500) -0.5x1 = np.random.rand(500) -0.5X = np.array(list(zip(x0, x1)))y = np.array([1if i0 * i1 >0else0for (i0, i1)inlist(zip(x0, x1))])

from knnFeatimport knnExtractnewX = knnExtract(X, y, k =1, folds =5)

ほぼ線形分離可能な特徴量が抽出できています。
定番のiris データセットでも、うまく分離できています(irisは3クラス分類なので特徴は3つ得られていますが、うち2つだけでプロットしています)。
from sklearnimport datasetsiris = datasets.load_iris()y = iris.targetX = iris.data


初回公開時、n-foldで分割においてX_testではなくX_trainから特徴量を抽出する実装となっていました。ご指摘いただき、ありがとうございます。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。