大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
K最近邻算法的原理 |
K最近邻算法就是目标数据点在现有数据集中,离哪一部分最近就将其划分为哪一部分。
而K字母的含义就是近邻的个数。在scikit-learn中,K最近邻算法的K值是通过N_neighbors参数来调节的,默认值是5.
K最近邻算法可以用于回归,原理和其用于分类是相同的。当我们使用K最近邻回归计算某个数据点的预测值时,模型会选择离该数据点最近的若干个数据集中的点,并将它们的y值取平均值,并把改平均值作为新数据点的预测值。
K最近邻算法的用法 |
- K最近邻算法在分类任务中的应用
在scikit-learn中,内置了若干个玩具数据集(Toy Datasets),还有一些API让我们可以自己动手生成一些数据集。
make_blobs生成的数据集一共有两类,其中一类紫色,而另一类黄色,这两类数据集可以看作机器学习的训练数据集,是已知的数据。我们就是基于这些数据用算法进行模型的训练,然后再对新的未知数据进行分类或者回归。
下面我们看看最近邻算法来拟合这些数据,
图中粉色区域和灰色区域组成的部分。如果有新的数据输入的话,模型就会自动将新数据分到对应的分类中。例如一个数据点的两个特征分别是6.75和4.82。
可以看出数据点被划分为浅色一类。
下面我们看一下分类结果打印:
- K最近邻算法处理多元分类任务
通过修好make_blobs的centers参数,把数据类型的数量增加到5个,同时修改n_samples参数,把样本数量也增加到500个:
可以看到新的数据集分类数量变成了5个,而其中有两类数据还有一些重合(图片中心位置的点),这时我们用K最近邻算法建立模型拟合这些数据:
可以看出,绝大部分数据点放置于正确的分类中,但是有一小部分数据还是进入了错误分类中,这些分类错误的数据点基本都是互相重合的位于图像中心位置的数据点。下面我们看看模型的正确率:
可以看出K最近邻算法用来分类效果还是不错的。
- K最近邻算法用于回归分析
在上次开头的数据集生成器中,可以用make_regression函数来生成数据集进行回归分析:
可以看到,横轴代表的是样本特征的数值,范围大概在-3 ~ 3;纵轴代表样本的测定值,范围大致在-250 ~ 250。我们使用K最近邻算法来进行回归分析:
直观来看,模型拟合程度不是很好,有大量的数据点没有被模型覆盖到。下面我们看看模型评分如何:
可以看出,模型的评分不是很好,我们尝试着减少分类(KNN默认为n_neighbors = 5)试试:
从上图可以看出,曲线覆盖了更多的点,也就是说,模型变得更加复杂了。接下来我们看看模型得分:
模型得分有所提高,看起来育德的数据会更加准确。
K最近邻算法项目实践——酒的分类 |
- 对数据集进行分析
首先我们把酒的数据集载入项目中并打印,看看数据集中包含了哪些东西。实际上load_wine函数载入的酒数据集,是一种Bunch对象,它包括键(keys)和数值(values):
从结果当中我们可以看出,酒数据集中包含“data”,目标分类“target”,目标分类名称“target_names”,数据描述“DESCR”,以及特征变量的名称“features_names”
看看究竟有多少样本(samples),又有多少变量(features),可以用.shape语句来让Python告诉我们数据的大概轮廓:
可以看出,酒数据集中总共有178个样本,每条数据有13个特征变量。进一步通过打印DESCR键来获得:
可以看出,酒数据集中的178个样本被归入3个类别中,分别是class_0,class_1和class_2,其中class_0包含59个样本,class_1中包含71个样本,class_2中包含48个样本等信息。
- 生成训练数据集合测试数据集
我们现在要做的是将数据集分为两个部分:一部分称为训练数据集,另一部分称为测试数据集。
在scikit-learn中,有一个train_test_split函数,它是用来帮助用户把数据集拆分的工具。其工作原理是:train_test_split函数将数据集进行随机排列,在默认情况下将其中75%的数据及所对应的标签划归到训练数据集,并将其余25%的的数据和所对应标签划归到测试数据集。
注意:我们一般用大写的X表示数据的特征,而用小写的y表示数据对应的标签。这是因为X是一个二维数组,也称为矩阵;而y是一个一维数组,或者说一个向量。
接下来将数据集进行拆分并打印结果:
上述代码中,我们看到了一个参数称为random_state,并且将它指定为0,。这是因为train_test_split函数会生成一个伪随机数,并根据这个伪随机数对数据集进行拆分。而我们有时候需要在一个项目中,让多次生成的伪随机数相同,方法就是通过固定random_state参数的数值,相同的random_state参数会一直生成同样的伪随机数,当这个值我们设置为0,或者保持缺省的时候,则每次生成的伪随机数均不同。
从结果可以看出,样本X数量和其对应的标签y数量均为133个,约占样本总数的74.7%,而测试数据集中的样本X数量和标签y数量均为45个,约占样本总数的25.3%。同时,不论在训练集中,还是在测试数据集中,特征变量都是13个。
- 使用K最近邻算法进行建模
K最近邻算法根据训练数据集进行建模,在训练数据集中寻找和新输入的数据最近的数据点,然后把这个数据点的标签分配给新的数据点,以此对新的样本进行分类。
在上图中,我们给KNeighborsClassifier指定一个参数,n_neighbors=1。正如前面所说的,在scikit-learn中,机器学习模块都是在其固定的类中运行的。而K最近邻分类算法是在neighbors模块中的KNeighborsClassifier类中运行。而我们从一个类中创建对象的时候,就需要指定一个参数。对于KNeighborsClassifier类来说,最关键的参数就是近邻的数量,也就是n_neighbors。而knn则是我们在KNeighborsClassifier类中创建的一个对象。
接下来我们就要使用这个叫作knn的对象中称为”拟合(fit)”的方法来进行建模,建模的依据就是训练数据集中的样本数据X_train和其对应的标签y_train,代码如下:
从图中我们可以看到knn拟合方法把自身作为结果返回给了我们。
- 使用模型对新样本的分类进行预测
现在我们可以使用刚刚建好的模型对新的样本分类进行预测,不过在此之前,可以先用测试数据集对模型进行打分,这就是我们创建测试数据集的目的。测试数据集并不参与建模,但是我们可以用模型对测试数据集进行分类,然后和测试数据集中的样本实际分类进行对比,看吻合度有多高,模型的得分越高,说明模型的预测越准确,满分是1.0。
假设一新酒测定的特征变量如下:
1) Alcohol | 13.2 |
---|---|
2) Malic acid | 2.77 |
3) Ash | 2.77 |
4) Alcalinity of ash | 2.51 |
5) Magnesium | 18.5 |
6) Totla phenols | 96.6 |
7) Flavanoids | 1.04 |
8) Nonflavanoid phenols | 2.55 |
9) Proanthocyanins | 1.47 |
10) Color intensity | 6.2 |
11) Hue | 1.05 |
12) OD280/OD315 of diluted wines | 3.33 |
13) Proline | 820 |
根据建好的模型将新酒进行分类:
模型把新酒分类预测为 class_2,虽然准确率只有76%,但对于第一个机器学习的实战项目来说,还是相当不错的。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184725.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...