简介
介绍了非常简单的算法:K邻近算法,即KNN。
基本介绍
K-近邻算法(K-Nearest Neighbors,简称KNN)是一种基本且广泛应用的监督学习算法,主要用于分类和回归任务。
工作原理非常简答直观:所谓近朱者赤、近墨者黑。为了判断测试样本的类别,以所有的测试集样本为参照,计算测试样本与训练集所以样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则**(majority-voting)**,根据这些邻居的信息来预测新数据点的分类或数值。
KNN算法的应用
- 分类任务:如在医疗领域根据患者的历史数据来预测疾病的类型。
- 回归任务:如预测房价或股票价格。
- 推荐系统:如根据用户的购买历史和偏好来推荐商品。
KNN算法的简单性和有效性使其成为许多领域中常用的基准算法之一。然而,它在处理大规模数据集时的计算和存储需求较高,这可能限制了其在某些应用中的实用性。
特点
非参数算法:KNN是一种非参数学习算法,这意味着它不对数据的分布做任何假设。这是它与其他统计学习方法最大的不同。
惰性学习器:KNN属于惰性学习方法,因为它实际上不会从训练数据中学习一个判别函数,而是直接使用训练数据进行预测,简单粗暴。
距离度量:KNN算法中的距离可以是任何度量距离,常见的有欧氏距离、曼哈顿距离或明可夫斯基距离,这在我写的聚类分析那篇文章有详细列举和介绍。
步骤
step 1 选择邻居数量K
K的选择会对算法结果有很大影响。
较小的K值意味着噪声将对结果有更大影响,而较大的K值则使计算成本更高并可能导致分类器过于平滑,拟合效果不佳。
step 2 计算距离
计算测试点与每个训练数据点之间的距离。
step 3 找到最近的K个邻居
选择距离最近的K个训练数据点作为邻居。
step 4 进行预测
对于分类任务,通常采用“投票制”,即在K个最近邻居中多数类别为预测类别;
对于回归任务,则通常是这K个邻居的输出变量的平均值。
KNN运用实例
我们运用一下 sklearn.datasets 中的 load_breast_cancer 数据集
# 导入库
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer # 使用乳腺癌维斯康数据
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
# 示例数据集
data = load_breast_cancer()
print(data)
print(type(data)) # data的类型为<class 'sklearn.utils._bunch.Bunch'>
print("目标变量名称:", data.target_names) # 目标变量名称: ['malignant' 'benign'],即良性和恶性
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target
print(df)
# 将 target_names 映射到整数值
target_map = {'malignant': 1, 'benign': 0}
df['target'] = np.where(df['target'] == 0, 'benign', 'malignant') # 将整数映射到字符
df['target'] = df['target'].map(target_map) # 将字符映射到整数
# 划分训练集
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=100)
# 创建KNN模型,建立实例,设置邻居数为3
knn = KNeighborsClassifier(n_neighbors=3)
# 训练模型
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
results_df = X_test.copy()
results_df['Actual'] = y_test
results_df['Predicted'] = y_pred
print(results_df.head())
# 评价
auc = accuracy_score(y_test, y_pred)
print(f"准确率为:{format(auc)}")
recall = recall_score(y_test, y_pred)
print(f"召回率为:{format(recall)}")
pre = precision_score(y_test, y_pred)
print(f"精确度为:{format(pre)}")
f1 = f1_score(y_test, y_pred)
print(f"F1-SCORE为:{format(f1)}")
我们可以发现,评价的结果还是很好的。
np.where() 函数
NumPy 库中的一个函数,用于根据指定条件返回输入数组、标量或者另外两个数组中对应位置的元素。基本语法如下:
np.where(condition, x, y)
- condition 是一个条件表达式,可以是布尔数组或者条件表达式。
- 如果 condition 中的元素为 True,则将 x 对应位置的元素添加到返回的数组中;如果为 False,则将
y
对应位置的元素添加到返回的数组中。
map() 方法
map()
方法是 Pandas 库中 Series 类型的一个方法,用于根据提供的字典、Series 或函数映射数据中的值。它的基本语法如下:
Series.map(arg)
- arg 可以是一个字典、Series 或者一个接受单个参数并返回一个值的函数。
- map() 方法会将数据中的每个元素通过映射规则转换成另一个值,并返回一个新的 Series 对象。