sklearn学习笔记(四)-K近邻(KNN)

本文介绍了使用scikit-learn库实现K-近邻算法,包括数据集生成、KNN分类器的使用、多分类问题处理以及在葡萄酒分类案例中的实战应用。

1.k-近邻的Sklearn实现

1.1.生成数据集

#导入make_blobs
data, label = make_blobs(n_features = 2,   
                         n_samples = 100,
                         centers = 3,
                         random_state = 3,
                         cluster_std = [0.8, 2, 5]                                    
)
  • n_features表示每一个样本有多少特征值
  • n_samples表示样本的个数
  • centers是聚类中心点的个数,可以理解为Label的种类数
  • random_state是随机种子,可以固定生成的数据
  • cluster_std设置每个类别的方差
#导入数据集生成器
from sklearn.datasets import make_blobs
#生成样本数为200,分类为2的数据集
data = make_blobs(n_samples = 200, centers = 2, random_state = 8)
print(data)

#分离自变量与因变量
X, y = data

#数据可视化
import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(X[:,0],X[:,1], c=y, cmap=plt.cm.spring, edgecolors='k')

#默认效果
plt.scatter(X[:,0],X[:,1], c=y)

运行结果如图:

图1 修改后效果
图2 默认效果

1.2.sklearn中的KNN分类器

from sklearn.neighbors import KNeighborsClassifier   #导入分类器
KNeighborsClassifier(  
    n_neighbors = 5,    
    weights = 'uniform',     
    algorithm = 'auto',  
    leaf_size = 30,   
    metric_params = 'minkowski'   
  • n_neighborsint类型, 最近的几个样本具有投票权,通常为单数
  • weights等比重投票,'distance’表示按距离反比投票
  • algorithm即内部采用什么算法实现
  • leaf_size此参数给出了kd_tree或者ball_tree叶节点规模
  • metric_params距离度量对象,即怎样度量距离
import numpy as np
#导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier

#KNN分类器实例化
clf = KNeighborsClassifier()
#模型训练
clf.fit(X, y)

将数据分类结果可视化:

#训练结果可视化

x_min, x_max = X[:,0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:,1].min() - 1, X[:, 1].max() + 1

#把x,y轴分块,找出很密的一堆点
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                     np.arange(y_min, y_max, .02))

#把刚才找到的密密麻麻的点,每个点都预测一个类别
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)    #形状变化

#把这些点,按类别的不同赋予不同的颜色
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel1)

#绘制散点图,按照
plt.scatter(X[:, 0], X[:,1], c=y, cmap = plt.cm.spring, edgecolor = 'k')


#限制坐标范围
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("Classifier:KNN")

在这里插入图片描述


加入一个新的点预测其类别:

#训练结果可视化

#对新数据点进行可视化

#框出坐标范围,寻找上下界
x_min, x_max = X[:,0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:,1].min() - 1, X[:, 1].max() + 1

#把x,y轴分块,找出很密的一堆点
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                     np.arange(y_min, y_max, .02))

#把刚才找到的密密麻麻的点,每个点都预测一个类别
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)    #形状变化

#把这些点,按类别的不同赋予不同的颜色
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel1)

#绘制散点图,按照
plt.scatter(X[:, 0], X[:,1], c=y, cmap = plt.cm.spring, edgecolor = 'k')

#限制坐标范围
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("Classifier:KNN")

#对新数据点进行可视化
plt.scatter(6.75, 4.82, marker='*', c='red', s=200)

print('新数据点的分类是:', clf.predict([[6.75, 4.82]]))

在这里插入图片描述


1.3KNN拟合多分类问题

#生成样本数是500,类别数是5的数据集
data2 = make_blobs(n_samples = 500, centers = 5, random_state = 8)
X2, y2 = data2
plt.scatter(X2[:, 0], X2[:, 1], c=y2, cmap=plt.cm.spring, edgecolor='k')
plt.show()

查看原始数据分布:
在这里插入图片描述

#用KNN模型进行拟合
clf = KNeighborsClassifier()
clf.fit(X2, y2)

#对拟合结果进行可视化
x_min, x_max = X2[:,0].min() - 1, X2[:, 0].max() + 1
y_min, y_max = X2[:,1].min() - 1, X2[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                     np.arange(y_min, y_max, .02))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)    #形状变化
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel1)
plt.scatter(X2[:, 0], X2[:,1], c=y2, cmap = plt.cm.spring, edgecolor = 'k')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("Classifier:KNN")

