K近邻算法用作回归的使用介绍(使用Python代码)

栏目: 数据库 · 发布时间: 6年前

内容简介:在我遇到的所有机器学习算法中,KNN是最容易上手的。尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样)。甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更擅长用于分类问题。我很少看到KNN在任何回归任务上实现。

K近邻算法用作回归的使用介绍(使用 <a href='https://www.codercto.com/topics/20097.html'>Python</a> 代码)

介绍

在我遇到的所有机器学习算法中,KNN是最容易上手的。尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样)。

甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更擅长用于分类问题。我很少看到KNN在任何回归任务上实现。 我在这里的目的是说明并强调,当目标变量本质上是连续的时,KNN是如何有效的运作的。

K近邻算法用作回归的使用介绍(使用Python代码)

在本文中,我们将首先了解KNN算法背后的思维,研究计算点与点之间距离的不同方法,然后最终在Big Mart Sales数据集上用Python实现该算法。让我们动起来吧

1.用简单的例子来理解KNN背后的逻辑

让我们从一个简单的例子开始。请考虑下表 - 它包含10人的身高,年龄和体重(目标)值。如你所见,缺少ID11的重量值。我们需要根据他们的身高和年龄来预测这个人的体重。

注意:此表中的数据不代表实际值。它仅用作一个例子来解释这个概念。

K近邻算法用作回归的使用介绍(使用Python代码)

为了更清楚地了解这一点,下面是上表中高度与年龄的关系图:

K近邻算法用作回归的使用介绍(使用Python代码)

在上图中,y轴表示人的身高(以英尺为单位),x轴表示年龄(以年为单位)。这些点是根据ID值进行编号。黄点(ID 11)是我们的测试点。

如果我要求你根据图来确定ID11的重量,你的答案会是什么?你可能会说,因为ID11 更接近第 5点和第1点,所以它必须具有与这些ID类似的重量,可能在72-77千克之间(表中ID1和ID5的权重)。这实际上是有道理的,但你认为算法会如何预测这些值呢?让我们在下边进行试验讨论。

2. KNN算法是怎样工作的

如上所述,KNN可用于分类和回归问题。该算法使用“ 特征相似性 ”来预测任何新数据点的值。这意味着新的点将根据其与训练集中的点的接近程度而进行分配。从我们的例子中,我们知道ID11的高度和年龄类似于ID1和ID5,因此重量也大致相同。

如果这是一个分类问题,我们会采用该模式作为最终预测。在这种情况下,我们有两个重量值--72和77.猜猜最终值是如何计算的?是取两个重量的平均值来作为最终的预测值。

以下是该算法的逐步说明:

  1. 首先,计算新的点与每个训练点之间的距离。

K近邻算法用作回归的使用介绍(使用Python代码)

  1. 选择最接近的k个数据点(基于距离)。在我们演示的例子中,如果k的值为3,则将选择点1,5,6。我们将在本文后面进一步探索选择正确的k值的方法。

K近邻算法用作回归的使用介绍(使用Python代码)

  1. 这些数据点的平均值是新点的最终预测值。在这里,我们的ID11的重量为 =(77 + 72 + 60)/ 3 = 69.66千克。

在接下来的几节中,我们将详细讨论这三个步骤中的每一个。

3.点与点之间距离的计算方法

所述 第一步骤 是计算新点和每个训练点之间的距离。计算该距离有多种方法,其中最常见的方法是 - 欧几里德,曼哈顿(用于连续)和汉明距离(用于分类)。

  1. 欧几里德距离: 欧几里德距离计算为新点(x)和现有点(y)之间的差的平方和的平方根。
  2. 曼哈顿距离 :这是实际向量之间的距离,使用它们的绝对差值之和表示。

K近邻算法用作回归的使用介绍(使用Python代码)

  1. 汉明距离 :用于分类变量。如果值(x)和值(y)相同,则距离D将等于0。否则D = 1。

K近邻算法用作回归的使用介绍(使用Python代码)

一旦一个新的观测值与我们训练集中的点之间的距离被测量出来,下一步就是要选择最近的点。要考虑的点的数量由k的值定义。

4.如何选择k因子

