深入浅出机器学习实战(1)-基于python工具包的使用-KNN分类器

准备入门机器学习,看了一些书,这里找了一些实战案例更加深入了解机器学习。下面是一个使用自己建造的数据集,来尝试一下机器学习中KNN算法的二分类问题。

# -*- coding:UTF-8 -*-
from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import numpy as np
#   生成一个200个样本的数据集,分成2类,为了每次结果一致,设定一个随机种子
data = make_blobs(n_samples=200, centers=2, random_state=8)
X, y = data
'''
###    画出数据点,使用春季的色彩映射
###    c=y 指定了每个样本点的颜色,颜色将根据类别标签 y 的值而变化
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.spring, edgecolors='k')
plt.show()
'''
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))
xy = np.c_[xx.ravel(), yy.ravel()]   #`xx.ravel()`和`yy.ravel()`将二维数组`xx`和`yy`展平为一维数组。这是因为分类器通常接受一维的输入数据
                                    #`np.c_[xx.ravel(), yy.ravel()]`将展平后的`xx`和`yy`数组按列连接起来,生成一个新的二维数组。这个数组的每一行表示一个样本点的坐标。
Z = clf.predict(xy)
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.summer)   #  设置不同区域画布的颜色
plt.scatter(X[:, 0], X[:, 1],c=y, cmap=plt.cm.spring, edgecolors='k')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title('Classifier:KNN')
plt.scatter(6.75, 4.86, marker='*', c='red', s=220)  #  用一个数据点测试一下分类结果
plt.show()
print('新数据点的分类是:', clf.predict([[6.75, 4.86]]))

KNN不仅可以用于二分类问题,当然也可以用于多分类问题。下面是使用KNN解决的一个多分类问题, 这里用的是5种分类问题,加深对KNN解决问题的理解。

# -*- coding:UTF-8 -*-
from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import numpy as np
#   生成一个500个样本的数据集,分成5类,为了每次结果一致,设定一个随机种子
data = make_blobs(n_samples=500, centers=5, random_state=8)
X, y = data
###    画出数据点,使用春季的色彩映射
###    c=y 指定了每个样本点的颜色,颜色将根据类别标签 y 的值而变化
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.spring, edgecolors='k')
plt.show()

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))
xy = np.c_[xx.ravel(), yy.ravel()]   #`xx.ravel()`和`yy.ravel()`将二维数组`xx`和`yy`展平为一维数组。这是因为分类器通常接受一维的输入数据
                                     #`np.c_[xx.ravel(), yy.ravel()]`将展平后的`xx`和`yy`数组按列连接起来,生成一个新的二维数组。这个数组的每一行表示一个样本点的坐标。
Z = clf.predict(xy)                  # 对结果进行预测
Z = Z.reshape(xx.shape)              # 将结果的形式进行改变
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.summer)   #  设置不同区域画布的颜色
plt.scatter(X[:, 0], X[:, 1],c=y, cmap=plt.cm.spring, edgecolors='k')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title('Classifier:KNN')
plt.show()
print('模型正确率:{:.2f}'.format(clf.score(X, y)))

下面是通过调用网上酒的数据集,使用工具包对于KNN的运用,实现对于3种酒的一种分类方式。 

# -*- coding:UTF-8 -*-
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split   #数据拆分工具,默认将数据集75%分成训练集,25%分成测试集
wine_data = load_wine()
print('数据概况:{}'.format(wine_data['data'].shape))   # 第一个数据代表样本数量,第二个数据代表特征数量
print(wine_data['DESCR'])   # 简单展示一下数据集中的信息
x_train, x_test, y_train, y_test = train_test_split(wine_data['data'],wine_data['target'], random_state=0)
print('x_train_shape:{}'.format(x_train.shape))   # 打印训练集特征向量的形态
print('x_test_shape:{}'.format(x_test.shape))   # 打印测试集特征向量的形态
print('y_train_shape:{}'.format(y_train.shape))   # 打印训练集目标的形态
print('y_test_shape:{}'.format(y_test.shape))   # 打印测试集目标的形态

knn = KNeighborsClassifier(n_neighbors=1)   # 指定模型的近邻数为1
knn.fit(x_train, y_train)
# 打印模型的得分,得分越高,拟合效果越好
print('测试集得分:{:.2f}'.format(knn.score(x_test, y_test)))

# 自己构造一组新酒的数据,用来测试模型
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]])
prediction = knn.predict(x_new)
print('预测新酒的分类为;{}'.format(wine_data['target_names'][prediction]))

 能力有限,代码是参考深入浅出机器学习一书中的代码与书中提到的分类和一些回归问题。还望大家继续鼓励支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big-Sunny-Boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值