連続変数とバイナリ変数をもつK最近傍点


10

a b c(3つの属性)を持つデータセットがあります。aは数値で連続的でありbc2つのレベルを持つカテゴリカルです。K-Nearest Neighborsメソッドを使用して分類abていcます。したがって、距離を測定できるようにするには、bとを削除して追加することでデータセットを変換b.level1b.level2ます。観測にカテゴリのi最初のレベルがある場合bb.level1[i]=1およびb.level2[i]=0

これで、新しいデータセットで距離を測定できます。 a b.level1 b.level2

理論的/数学的観点から:バイナリデータと連続データの両方でK最近傍(KNN)を実行できますか?

FNNRでパッケージと関数を使用していますknn()


KNNの経験はほとんどありませんが、距離の設定にバイナリ変数がどのように役立つかはわかりません。なぜあなたがこのアプローチに傾くのか興味があります。
rolando2 2017年

数値変数をカテゴリー変数と比較するより良い方法が見当たらないからです。より良いアプローチをお気軽にご提案ください:)
k.dkhk 2017年

回答:


11

カテゴリ変数と連続変数(機能)を組み合わせても問題ありません。

どういうわけか、k-NNのような方法には理論的な根拠があまりありません。ヒューリスティックは、2つのポイントが(ある距離に従って)互いに接近している場合、出力に関して共通点があるということです。たぶんそうだけどたぶん違う。そしてそれはあなたが使う距離に依存します。

(a,b,c)(a,b,c)

  • aa(aa)2
  • bb
  • cc

これは、各フィーチャに暗黙的に重みを与えることに対応します。

aaaaa

各特徴をその標準偏差で除算することで、重みを再調整して動作を正規化できます。これは、連続変数とバイナリ変数の両方に適用されます。また、独自の優先ウェイトを提供することもできます。

R関数kNN()がそれを行うことに注意してください:https ://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

最初の試みとして、基本的にnorm = true(正規化)を使用します。これにより、連続的特徴とカテゴリー的特徴を組み合わせるときに現れる可能性のあるほとんどの無意味なことが回避されます。


良い答え(+1)、ただし、次元が高く、離散変数が多い場合は、ユークリッド距離のknnがうまく機能しない可能性があります。
Haitao Du

6

はい、確かにバイナリデータと連続データの両方でKNNを使用できますが、そうするときに注意すべきいくつかの重要な考慮事項があります。

結果は、以下に示すように、実数値の結果(0〜1のスケーリングされた、重み付けされていないベクトルの場合)間の分散に関連するバイナリ分割によって大きく通知されます。

実数値変数とバイナリ変数の分離

この例では、個々の観測値の距離による最近傍が、スケーリングされた実数値変数よりもバイナリ変数の方がはるかに多く通知されることがわかります。

さらに、これは複数のバイナリ変数に拡張されます。実数値の変数の1つをバイナリに変更すると、距離は、実数値の近さよりも関係するすべてのバイナリ変数を照合することではるかに多くの情報を得られることがわかります。

実数値変数とバイナリ変数の分離

重要なバイナリ変数のみを含める必要があります。つまり、「最も近い実数値を持つバイナリ変数の構成(存在する場合)に一致するすべての観測について」と質問します。これは、KNNで対処できる多くの問題の合理的な定式化であり、他の問題の非常に貧弱な定式化です。

#code to reproduce plots:
library(scatterplot3d) 

scalevector <- function(x){(x-min(x))/(max(x)-min(x))}

x <- scalevector(rnorm(100))
y <- scalevector(rnorm(100))
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')

x <- scalevector(rnorm(100))
y <- ifelse(sign(rnorm(100))==-1, 0, 1)
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.