第二个步骤是选择k值。这决定了我们在为任何新的观察值赋值时所要考虑到的邻居的数量。

在我们的示例中,k值 = 3,最近的点是ID1,ID5和ID6。

K近邻算法用作回归的使用介绍(使用Python代码)

K近邻算法用作回归的使用介绍(使用Python代码)

ID11的重量预测将是:

ID11 =(77 + 72 + 60)/ 3

ID11 = 69.66千克

如果k的值 = 5的话,那么距离最近的点将是ID1,ID4,ID5,ID6,ID10。

K近邻算法用作回归的使用介绍(使用Python代码)

K近邻算法用作回归的使用介绍(使用Python代码)

那么ID11的预测将是:

ID 11 =(77 + 59 + 72 + 60 + 58)/ 5

ID 11 = 65.2千克

我们注意到,基于k值,最终结果将趋于变化。那我们怎样才能找出k的最优值呢?让我们根据我们的训练集和验证集的误差计算来决定它(毕竟,最小化误差是我们的最终目标!)。

请看下面的图表,了解不同k值的训练误差和验证误差。

K近邻算法用作回归的使用介绍(使用Python代码)

K近邻算法用作回归的使用介绍(使用Python代码)

对于非常低的k值(假设k = 1),模型过度拟合训练数据,这导致验证集上的高错误率。另一方面,对于k的高值,该模型在训练集和验证集上都表现不佳。如果仔细观察,验证误差曲线在k = 9的值处达到最小值。那么该k值就是是模型的最佳K值(对于不同的数据集,它将有所不同)。该曲线称为“ 肘形曲线 ”(因为它具有类似肘部的形状),通常用于确定k值。

你还可以使用网格搜索技术来查找最佳k值。我们将在下一节中实现这一点。

5.处理数据集(Python代码)

到目前为止,你应该清楚的了解这个算法。我们现在将继续在数据集上实现该算法。我使用Big Mart销售数据集来进行代码实现,你可以从此 链接 下载它,邀请码为b543。

1.阅读文件

import pandas as pd

df = pd.read_csv('train.csv')

df.head()

2.计算缺失值

df.isnull().sum()

输入Item_weight和Outlet_size中缺少的值

mean = df['Item_Weight'].mean() #imputing item_weight with mean

df['Item_Weight'].fillna(mean, inplace =True)

mode = df['Outlet_Size'].mode() #imputing outlet size with mode

df['Outlet_Size'].fillna(mode[0], inplace =True)

3.处理分类变量并删除id列

df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1, inplace=True)

df = pd.get_dummies(df)

4.创建训练集和测试集

from sklearn.model_selection import train_test_split

train , test = train_test_split(df, test_size = 0.3)

x_train = train.drop('Item_Outlet_Sales', axis=1)

y_train = train['Item_Outlet_Sales']

x_test = test.drop('Item_Outlet_Sales', axis = 1)

y_test = test['Item_Outlet_Sales']

5.预处理 - 扩展功能

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))

x_train_scaled = scaler.fit_transform(x_train)

x_train = pd.DataFrame(x_train_scaled)

x_test_scaled = scaler.fit_transform(x_test)

x_test = pd.DataFrame(x_test_scaled)

6.查看不同K值的错误率

导入所需要的包

from sklearn import neighbors

from sklearn.metrics import mean_squared_error 

from math import sqrt

import matplotlib.pyplot as plt

%matplotlib inline

rmse_val = [] #存储不同K值的RMSE值

for K in range(20):

K = K+1

model = neighbors.KNeighborsRegressor(n_neighbors = K)

model.fit(x_train, y_train) #合适的模型

pred=model.predict(x_test) #对测试集进行测试

error = sqrt(mean_squared_error(y_test,pred)) #计算RMSE值

rmse_val.append(error) #存储RMSE值

print('RMSE value for k= ' , K , 'is:', error)

输出:

RMSE value for k = 1 is: 1579.8352322344945

RMSE value for k = 2 is: 1362.7748806138618

RMSE value for k = 3 is: 1278.868577489459

RMSE value for k = 4 is: 1249.338516122638

RMSE value for k = 5 is: 1235.4514224035129

