まず、R、KNN、またはデータサイエンス全般の経験がないということから始めましょう。私は最近 Kaggle を見つけ、 数字認識 競争/チュートリアルで遊んでいます。
このチュートリアルでは、基本的な提出を開始するためのサンプルコードをいくつか提供しています。
# makes the KNN submission
library(FNN)
train <- read.csv("c:/Development/data/digits/train.csv", header=TRUE)
test <- read.csv("c:/Development/data/digits/test.csv", header=TRUE)
labels <- train[,1]
train <- train[,-1]
results <- (0:9)[knn(train, test, labels, k = 10, algorithm="cover_tree")]
write(results, file="knn_benchmark.csv", ncolumns=1)
私の質問は次のとおりです。
results
に選択されている10個のうちどれを変更するにはどうすればよいですか?これらの質問は広すぎる可能性があります。もしそうなら、私は正しい道を私に向けることができるリンクを歓迎します。
ここで意味をなさないことを言った可能性は非常にあります。その場合は訂正してください。
1)次のように、特定の行の最近傍を取得できます。
k <- knn(train, test, labels, k = 10, algorithm="cover_tree")
indices <- attr(k, "nn.index")
次に、トレーニングセットの行20に最も近い10個の近傍のインデックスが必要な場合:
print(indices[20, ])
(k=10
を選択したため、10個の最近傍を取得します)。たとえば、トレーニングおよびテストセットの最初の1000行のみを使用して実行する場合(計算を容易にするため):
train <- read.csv("train.csv", header=TRUE)[1:1000, ]
test <- read.csv("test.csv", header=TRUE)[1:1000, ]
labels <- train[,1]
train <- train[,-1]
k <- knn(train, test, labels, k = 10, algorithm="cover_tree")
indices = attr(k, "nn.index")
print(indices[20, ])
# output:
# [1] 829 539 784 487 293 882 367 268 201 277
これらは、テストセットの20行目に最も近い1000のトレーニングセット内のインデックスです。
2)「変更」の意味によって異なります。手始めに、次のように各行に最も近い10個のラベルのそれぞれのインデックスを取得できます。
closest.labels = apply(indices, 2, function(col) labels[col])
次に、次のように、20番目のトレーニングポイントに最も近い10個のポイントのラベルを確認できます。
closest.labels[20, ]
# [1] 0 0 0 0 0 0 0 0 0 0
これは、行20に最も近い10個のポイントすべてが0というラベルの付いたグループに含まれていることを示します。knn
は単純に多数決でラベルを選択します(同点はランダムに解除されます)が、必要に応じて何らかの重み付けスキームを選択できます。
ETA:投票スキームでより近い要素をより重く重み付けすることに関心がある場合は、次のようにk近傍のそれぞれまでの距離を取得することもできることに注意してください。
dists = attr(k, "nn.dist")
dists[20, ]
# output:
# [1] 1238.777 1243.581 1323.538 1398.060 1503.371 1529.660 1538.128 1609.730
# [9] 1630.910 1667.014