K最近邻算法(KNN)

正如俗话说----近朱者赤,近墨者黑,想象一下我们的数据集里面有一半是“朱”,一半是“墨”,现在有了一个新数据点,我们怎么判断它属于哪一个分类?

下面就引出了KNN的原理:新数据点离谁最近,就和谁属于同一类

所以说KNN是非常简单的算法,也是新手入门机器学习的简单算法

#导入数据集生成器

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的数据集

data = make_blobs(n_samples=200,centers=2,random_state=8)

import numpy as np

x, y = data

#将生成的数据集进行可视化

plt.scatter(x[:,0],x[:,1],c=y,cmap=plt.cm.spring,edgecolor='k')

plt.show

#使用KNN来拟合这些数据,也叫做创建分类模型

clf = KNeighborsClassifier()

clf.fit(x,y)

#下面的代码用于画图

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

y_min, y_max = x[:, 0].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.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='r', s=200)

plt.show()

#KNN处理多元分类任务

#生成样本数为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()

clf = KNeighborsClassifier()

clf.fit(x2, y2)

#下面的代码用于画图

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

y_min, y_max = x2[:, 0].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.show()

#那么模型的正确率有多高呢?

clf.score(x2, y2)

KNN用于回归分析

#导入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()

下面使用KNN进行回归分析

#导入回归分析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()

对模型进行评分

为了提高分数,我们将KNN的n_neighbors(近邻数)减少, 近邻数默认为5

from sklearn.neighbors import KNeighborsRegressor

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(

我们再来看看评分

KNN项目实战----酒的分类

from sklearn.datasets import load_wine

#从datasets中载入酒的数据集

wine_dataset = load_wine()

实际上load_wine()函数载入的数据集是一种Bunch对象,它包括keys和values

我们看看数据集中究竟有多少样本和变量

打印酒的数据集中的简短描述

生成训练数据集和测试数据集

#导入数据集拆分工具

from sklearn.model_selection import train_test_split

#将数据集拆分为训练数据集和测试数据集

x_train, x_test, y_train, y_test = train_test_split(wine_dataset['data'], wine_dataset['target'], random_state=0)

下面看看拆分后的数据集大概是个什么情况

使用KNN进行建模

#导入KNN分类模型

from sklearn.neighbors import KNeighborsClassifier

#指定模型的n_neighbors参数值为1

knn = KNeighborsClassifier(n_neighbors = 1)

接下来我们要使用knn对象中称为拟合(fit)的方法来进行建模,建模的 依据就是x_train和y_train

使用模型对新样本的分类进行预测

#下面我们用建好的模型对新酒做出分类预测

import numpy as np

#输入新的数据点

x_new = np.array([[13.2, 2.77, 2.51, 18.5, 96.6, 1.04, 2.55, 0.57, 1.47, 6.2, 1.05, 3.33, 820]])

#使用predict()进行预测

prediction = knn.predict(x_new)

#接下来看新酒属于哪个分类

wine_dataset['target_names'][prediction]

结果分析:模型把新酒的分类预测为class_2,虽然准确率只有76%,但对于我们机器学习新手入门实战项目来说,还是相当不错的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容