#plt.scatter(6.75, 4.82, marker='*', c='red', s=200)
plt.show()

查看分类情况:
在这里插入图片描述
模型评估:

print('模型正确率:{:.2f}'.format(clf.score(X2, y2)))

运行结果:模型正确率:0.96


1.4 KNN实战葡萄酒分类

#导入所需要的库
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasets
from sklearn.model_selection import train_test_split

#加载数据
wine = datasets.load_wine()

#查看相关信息
wine.keys()
wine.data.shape #查看自变量数据维度
print(wine.DESCR)

数据预处理:

#为便于可视化,取前两个特征纳入模型
X = wine.data[:, :2]
y = wine.target

#划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
print('X_train:{}, X_test:{}'.format(X_train.shape, X_test.shape))
#KNN模型实例化
clf = neighbors.KNeighborsClassifier(n_neighbors=15, weights='distance')
#模型训练
clf.fit(X_train, y_train)

print("测试集模型评分:{:.2f}".format(clf.score(X_test, y_test)))
print("训练集模型评分:{:.2f}".format(clf.score(X_train, y_train)))

结果为:
测试集模型评分:0.89
训练集模型评分:1.00





笔记持续更新中,敬请期待

<think>首先,用户的问题是关于sklearn KNN算法中“run_knn”的含义。用户引用了几个引用,但这些引用似乎与“run_knn”无关。用户说:“我想了解sklearn KNN算法中run_knn的含义”,并提供了引用,但这些引用讨论的是KNN算法的实现、Sklearn的封装、距离计算等,没有直接提到“run_knn”。用户还说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答”,但我没有用户上一次的问题历史,因为这是新的对话。 用户提供了引用: - [1]: 讨论KNN的计算耗时问题。 - [2]: 机器学习笔记,用Sklearn实现鸢尾花分类。 - [3]: Python编写KNN算法,描述KNN工作原理。 - [4]: 自定义KNN算法代码。 - [5]: Python编写KNN算法调用MapReduce,提到距离计算。 在这些引用中,没有任何地方提到“run_knn”。在SklearnKNN实现中,我没有回忆起一个名为“run_knn”的函数或方法。SklearnKNN分类器通常在`sklearn.neighbors.KNeighborsClassifier`类中实现,常见的方法包括`fit`、`predict`、`kneighbors`等,但没有“run_knn”。 我需要基于常识和Sklearn的知识来回答。可能“run_knn”是用户的一个误解或自定义表述。在引用[4]中,有一个自定义KNN类的代码,其中有`fit`、`predict`和`_predict`方法。在`_predict`方法中,计算了距离并进行了预测,这本质上类似于“运行KNN”的逻辑。 在Sklearn的官方文档中,没有“run_knn”这个方法。KNN算法的核心是通过`fit`训练模型,然后通过`predict`进行预测。可能用户指的是KNN算法的执行过程。 用户说:“请尽可能多的参考用户上一次的问题和你的回答”,但这是我第一次在这个对话中响应,所以没有上一次的回答。用户的问题是新的。 现在,回答结构:我需要清晰、系统地解释。用户询问“run_knn的含义”,所以我应该解释它可能是什么。 假设“run_knn”不是Sklearn中的标准术语,我应基于上下文推断。可能在引用[4]的代码中,`predict`方法在内部调用`_predict`,这可以看作是运行KNN的核心步骤。 在引用[4]的代码中: ```python def predict(self, X): return np.array([self._predict(x) for x in X]) def _predict(self, x): # 计算距离,找到k近邻,投票预测 ``` 这里,`_predict`方法执行了KNN算法的关键一步:对于单个样本,计算它与训练集的距离,找到k个最近邻,并进行多数投票预测。这可以视为“运行KNN”的核心函数。 在SklearnKNN中,类似的功能在`predict`方法中实现。 所以,我可以说,“run_knn”可能在上下文中指的是KNN算法的预测阶段或核心计算逻辑。 现在,系统级指令: - 所有行内数学表达式用$...$,例如$distance$。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 在回答中,我需要引用用户提供的引用。用户提供了引用[1]到[5],所以我应该尽可能引用它们来解释。 例如,引用[1]提到KNN的计算耗时,引用[4]有自定义代码。 组织回答: 1. 澄清“run_knn”可能不是Sklearn中的标准方法。 2. 解释在KNN算法中,类似的核心操作是什么。 3. 参考引用中的内容来说明。 4. 最后生成相关问题。 回答结构: - 开头解释含义。 - 详细描述。 - 结尾生成相关问题。 用中文回答。 </think>### sklearn KNN算法中“run_knn”的含义分析 在Scikit-learn(sklearn)库中,K最近邻KNN)算法主要通过`sklearn.neighbors.KNeighborsClassifier`类实现(用于分类问题)。根据您提供的引用和标准sklearn文档,**“run_knn”并不是sklearn官方API中的一个标准方法或函数名称**。这可能是一个误解、自定义实现中的术语,或因上下文而异的表述。下面我将逐步分析“run_knn”可能的含义,并参考您提供的引用进行详细说明。 #### 1. **“run_knn”可能指代KNN算法的核心预测过程** -KNN算法中,核心步骤是“预测阶段”,即对于一个新样本$x$,计算它与训练集中所有样本的距离(如欧氏距离$d = \sqrt{\sum (x_i - x_j)^2}$),找出k个最近邻,并通过多数投票机制确定预测标签(分类问题)或平均计算(回归问题)。 - 在自定义实现中(如您的引用[4]),`_predict`方法执行了类似“运行KNN”的逻辑:它计算距离、排序、选择k个最近邻并投票。代码片段中: ```python def _predict(self, x): distance = [math.sqrt(np.sum((x3 - x) ** 2)) for x3 in self.x_train] # 计算欧氏距离 knn_ = np.argsort(distance) # 排序距离 knn__ = knn_[:self.k] # 取前k个近邻 knn__1 = [i for i in knn__] vnest = self.y_train[knn__1] # 获取近邻标签 y_sco = [i for i in vnest] votos = Counter(y_sco) # 投票统计 fin_predict = votos.most_common()[0][0] # 预测结果 return fin_predict ``` 这个方法在功能上相当于“运行KNN”的核心计算,即对新数据进行分类[^4]。 -sklearn官方实现中,类似功能由`predict`方法处理(例如,`model.predict(X_test)`),它内部调用了距离计算和近邻搜索算法(如KD树或Ball树)。引用[1]提到KNN算法的一个缺点是“计算耗时”,这高度依赖样本维度和数量,因此在`predict`方法中,sklearn使用优化数据结构来加速“运行”过程[^1]。 #### 2. **“run_knn”可能源于自定义或教学代码中的命名** - 在一些教学或自定义实现中,“run_knn”可能被用作一个封装函数,用于训练和预测的整个流程(类似于sklearn的`fit`和`predict`组合)。例如: - 在引用[3]中描述KNN工作原理:“输入新数据后,将新数据的每个特征与样本集比较,提取最相似数据的分类标签”[^3]。如果自定义代码中有一个名为`run_knn`的函数,它可能整合了这些步骤。 - 在分布式计算环境中(如引用[5]),KNN实现可能使用MapReduce框架,其中“run_knn”对应距离计算的并行执行(例如,使用Map函数计算欧氏距离$d$) [^5]。 - 但在sklearn官方库中,没有名为“run_knn”的直接方法。相反,标准流程是: - 使用`fit`方法训练模型(加载训练数据)。 - 使用`predict`方法进行预测(执行核心KNN计算)。 - 可选方法如`kneighbors`返回k个最近邻的索引和距离,这也可以看作是“运行KNN”的部分输出。 #### 3. **为什么“run_knn”不是sklearn标准术语?** - sklearn的API设计强调一致性,所有算法都遵循`fit`和`predict`范式。KNN算法没有单独“运行”方法,因为预测过程已整合在`predict`中。 - 引用[2]指出,sklearnKNN实现比自定义代码更复杂,包括处理高维数据耗时问题(如使用树结构优化),这隐式发生在`predict`方法内部[^2]。 - 如果您在代码或文档中看到“run_knn”,它可能来自: - 第三方库或自定义脚本(如引用[4]中的`predict`方法)。 - 误导性的变量名或简化描述。 #### 总结 “run_knn”在sklearn KNN算法中不直接存在,它可能是一个泛指KNN预测核心逻辑的非正式术语,对应`predict`方法的功能:计算距离、选择近邻并进行分类投票。在自定义实现中(如引用[4]),类似逻辑由`_predict`方法执行,这可以视为“运行KNN”的具体体现[^4]。在实际使用时,推荐遵循sklearn官方API:初始化和训练模型后,用`predict`方法执行预测。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值