目录
前言
K近邻是机器学习中有监督学习的解决分类和回归任务的一种算法。
一、K近邻是什么?
K近邻(KNN)只基于一个假设,互相接近的实例拥有类似的被解释变量的值,是一种惰性学习和非参数模型,不会从训练数据中估计固定数量的模型参数,而是把所有训练实例存储起来,并使用距离测试实例最近的实例去预测被解释变量。
通过搜索K个最相似的实例(邻居),总结K个实例的输出变量,对新数据点进行预测。对于回归问题,输出K个近邻的均值或者权重均值,对于分类问题, 输出K个近邻中最常见的类值。
二、K近邻的优点和缺点
1. 优点:
- 简单有效:KNN算法是一种简单有效的算法,易于理解和实现。
- 无需训练:KNN算法是一种基于实例的学习方法,不需要显式地进行训练,因此可以适用于各种类型的数据。
- 适用于多分类问题:KNN算法可以很容易地扩展到多分类问题。
- 鲁棒性强:KNN算法对异常值和噪声不敏感,可以处理一些复杂的非线性问题。
2. 缺点:
- 计算复杂度高:KNN算法需要计算每个测试样本与所有训练样本之间的距离,因此随着训练集的增大,计算复杂度会急剧增加。
- 存储空间大:KNN算法需要存储所有训练样本,因此存储空间会随着训练集的增大而增大。
- 需要确定K值:KNN算法需要确定K值,如果选择不合适的K值可能会导致分类错误率的增加。
- 对输入数据的准备要求高:KNN算法对输入数据的准备要求较高,需要进行归一化等预处理操作,否则可能会导致分类结果不准确。
需要注意的是,在实际应用中,KNN算法的性能还受到许多其他因素的影响,例如特征选择、距离度量等,需要根据具体情况进行调整和优化。
三、K近邻的应用场景
K近邻算法的应用场景包括:
- 分类问题:K近邻算法可以用于分类问题,例如根据用户的历史行为预测用户是否会购买某个产品,或者根据一张图片的特征将其分类为不同的物体。
- 回归问题:K近邻算法也可以用于回归问题,例如根据房屋的面积和周边环境特征预测房价。
- 推荐系统:K近邻算法可以用于推荐系统中,例如根据用户的历史行为和兴趣爱好推荐相似的产品或服务。
- 异常检测:K近邻算法可以用于异常检测,例如在网络流量监控中检测异常流量。
- 数据降维:K近邻算法可以用于数据降维,例如将高维数据降低到二维或三维便于可视化。
- 文本分类:K近邻算法可以用于文本分类,例如根据电子邮件的内容将其分类为垃圾邮件或非垃圾邮件。
- 图像识别:K近邻算法可以用于图像识别,例如将数字图像分类为不同的数字。
- 时间序列分析:K近邻算法可以用于时间序列分析,例如根据历史数据预测未来的趋势。
- 生物信息学:K近邻算法可以用于生物信息学领域,例如根据DNA序列将生物分类为不同的物种。
总之,K近邻算法适用于许多领域和问题,特别是对于数据量较小、特征维度较少的问题,K近邻算法通常表现良好。
四、构建K近邻模型的注意事项
- 为了防止在实际的计算过程中出现平局的现象,对于超参数K,通常设置为一个奇数。
- K近邻实质上是进行距离的计算,因此对原始数据进行中心标准化等归一化处理很有必要。
- 作为非参数模型,操作简单,在对解释变量和被解释变量之间的关系所知甚少时很有用,当训练数据很缺乏或者解释变量和被解释变量的关系明确时,则对变量之间的关系做假设的模型则更有效。
五、K近邻模型的实现类库
Python中可以使用以下几个库来实现K近邻算法:
- scikit-learn:scikit-learn是Python中最流行的机器学习库之一,提供了KNeighborsClassifier和KNeighborsRegressor两个类,可以用于分类和回归问题。
- NumPy:NumPy是Python中用于科学计算的基础库,提供了计算K近邻所需的各种数学函数和数据结构。
- SciPy:SciPy是一个基于NumPy的科学计算库,提供了KDTrees算法和BallTree算法来实现K近邻。
- PyOD:PyOD是Python中用于异常检测的库,提供了KNN算法来实现异常检测问题。
- TensorFlow:TensorFlow是谷歌开源的深度学习框架,提供了KNN算法的实现,可以用于分类和回归问题。
- PyTorch:PyTorch是Facebook开源的深度学习框架,提供了KNN算法的实现,可以用于分类和回归问题。
- KNN++:KNN++是一个Python库,提供了K近邻算法的实现,可以用于分类和回归问题。
以上这些库都提供了简单易用的接口,可以快速地实现K近邻算法。需要注意的是,在使用这些库时需要根据具体情况进行参数设置和模型优化,以达到最佳的性能和准确率。
六、K近邻模型的评价指标
KNN可以进行回归和分类的建模
1. 回归模型的评价指标有:
- 均方误差(Mean Squared Error,MSE)是预测值与真实值之间差值的平方的平均值,用来衡量模型的预测精度,MSE 越小,说明模型的预测结果越准确。
- 均方根误差(Root Mean Squared Error,RMSE)是均方误差的平方根,用来衡量模型的预测精度,RMSE 越小,说明模型的预测结果越准确。
- 平均绝对误差(Mean Absolute Error,MAE)是预测值与真实值之间差值的绝对值的平均值,用来衡量模型的预测精度,MAE 越小,说明模型的预测结果越准确。
- 决定系数(Coefficient of Determination,R-squared)用来衡量模型对数据的拟合程度,取值范围为 0~1,R-squared 越接近 1,说明模型对数据的拟合程度越好。
2. 分类模型的评价指标有:
- 准确率(Accuracy)是指分类正确的样本数占总样本数的比例,用来衡量模型的分类准确度。
- 精确率(Precision)是指分类为正类的样本中,实际为正类的样本数占分类为正类的样本数的比例,用来衡量模型对正类的分类准确度。
- 召回率(Recall)是指实际为正类的样本中,被分类为正类的样本数占实际为正类的样本数的比例,用来衡量模型对正类的识别能力。
- F1 分数(F1-score)是精确率和召回率的调和平均数,用来综合衡量模型的分类准确度和识别能力。
- ROC 曲线和 AUC 值是用来评估二元分类器性能的常用指标。ROC 曲线是以假正率(False Positive Rate,FPR)为横轴,真正率(True Positive Rate,TPR)为纵轴,绘制出来的曲线。AUC 值是 ROC 曲线下面积的大小,取值范围为 0~1,AUC 值越大,说明分类器的性能越好。
七、类库scikit-learn实现K近邻的例子
1. 下面是KNN分类建模的示例:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 准备数据集
X = [[0, 0], [1, 1], [2, 2], [3, 3]]
y = [0, 0, 1, 1]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 特征缩放
# 这里省略了特征缩放的步骤
# 创建KNN模型
model = KNeighborsClassifier(n_neighbors=3)
# 模型训练
model.fit(X_train, y_train)
# 模型预测
y_pred = model.predict(X_test)
# 模型评价
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
# 打印评价结果
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1-score:", f1)
在这个示例中,我们使用一个简单的二维数据集来进行分类建模。首先,我们准备了特征矩阵X和对应的类别标签y。然后,我们使用`train_test_split`函数将数据集划分为训练集和测试集。接下来,我们创建了一个KNN模型,并使用训练集对其进行训练。然后,我们使用测试集进行预测,并计算了准确率、精确率、召回率和F1值等评价指标。
2. KNN回归算法的基本思想是根据最近邻样本的平均值来预测未知样本的输出值。下面是KNN回归建模的示例:
# 步骤1:准备数据
# 首先,我们需要准备回归问题的训练数据集和测试数据集。训练数据集包含已知的输入特征和对应的输出值,而测试数据集则只包含输入特征。
from sklearn.model_selection import train_test_split
# 假设我们有一个名为X的特征矩阵和一个名为y的目标向量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 步骤2:特征缩放
# 由于KNN算法是基于距离的,特征缩放对于KNN回归模型的性能非常重要。常用的特征缩放方法包括标准化和归一化。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 步骤3:模型训练
# 在KNN回归中,训练过程实际上就是将训练数据集存储起来,以便在预测时计算最近邻样本。
from sklearn.neighbors import KNeighborsRegressor
k = 5 # 设置K值
model = KNeighborsRegressor(n_neighbors=k)
model.fit(X_train_scaled, y_train)
# 步骤4:预测
# 使用训练好的模型对测试数据集进行预测。
y_pred = model.predict(X_test_scaled)
# 步骤5:模型评价
# 对KNN回归模型进行评价时,常用的指标包括均方误差(Mean Squared Error,MSE)和决定系数(Coefficient of Determination,R^2)。
from sklearn.metrics import mean_squared_error, r2_score
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
以上是KNN回归建模的基本步骤和代码示例。根据具体的问题和数据集,可以调整K值和特征缩放方法等参数,以获得更好的模型性能。
八、K近邻的模型参数
1. KNeighborsRegressor K近邻回归的模型参数:
- n_neighbors:指定要考虑的最近邻样本的数量(默认为5)。
- weights:指定在计算最近邻样本对预测的贡献时使用的权重。可以选择"uniform"(所有最近邻样本的权重相等)或"distance"(权重与距离的倒数成正比)。
- algorithm:指定用于计算最近邻的算法。可以选择"auto"(自动选择最适合的算法),"ball_tree"(球树算法),"kd_tree"(KD树算法)或"brute"(蛮力搜索)。
- leaf_size:指定球树或KD树的叶子节点大小(默认为30)。
- p:指定距离度量的参数。当p=1时,使用曼哈顿距离;当p=2时,使用欧氏距离(默认值)。
2. KNeighborsClassifier K近邻分类的模型参数:
- n_neighbors:指定要考虑的最近邻样本的数量(默认为5)。
- weights:指定在计算最近邻样本对预测的贡献时使用的权重。可以选择"uniform"(所有最近邻样本的权重相等)或"distance"(权重与距离的倒数成正比)。
- algorithm:指定用于计算最近邻的算法。可以选择"auto"(自动选择最适合的算法),"ball_tree"(球树算法),"kd_tree"(KD树算法)或"brute"(蛮力搜索)。
- leaf_size:指定球树或KD树的叶子节点大小(默认为30)。
- p:指定距离度量的参数。当p=1时,使用曼哈顿距离;当p=2时,使用欧氏距离(默认值)。
- metric:指定距离度量的方法。可以选择"minkowski"(默认值),"euclidean"(欧氏距离),"manhattan"(曼哈顿距离)等。
这些参数可以根据具体问题和数据集进行调整,以获得最佳的模型性能。
总结
本文主要简单介绍了K近邻的基本概念,优缺点,应用场景,K近邻建模的python实现方法,示例和模型的参数等。