📜  r最近邻居(1)

📅  最后修改于: 2023-12-03 15:34:47.418000             🧑  作者: Mango

R最近邻居

R最近邻居(KNN)是一种常见的监督式学习算法,用于分类和回归问题。它是一种基于实例的学习算法,在训练过程中存储所有训练样本,并根据样本的相似性来预测新样本的输出。在分类问题中,它根据k个最近邻居的投票结果来做出新样本的分类决策。在回归问题中,它根据k个最近邻居的平均值来预测新样本的目标值。

实现KNN

在R中实现KNN非常简单,可以使用knn()函数,也可以使用class包中的knn()函数。我们可以使用iris数据集作为一个例子,该数据集包含150个样本,每个样本包含四个特征(萼片长度,萼片宽度,花瓣长度和花瓣宽度)以及它们所属的类别(setosa,versicolor和virginica)。

#导入iris数据集
data(iris)

#拆分数据集为训练集和测试集
trainIndex <- sample(nrow(iris), 0.7 * nrow(iris))
trainData <- iris[trainIndex, ]
testData <- iris[-trainIndex, ]

#使用knn()函数训练和预测
library(class)
trainLabels <- trainData$Species
testLabels <- testData$Species
predictedLabels <- knn(trainData[,1:4], testData[,1:4], trainLabels, k=5)

#计算预测的准确率
accuracy <- sum(predictedLabels == testLabels) / nrow(testData)
cat ("Accuracy: ", accuracy)

在上面的代码中,我们首先导入iris数据集,并将其拆分为训练集和测试集。然后使用class包中的knn()函数进行训练和预测。我们使用k = 5,这意味着预测将基于5个最近邻居的投票结果。在最后一行,我们计算预测的准确率。在这个例子中,准确率为0.956。

参数选择

在实际应用中,我们需要选择适当的k值。较小的k值会使模型更加容易受到噪声数据的影响,而较大的k值可以使模型更加稳定,但可能无法捕捉到数据中的局部特征。因此,我们需要在训练之前进行调参。

通常,我们可以使用交叉验证来选择k值。在R中,我们可以使用caret包中的train()函数来实现。下面的代码演示了如何使用caret包中的train()函数选择最佳的k值。

library(caret)

#定义k的范围和交叉验证的折数
kRange <- seq(from = 1, to = 10, by = 2)
ctrl <- trainControl(method = "cv", number = 10)

#使用train()函数训练模型
set.seed(123)
knnModel <- train(Species ~ ., data = iris, method = "knn",
                  metric = "Accuracy", tuneGrid = expand.grid(k = kRange), trControl = ctrl)

#输出最佳的k值和相应的准确率
cat("Best k value: ", knnModel$bestTune$k, "\n")
cat("Accuracy: ", max(knnModel$results$Accuracy))

在上面的代码中,我们首先定义了k值的范围和交叉验证的折数。然后使用trainControl()函数定义交叉验证的设置。在train()函数中,我们使用knn方法来训练模型,metric参数用于指定评估模型性能的指标,在本例中为准确率。tuneGrid参数用于指定我们要优化的参数和其取值,trControl参数用于指定交叉验证的设置。在训练结束后,我们可以使用bestTune$k属性获取最佳的k值,并使用results属性获取跨所有折交叉验证的性能度量。在本例中,最佳k值为3,准确率为0.98。

总结

R最近邻居是一种常见的监督式学习算法,用于分类和回归问题。在R中实现KNN非常简单,我们可以使用knn()或class包中的knn()函数。需要注意的是,我们需要在训练之前选择适当的k值。在R中,我们可以使用交叉验证来选择最佳的k值。