1、数据集介绍
鸢尾花(Iris)数据集,是机器学习和统计学中一个经典的数据集。它包含在 scikit-learn 的 datasets 模块中。该数据集包含150条数据,每50条数据属于一个类别,即有三个类别,每一条数据有四个特征。
鸢尾花数据集iris包含3类鸢尾花,分别为山鸢尾(Iris-setosa)、杂色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。
每条数据包含4个特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal width)
2、引用库介绍
①
train_test_split
函数
train_test_split
函数是机器学习中一个非常重要的函数,它可以将数据集划分为训练集和测试集以下是该函数的详细说明:
train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)
*arrays: 单个数组或元组,表示需要划分的数据集。如果传入多个数组,则必须保证每个数组的第一维大小相同。
test_size: 测试集的大小(占总数据集的比例)。默认值为0.25,即将传入数据的25%作为测试集。
train_size: 训练集的大小(占总数据集的比例)。默认值为None,此时和test_size互补,即训练集的大小为(1-test_size)。
random_state: 随机数种子。可以设置一个整数,用于复现结果。默认为None。
shuffle: 是否随机打乱数据。默认为True。
stratify: 可选参数,用于进行分层抽样。传入标签数组,保证划分后的训练集和测试集中各类别样本比例与原始数据集相同。默认为None,即普通的随机划分。
返回值说明:
该函数返回一个元组
(X_train, X_test, y_train, y_test)
,其中X_train
表示训练集的特征数据,X_test
表示测试集的特征数据,y_train
表示训练集的标签数据,y_test
表示测试集的标签数据。
②KNeighborsClassifier
在sklearn库中,KNeighborsClassifier是实现K近邻算法的一个类,一般都使用欧式距离进行测量。
思路:一个样本在特征空间中与k个实例最为相似(即特征空间中最邻近),取K个数据示例的类别最多的为样本类别。
KNeighborsClassifier使用很简单,三步:
1)创建KNeighborsClassifier对象,
2)调用fit函数,
(使用KNeighborsClassifier 对象进行fit创建出模型,得出分类准确度)
3)调用predict函数进行预测。
(使用模型预测测试集)
③accuracy_score
sklearn.metrics是scikit-learn开发的用于评估分类、回归和聚类算法性能的模块之一,其中包括了多种常用的评估指标函数。accuracy_score(y_true, y_pred)是其中之一,用于计算分类模型的准确率,即分类正确的样本数除以总样本数。函数的参数含义如下:
y_true:真实的分类标签,可以是列表、数组、Pandas Series或其他可迭代对象。y_pred:模型预测的分类标签,需要与y_true格式相同。
accuracy_score()函数将返回一个0到1之间的单精度浮点数,表示分类模型的准确率。
④KNN算法
KNN(K-Nearest Neighbor)是最简单的机器学习算法之一,可以用于分类和回归,是一种监督学习算法。它的思路是这样,如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。也就是说,该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
KNN的初始函数(构造函数)的参数和默认参数是(n_neighbors=5,weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’,metric_params=None, n_jobs=1, **kwargs)
方法一:使用sklearn库
# 获取鸢尾花的数据
iris = datasets.load_iris()
# 切割80%训练和20%测试数据
iris_X_train, iris_X_test, iris_y_train, iris_y_test = train_test_split(iris.data, iris.target, test_size=0.2)
# 实现k-近邻算法,且k=4
k = 4
knn_classifier = KNeighborsClassifier(n_neighbors=k)
knn_classifier.fit(iris_X_train, iris_y_train)
# 进行预测
iris_y_pred = knn_classifier.predict(iris_X_test)
# 计算准确率
accuracy = accuracy_score(iris_y_test, iris_y_pred)
# 打印输出:实际分类、预测分类、准确率(保留两位有效位)
for actual, predicted in zip(iris_y_test, iris_y_pred):
print(f"实际分类: {actual}, 预测分类: {predicted}")
print(f"准确率: {accuracy:.2f}")
PS:
①切割数据集和训练集时,没有特别设置,默认打乱数据集
②
for actual, predicted in zip(iris_y_test, iris_y_pred):
这行代码使用了一个for
循环和zip
函数,将测试数据集的实际分类(真实标签)和模型预测的分类一一配对。这允许你同时迭代实际值和预测值。 在每次迭代中,actual
变量存储了实际的鸢尾花品种类别,而predicted
变量存储了模型的预测结果。这两个值被用于创建一条打印信息,显示了每个测试样本的实际分类和模型预测的分类。
输出结果:
实际分类: 0, 预测分类: 0
实际分类: 0, 预测分类: 0
实际分类: 2, 预测分类: 2
实际分类: 0, 预测分类: 0
实际分类: 0, 预测分类: 0
实际分类: 1, 预测分类: 1
实际分类: 1, 预测分类: 1
实际分类: 1, 预测分类: 1
实际分类: 1, 预测分类: 1
实际分类: 0, 预测分类: 0
实际分类: 1, 预测分类: 1
实际分类: 0, 预测分类: 0
实际分类: 2, 预测分类: 2
实际分类: 1, 预测分类: 1
实际分类: 0, 预测分类: 0
实际分类: 2, 预测分类: 2
实际分类: 0, 预测分类: 0
实际分类: 2, 预测分类: 2
实际分类: 2, 预测分类: 2
实际分类: 1, 预测分类: 1
实际分类: 1, 预测分类: 2
实际分类: 2, 预测分类: 1
实际分类: 2, 预测分类: 2
实际分类: 0, 预测分类: 0
实际分类: 1, 预测分类: 1
实际分类: 2, 预测分类: 2
实际分类: 2, 预测分类: 2
实际分类: 2, 预测分类: 2
实际分类: 1, 预测分类: 1
实际分类: 0, 预测分类: 0
准确率: 0.93
方法二:使用numpy
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 获取鸢尾花的数据
iris = datasets.load_iris()
# 切割80%训练和20%测试数据
iris_X_train, iris_X_test, iris_y_train, iris_y_test = train_test_split(iris.data, iris.target, test_size=0.2)
# 其中x为特征,y为目标
# 实现k-近邻算法,且k=4
k = 4
def euclidean_distance(x1, x2):
# 使用NumPy计算欧氏距离
return np.sqrt(np.sum((x1 - x2) ** 2))
def predict_knn(train_data, train_labels, test_data, k):
predictions = []
for test_point in test_data:
# 计算测试点与所有训练点的距离
distances = [euclidean_distance(test_point, train_point) for train_point in train_data]
# 获取距离最近的k个训练样本的索引
k_indices = np.argsort(distances)[:k]
# 获取这k个训练样本的标签
k_nearest_labels = [train_labels[i] for i in k_indices]
# 选择最常见的标签作为预测结果
prediction = np.bincount(k_nearest_labels).argmax()
predictions.append(prediction)
return predictions
# 进行预测
iris_y_pred = predict_knn(iris_X_train, iris_y_train, iris_X_test, k)
# 计算准确率
accuracy = accuracy_score(iris_y_test, iris_y_pred)
# 打印输出:实际分类、预测分类、准确率(保留两位有效位)
for actual, predicted in zip(iris_y_test, iris_y_pred):
print(f"实际分类: {actual}, 预测分类: {predicted}")
print(f"准确率: {accuracy:.2f}")