大家好,又见面了,我是你们的朋友全栈君。
实验一:鸢尾花数据集分类
利用机器学习算法构建模型,根据鸢尾花的花萼和花瓣大小,区分鸢尾花的品种。实现一个基础的三分类问题。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
iris_data = load_iris()
# 该函数返回一个Bunch对象,它直接继承自Dict类,与字典类似,由键值对组成。
# 可以使用bunch.keys(),bunch.values(),bunch.items()等方法。
print(type(iris_data))
# data里面是花萼长度、花萼宽度、花瓣长度、花瓣宽度的测量数据,格式为 NumPy数组
print(iris_data['data']) # 花的样本数据
print("花的样本数量:{}".format(iris_data['data'].shape))
print("花的前5个样本数据:{}".format(iris_data['data'][:5]))
# 0 代表 setosa, 1 代表 versicolor,2 代表 virginica
print(iris_data['target']) # 类别
print(iris_data['target_names']) # 花的品种
# 构造训练数据和测试数据
X_train,X_test,y_train,y_test = train_test_split(\
iris_data['data'],iris_data['target'],random_state=0)
print("训练样本数据的大小:{}".format(X_train.shape))
print("训练样本标签的大小:{}".format(y_train.shape))
print("测试样本数据的大小:{}".format(X_test.shape))
print("测试样本标签的大小:{}".format(y_test.shape))
# 构造KNN模型
knn = KNeighborsClassifier(n_neighbors=1)
# knn = KNeighborsClassifier(n_neighbors=3)
# 训练模型
knn.fit(X_train,y_train)
y_pred = knn.predict(X_test)
# 评估模型
print("模型精度:{:.2f}".format(np.mean(y_pred==y_test)))
print("模型精度:{:.2f}".format(knn.score(X_test,y_test)))
# 做出预测
X_new = np.array([[1.1,5.9,1.4,2.2]])
prediction = knn.predict(X_new)
print("预测的目标类别是:{}".format(prediction))
print("预测的目标类别花名是:{}".format(iris_data['target_names'][prediction]))
KNN,全称为K Nearest Neighbors,又叫K最近邻算法,是机器学习算法中最简单的分类算法之一。其核心思想是,如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一类别,则该样本也属于这个类别,并具有这个类别上样本的特性。K就是最近的样本的个数,其取值至关重要,关系最终的分类结果。
如上图所示,绿色的点为要进行分类的点。如果K=3,与之最近的三个点中,蓝色三角形多,那么绿色的点被归为蓝色三角形一类;如果K=5,与之最近的五个点中,红色圆形多,那么绿色的点被归为红色圆形一类。从此可以得出,K值的选取将影响分类结果。
另外一个重要的因素是点距离的计算。常见的距离度量方式有曼哈顿距离、欧式距离等等。通常KNN采用欧式距离。以二维平面为例,二维空间中两个点的欧式距离计算公示如下:
将其拓展到多维空间,公示则变为如下:
KNN简单的将预测点与所有点距离进行计算后排序,选出前面K个值查看类别,类别多的自然归类。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125624.html原文链接:https://javaforall.cn