RMSE value for k = 6 is: 1233.2711649472913

RMSE value for k = 7 is: 1219.0633086651026

RMSE value for k = 8 is: 1222.244674933665

RMSE value for k = 9 is: 1219.5895059285074

RMSE value for k = 10 is: 1225.106137547365

RMSE value for k = 11 is: 1229.540283771085

RMSE value for k = 12 is: 1239.1504407152086

RMSE value for k = 13 is: 1242.3726040709887

RMSE value for k = 14 is: 1251.505810196545

RMSE value for k = 15 is: 1253.190119191363

RMSE value for k = 16 is: 1258.802262564038

RMSE value for k = 17 is: 1260.884931441893

RMSE value for k = 18 is: 1265.5133661294733

RMSE value for k = 19 is: 1269.619416217394

RMSE value for k = 20 is: 1272.10881411344

根据K值绘制RMSE值

curve = pd.DataFrame(rmse_val) #elbow curve

curve.plot()

K近邻算法用作回归的使用介绍(使用Python代码)

正如我们所讨论的,当我们取k = 1时,我们得到一个非常高的RMSE值。随着我们增加k值,RMSE值不断减小。在k = 7时,RMSE约为1219.06,并且随着K值在进一步增加,RMSE值会迅速上升。我们可以有把握地说,在这种情况下,k = 7会给我们带来最好的结果。

这些是使用我们的训练数据集进行的预测。现在让我们预测测试数据集的值并进行提交。

7.对测试数据集的预测

阅读测试和提交文件

test = pd.read_csv('test.csv')

submission = pd.read_csv('SampleSubmission.csv')

submission['Item_Identifier'] = test['Item_Identifier']

submission['Outlet_Identifier'] = test['Outlet_Identifier']

预处理测试数据集

test.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1, inplace=True)

test['Item_Weight'].fillna(mean, inplace =True)

test = pd.get_dummies(test)

test_scaled = scaler.fit_transform(test)

test = pd.DataFrame(test_scaled)

预测测试集并创建提交文件

predict = model.predict(test)

submission['Item_Outlet_Sales'] = predict

submission.to_csv('submit_file.csv',index=False)

在提交此文件后,我得到的RMSE为1279.5159651297。

8.实现GridsearchCV

为了确定k的值,每次绘制肘部曲线是一个繁琐且繁琐的过程。 你只需使用gridsearch即可简单的找到最佳值。

from sklearn.model_selection import GridSearchCV

params = {'n_neighbors':[2,3,4,5,6,7,8,9]}

knn = neighbors.KNeighborsRegressor()

model = GridSearchCV(knn, params, cv=5)

model.fit(x_train,y_train)

model.best_params_

输出:

{'n_neighbors': 7}

6.结束语和其他资源

在本文中,我们介绍了KNN算法的工作原理及其在Python中的实现。它是最基本但最有效的机器学习技术之一。并且在本文中,我们是直接调用了Sklearn库中的KNN模型,如果你想更仔细的研究一下KNN的话,我建议你可以手敲一下有关KNN的源代码。

本文作者介绍了如何使用KNN算法去进行完成回归任务,大家如果感兴趣的话,可以跟着本文敲一遍代码,进行练习,毕竟看10篇文章也不如去敲一遍代码,毕竟看文章看看也就过去了,如果敲一遍代码的话,就会加深自己的印象,如果想深入的去了解KNN算法的话,可以自己去研究一下KNN的源代码,然后敲一遍,我们后边也会放出有关KNN源代码的文章,当然其他算法的文章我们也会发布,请大家到时候多多捧场。

A Practical Introduction to K-Nearest Neighbors Algorithm for Regression (with Python code)


以上所述就是小编给大家介绍的《K近邻算法用作回归的使用介绍(使用Python代码)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Realm of Racket

Realm of Racket

Matthias Felleisen、Conrad Barski M.D.、David Van Horn、Eight Students Northeastern University of / No Starch Press / 2013-6-25 / USD 39.95

Racket is the noble descendant of Lisp, a programming language renowned for its elegance and power. But while Racket retains the functional goodness of Lisp that makes programming purists drool, it wa......一起来看看 《Realm of Racket》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具