KNN算法,即K最近邻算法,是一种基于距离的分类和回归算法。它的核心思想是,一个数据点的类别或属性值可以通过其周围最近的几个邻居来确定。这种算法在机器学习领域被广泛应用,因其简单直观而受到青睐。本文将深入探讨KNN算法的工作原理、在分类和回归问题中的应用,以及如何处理不平衡数据集和异常值对算法的影响。
在现实生活中,经常根据与他人的相似性来建立友谊。KNN算法正是基于这一原则,通过寻找新数据点周围的最近邻居来确定其类别。这种基于距离的方法使得KNN算法在处理分类和回归问题时表现出色。
为了正确分类结果,首先需要确定K值,即最近邻居的数量。K值的选择对模型的分类或预测能力有着重要影响。通常,会尝试不同的K值,选择在训练和测试数据上都能获得最佳准确率的K值。
值得注意的是,选择奇数的K值可以避免在两个类别的票数相等时无法做出决策的情况。此外,K值的大小也会影响模型的性能:较大的K值可能导致欠拟合,而较小的K值可能导致过拟合。
在分类问题中,KNN算法采用“多数投票”的方法来确定类别。在给定的K值范围内,获得最多票数的类别被选为预测类别。
在回归问题中,KNN算法则采用平均值方法来预测新数据的值。基于K值,算法会考虑所有最近邻居的值,并计算它们的平均值来作为预测值。
当处理不平衡的数据集时,模型可能会产生偏见。因此,需要通过上采样或下采样策略来平衡数据集。
异常值是那些与大多数数据点显著不同的点,它们会对模型的分类或预测产生影响。因此,在应用KNN算法之前,建议先去除异常值。
数据包含两个部分:大小和单位。由于KNN算法依赖于距离,因此需要将数值变量缩放到同一水平,以便算法能够正确地识别最近邻居。
# 加载R环境中的caTools和class库
library(caTools)
library(class)
# 加载iris数据集
data <- read.csv('iris.csv', header = T)
str(data)
# 将数据分为训练集和测试集
set.seed(123)
split <- sample.split(data, SplitRatio = 0.8)
train <- subset(data, split == T)
test <- subset(data, split == F)
# 提取训练集和测试集的独立变量和因变量
trainx <- train[,-5]
testx <- test[,-5]
trainy <- train$Species
testy <- test$Species
# 对所有数值特征进行缩放
trainx <- scale(trainx)
testx <- scale(testx)
# 计算不同K值下的训练准确率
train_accuracy <- 1
i <- 1
set.seed(0)
for (i in 1:15) {
knn.pred <- knn(trainx, trainx, trainy, k=i)
train_accuracy[i] <- 100 * sum(trainy == knn.pred)/NROW(trainy)
a <- i
cat(a, '=', train_accuracy[i], '
')
}
# 在测试数据上评估模型的准确率
test_accuracy <- 1
i <- 1
for (i in 1:15) {
knn.mod <- knn(train=trainx, test=testx, cl=trainy, k=i)
test_accuracy[i] <- 100 * sum(testy == knn.mod)/NROW(testy)
k <- i
cat(k, '=', test_accuracy[i], '
')
}
# 比较不同K值下的训练准确率和测试准确率
Compare <- cbind(train_accuracy, test_accuracy)
Compare
通过上述代码,可以看到,在K值为5时,模型在训练数据和测试数据上都获得了较高的准确率。因此,选择K=5来构建模型。
K最近邻算法是一种实用的计算机工具,它通过查看附近的示例来预测事物。讨论了它如何在现实生活中提供帮助,以及如何猜测类别和数字。还学习了如何处理样本过多或过少的棘手情况,并确保所有信息公平且相等的重要性。用R语言的简单代码尝试了这一点。KNN就像一个有用的朋友,可以帮助解决许多问题!