K近邻算法
算法描述
KNN算法的核心思想是,在一个含未知样本的空间,可以根据离这个样本最邻近的k个样本的数据类型来确定样本的数据类型。KNN(K-Nearest Neighbors)算法是一种常用的分类和回归算法。它基于实例之间的相似性进行预测或分类。KNN算法的基本思想是,对于一个未知样本,通过计算其与训练集中所有样本的距离,找出与其最近的K个样本,然后根据这K个样本的标签进行预测或分类。计算距离:对于一个未知样本,计算它与训练集中所有样本的距离。常用的距离度量方法有欧氏距离、曼哈顿距离等。选择K值:确定K的取值,即选择最近的K个样本作为预测或分类的依据。投票决策:根据K个最近样本的标签进行投票决策,选择出现次数最多的标签作为预测结果。输出结果:将预测结果返回。
数据集描述
数据集名称
-
威斯康星乳腺癌数据集 (Wisconsin Breast Cancer Dataset)
数据集来源
-
数据集最初来自威斯康星大学医院,用于预测乳腺癌的良恶性。
数据集大小
- 通常包含569个样本,每个样本有30个特征,加上一个目标标签(肿瘤是良性还是恶性)。
特征
- 数据集中的30个特征是对从细针抽吸(FNA)的数字化乳腺肿块图像中计算得出的细胞核的特性。这些特征包括细胞核的平均半径、纹理、周长、面积、平滑度、紧凑性、凹度、凹点、对称性、分形维度等。
目标标签
- 目标标签是一个二元分类标签,指示肿瘤是良性的(标签为0)还是恶性的(标签为1)。
数据集特点
这个数据集是一个二元分类问题的经典示例,适用于各种机器学习算法,包括逻辑回归、支持向量机、决策树、随机森林和神经网络等。由于数据集相对较小且特征数量适中,因此它适合作为教学和实验的基础
大致过程
首先导包,加入必要的包库:
from sklearn.datasets import load_breast_cancer#'''用于加载乳腺癌数据集'''
from sklearn.model_selection import train_test_split#'''将数据集划分为训练集和测试集'''
from sklearn.preprocessing import StandardScaler#'''特征标准化'''
from sklearn.neighbors import KNeighborsClassifier#'''实现K-近邻算法'''
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score#'''评估分类模型的性能'''
然后是加载数据集,提取特征和标签;对数据集进行划分,训练集和测试集(这里设置的是1:3的比例,30%的训练集和70%的测试集);
接下来是对数据的预处理,进行标准化;由于K近邻算法是基于距离度量的,如果特征之间的尺度差异很大,那么距离计算可能会被具有较大尺度的特征主导,从而影响到KNN算法的性能。数据进行求均值是为了消除不同特征之间的量纲差异,并减小异常值对算法结果的影响,从而提高KNN算法的准确性和鲁棒性。
之后是创建KNN分类器对象,对训练集和测试集分别进行训练预测;
最后输出分类报告(混淆矩阵、精确率(Precision)、召回率(Recall)、F1分数(F1 Score)支持数(Support)、准确率(Accuracy));
这里小编通过import matplotlib.pyplot as plt对真实标签和预测标签进行一个可视化的表示。
代码案例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer#'''用于加载乳腺癌数据集'''
from sklearn.model_selection import train_test_split#'''将数据集划分为训练集和测试集'''
from sklearn.preprocessing import StandardScaler#'''特征标准化'''
from sklearn.neighbors import KNeighborsClassifier#'''实现K-近邻算法'''
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score#'''评估分类模型的性能'''
'''加载乳腺癌数据集'''
data = load_breast_cancer()
'''提取特征和标签'''
X = data.data
y = data.target
'''划分训练集和测试集'''
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()
'''对训练集特征进行标准化'''
X_train = scaler.fit_transform(X_train)
'''对测试集特征进行标准化(使用训练集得到的均值和标准差)'''
X_test = scaler.transform(X_test)
'''创建KNN分类器对象'''
knn = KNeighborsClassifier(n_neighbors=7)
knn.fit(X_train, y_train)#'''训练模型'''
y_pred = knn.predict(X_test)#'''预测模型'''
print('返回预测标签:',y_pred)
'''评估模型'''
print("Confusion Matrix:")#'''计算混淆矩阵,显示模型预测的正负样本与真实正负样本的对比'''
print(confusion_matrix(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
print("\nAccuracy:")
print(accuracy_score(y_test, y_pred))
sample_indices = np.random.choice(len(y_test), size=50, replace=False)
plt.plot(y_test[sample_indices], label='True Labels')
plt.plot(y_pred[sample_indices], label='Predicted Labels')
plt.xlabel('Sample Index')
plt.ylabel('Label')
plt.title('True vs Predicted Labels')
plt.legend()
plt.show()