1. 探索数据
# 导入sklearn的包
from sklearn import datasets
# 导入time包,增加等待时间
import time
# 加载iris的数据
iris = datasets.load_iris()
# 显示iris的数据结构,共150行,4列
# 4列的内容分别是花萼长度,花萼宽度,花瓣长度,花瓣宽度
print(iris.data.shape)
(150, 4)
# 显示iris的数据结果
# print(iris.data)
iris.data[:6] #显示前6行数据
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5. , 3.6, 1.4, 0.2],
[5.4, 3.9, 1.7, 0.4]])
# iris.target用0、1和2三个整数分别代表了花的三个品种
# 三种花分别是山鸢尾花(Iris Setosa),变色鸢尾花(Iris Versicolor),维吉尼亚鸢尾花(Iris Virginica)
print(iris.target)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
2. 机器学习部分
import numpy as np
from sklearn import neighbors, datasets
# KNN中的K值,默认值是5
n_vecinos = 5
# 导入花的数据
iris = datasets.load_iris()
# 保留花萼长度,花萼宽度,花瓣长度,花瓣宽度,给予X
X = iris.data[:,:2]
# 将目标属性赋予y
y = iris.target
#应用KNN Classifier
clf = neighbors.KNeighborsClassifier(n_vecinos, weights='distance')
# weights参数是用于预测的权重函数。可选参数如下:
# - ‘uniform’ : 统一的权重. 在每一个邻居区域里的点的权重都是一样的。
# - ‘distance’ : 权重点等于他们距离的倒数。使用此函数,更近的邻居对于所预测的点的影响更大。
# - [callable] : 一个用户自定义的方法,此方法接收一个距离的数组,然后返回一个相同形状并且包含权重的数组。
clf
# 显示模型的一些参数,算法使用默认的 ‘auto’,停止建子树的叶子节点阈值leaf_size为默认值30,距离度量metric使用闵可夫斯基距离 “minkowski”,距离度量附属参数p=2,所以是欧氏距离;
# 距离度量其他附属参数metric_params为无None,并行处理任务数n_jobs为1,即所有的CPU核都参与计算。权重weights选择的是distance
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='distance')
# 使用X作为训练数据,y作为目标值来拟合模型。
clf.fit(X, y)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='distance')
# np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的merge()。
a, b = map(int, input("请分别输入花萼长度,花萼宽度,以空格分割").split())
print("你输入的花萼长度是: "+ str(a))
print("你输入的花萼宽度是: "+ str(b))
请分别输入花萼长度,花萼宽度,以空格分割 8 2
你输入的花萼长度是: 8
你输入的花萼宽度是: 2
nuevo_dato = np.c_[a, b]
nuevo_dato
array([[8, 2]])
# 给提供的数据预测对应的标签。
clase_predicha = clf.predict(nuevo_dato)
# 返回给定测试数据和标签的平均准确值。
print(clf.score(X,y))
# 预测的准确值非常高,证明结果比较好
0.9266666666666666
flower = np.array(["山鸢尾花(Iris Setosa)", "变色鸢尾花(Iris Versicolor)", "维吉尼亚鸢尾花(Iris Virginica)"])
print("根据您输入的各项数据," + "预测您的花是" + str(flower[clase_predicha]))
time.sleep(3)
print("我们机器学习模型预测的准确值如下图:")
time.sleep(3)
根据您输入的各项数据,预测您的花是['维吉尼亚鸢尾花(Iris Virginica)']
我们机器学习模型预测的准确值如下图:
3. 绘图
# 加载包
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
# 指定绘图颜色,颜色映射
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
X = iris.data[:,:2]
y = iris.target
clf = neighbors.KNeighborsClassifier(n_vecinos, weights='distance')
clf.fit(X, y)
#nuevo_dato = np.c_[8, 4]
#clase_predicha = clf.predict(nuevo_dato)
h = .02 # step size in the mesh
weights='distance'
# 确认训练集的边界
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, h),
np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
# 画出测试集数据
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
# 也画出所有的训练集数据
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold,
edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("3-Class classification (k = %i, weights = '%s')"
% (n_vecinos, weights))
plt.show()
# 生成的图如下,大多数数据拟合不错,仅有少量的异常点不在范围内。