Python机器学习——K最近邻算法(入门)

本文转自本人公众号,以后技术类文章以CSDN为主,微信同步更新链接
       最近报名参加了一个机器学习的训练营,是由大佬崔神和Kaggle大牛联合举办的,旨在于学习掌握机器学习的根本原理,编程语言只是一个工具,对于高数、线代要求较高,自己一方面跟着大佬学习,另一方面也看了看相关参考书,结合Python进行机器学习,作为新手,好多术语都不太了解,如题目所言,本文重在于讲述K最近邻算法在Python中的应用。
       何为K最近邻算法呢,通俗点将,近朱者赤近墨者黑,而K就是最近邻的个数。

#导入数据集生成器
from sklearn.datasets import make_blobs
#导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
# 导入画图工具
import matplotlib.pyplot as plt
# 导入数据集拆分工具
from sklearn.model_selection import train_test_split
# 生成样本数为200,分类为2,随机种子为8的数据集
data = make_blobs(n_samples=200,centers=2,random_state=8)
X,y = data
# 将生成的数据集进行可视化
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.spring,edgecolors='k')
plt.show()

       在这段代码中,我们用scikit-learn的make_blobs函数生成了一个样本数量为200,分类数量为2的数据集,并赋值给X,y,其中二者皆为矩阵,y的数值均为0和1,代表两类,结果如图所示:
Python机器学习——K最近邻算法(入门)_第1张图片
这是我们自己生成的数据,我们腰通过K最近邻算法对新的数据进行分类,也就是回归。

import numpy as np
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
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.spring)
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 = 'black',s = 200)
plt.show()

运行代码后如图所示:
Python机器学习——K最近邻算法(入门)_第2张图片
       可以看到,我们创建了一个分类模型,分为红色和黄色,黑色的五角星为我们需要预测的数据点,它的特征值为6.75和4.82,可以看到,它位于黄色一类,采用程序验证一下:

# 对新数据点分类进行判断
print('\n\n\n')
print('代码运行结果是:  ')
print('=================================')
print('新数据点的分类是:',clf.predict([[6.75,4.82]]))
print('=================================')
print('\n\n\n')

结果显示:

代码运行结果是:  
=================================
新数据点的分类是: [1]
=================================

可以看到,结果显示还是不错的,但是这次任务太简单,接下来增加难度试试。

K最近邻算法处理多元分类任务

增加难度,数据类型增加到5个,同时样本数量增加到500个:

#生成样本数为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()
运行代码后结果显示:

Python机器学习——K最近邻算法(入门)_第3张图片
可以看到,数据点分为了5类,中间还有重合部分,再次拟合数据:

import numpy as np
clf2 = KNeighborsClassifier()
clf2.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 = clf2.predict(np.c_[xx.ravel(),yy.ravel()])
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx,yy,Z,cmap=plt.cm.spring)
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 = 'black',s = 200)
plt.show()

结果如图所示:
Python机器学习——K最近邻算法(入门)_第4张图片
可以看到,K最近邻算法仍然可以将大部分数据点进行分类,但是中间的一些数据点发生重合,产生错误,看看正确率有多高呢:

# 将模型的评分进行打印
print('\n\n\n')
print('代码运行结果: ')
print('==============================')
print('模型正确率:{:.2f}'.format(clf2.score(X2,y2)))
print('==============================')
print('\n\n\n')
代码运行结果: 
==============================
模型正确率:0.96
==============================

这个正确率还是很高的,接下来,进行回归分析,看看效果如何。

K最近邻算法用于回归分析

首先依然生成数据集,代码如下:

# 导入make_regression数据集生成器
from sklearn.datasets import make_regression
# 生成特征数量为1,噪音为50的数据集
X,y = make_regression(n_features=1,n_informative=1,noise=50,random_state=8)
# 用散点图将数据点进行可视化
plt.scatter(X,y,c='orange',edgecolor='k')
plt.show()

为了方便画图,特征数量选择一个,噪音为50,结果如图所示:
Python机器学习——K最近邻算法(入门)_第5张图片
接下来用K最近邻算法进行回归分析,输入代码:

# 导入用于回归分析的KNN模型
from sklearn.neighbors import KNeighborsRegressor
reg = KNeighborsRegressor()
# 用KNN模型拟合数据
reg.fit(X,y)
# 把预测结果用图像进行可视化
z = np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X,y,c='orange',edgecolor='k')
plt.plot(z,reg.predict(z),c='k',linewidth=3)
# 向图像添加标题
plt.title('KNN Regressor')
plt.show()

运行后:
Python机器学习——K最近邻算法(入门)_第6张图片
黑色的曲线就代表K最近邻算法拟合生成的数据模型,看看评分如何:

print('\n\n\n')
print('代码运行结果:  ')
print('==============================')
print('模型评分: {:.2f}'.format(reg.score(X,y)))
print('==============================')
print('\n\n\n')
代码运行结果:  
==============================
模型评分: 0.77
==============================

分数只有0.77,不太理想,我们减少K值到2:

from sklearn.neighbors import KNeighborsRegressor
# 减少模型的n_neighbors参数为2,默认是5
reg2 = KNeighborsRegressor(n_neighbors=2)
reg2.fit(X,y)
plt.scatter(X,y,c='orange',edgecolor='k')
plt.plot(z,reg2.predict(z),c='k',linewidth=3)
plt.title('KNN Regressor:n_neighbors=2')
plt.show()

Python机器学习——K最近邻算法(入门)_第7张图片
发现比起上次,黑色曲线覆盖了更多的数据点,模型变得更加复杂,相对的,更加准确了,看看评分:

print('\n\n\n')
print('代码运行结果:  ')
print('==============================')
print('模型评分: {:.2f}'.format(reg2.score(X,y)))
print('==============================')
print('\n\n\n')
代码运行结果:  
==============================
模型评分: 0.86
==============================

       可以看到,分数变为了0.86,还是有点提高,在之后的文章中,将采用更加实际的例子来应用K最近邻算法。
       机器学习所需要掌握很多知识,这也无形中提高了入门的门槛,每当想要放弃的时候,看看招聘广告诱人的薪水和自己现有可怜的工资,继续努力学习吧!

你可能感兴趣的:(个人学习)