机器学习-鸢尾花的识别
使用KNN算法进行鸢尾花识别
在使用KNN算法进行鸢尾花识别时,需要从训练数据中提取萼片长度、萼片宽度、花瓣长度和花瓣宽度作为特征,样本编号不作为特征。数据需要通过Z标准化(Z-score标准化)压缩至统一范围,避免不同特征间的数值差异影响距离计算。训练完成后,应先通过自测观察是否存在过拟合现象,再使用独立的测试集评估模型的正确率。
鸢尾花数据集介绍
鸢尾花数据集是机器学习领域的经典数据集,常用于分类算法的教学和实践。该数据集包含训练数据和测试数据两部分,专门用于花朵识别任务。
训练数据:通常以Excel文件形式提供,包含六列数据:样本编号、萼片长度(cm)、萼片宽度(cm)、花瓣长度(cm)、花瓣宽度(cm)和花朵类型。训练数据用于构建分类模型。
测试数据:包含十条独立的测试样本,用于评估训练好的模型的泛化能力和正确率,确保模型在未见过的数据上也能有效工作。
KNN算法实现鸢尾花识别
KNN(K-Nearest Neighbors)算法是一种基于实例的分类算法,特别适用于鸢尾花识别这类多分类问题。
算法原理:KNN通过计算待分类样本与训练集中所有样本的距离,找出距离最近的K个邻居,然后根据这些邻居的类别进行投票,将得票最多的类别作为预测结果。
特征与标签:在训练过程中,需要明确区分特征和标签。特征包括萼片长度、萼片宽度、花瓣长度和花瓣宽度这四个测量值;标签则是花朵的类型(如Setosa、Versicolor、Virginica)。样本编号仅用于标识,不作为特征使用。
模型正确率评估
正确率是评估分类模型性能的核心指标之一,反映了模型预测的准确程度。
评估方法:通过独立的测试数据集来评估模型的正确率,避免使用训练数据评估导致的过拟合误判。
计算公式:正确率 = 正确预测的样本数 ÷ 总样本数 × 100%。例如,如果测试集有10个样本,模型正确预测了9个,则正确率为90%。
Pandas库介绍
Pandas是Python中一个强大的数据处理和分析库,为数据科学工作提供了高效的工具。
核心功能:Pandas以DataFrame(二维表格)和Series(一维数组)为主要数据结构,底层基于NumPy矩阵实现,提供了丰富的数据操作接口。
文件支持:Pandas支持读取多种格式的数据文件,包括Excel、CSV、JSON、SQL数据库等,其中read_excel()函数专门用于读取Excel文件,非常适合处理鸢尾花数据集这类表格数据。
| 对比项 | NumPy (loadtxt/genfromtxt) | Pandas (read_csv/read_excel) |
|---|---|---|
| 返回类型 | numpy.ndarray(多维数组) | pandas.DataFrame(表格) |
| 数据结构 | 数值数组,适合数学运算 | 带标签的二维表格,支持行列索引 |
| 数据读取 | 主要用于读取纯文本数值数据 | 支持多种格式(CSV、Excel、JSON等) |
| 数据处理 | 提供基础的数值计算功能 | 提供丰富的数据清洗、转换、分析功能 |
| 适用场景 | 科学计算、矩阵运算 | 数据分析、数据清洗、数据可视化 |
数据读取与预处理
数据预处理是机器学习流程中的关键步骤,直接影响模型的最终性能。
数据读取:使用Pandas的read_excel()函数分别读取训练数据集和测试数据集,将Excel文件转换为DataFrame对象,便于后续处理。
特征与标签分离:将数据集分为特征矩阵(X)和标签向量(y)。特征矩阵包含所有测量值列,标签向量包含花朵类型列。
数据标准化:对特征数据进行Z标准化处理,消除不同特征间的量纲差异,使所有特征处于同一数量级,避免某些特征因数值较大而在距离计算中占据主导地位。
数据标准化方法
数据标准化是预处理中的重要环节,主要有两种常用方法:
零一标准化(Min-Max Scaling):将原始数据线性变换到[0, 1]区间,公式为:x' = (x - min) / (max - min)。这种方法适用于数据分布范围已知且没有极端异常值的情况。
Z标准化(Standardization):通过计算每个特征的均值和标准差,将数据转换为标准正态分布(均值为0,标准差为1),公式为:x' = (x - μ) / σ。这种方法对异常值不敏感,更适合大多数机器学习算法。
方法选择:标准化方法的选择取决于具体的数据特点和算法需求。对于KNN这类基于距离的算法,Z标准化通常是更好的选择,因为它能确保所有特征对距离计算的贡献相对均衡。
KNN算法训练与测试
KNN算法的实施包括训练、自测和最终测试三个主要阶段。
训练阶段:选择合适的K值(邻居数量),K值过小容易受噪声影响,K值过大可能忽略局部特征。通常通过交叉验证来确定最优K值。
自测评估:使用训练数据对模型进行自测,观察训练正确率。如果训练正确率远高于测试正确率,可能表明存在过拟合问题。
最终测试:使用独立的测试数据集进行最终评估,计算模型在未见过的数据上的正确率,这是衡量模型泛化能力的真实指标。
练习代码:
import pandas as pd
train_data = pd.read_excel('鸢尾花训练数据.xlsx')
test_data = pd.read_excel('鸢尾花测试数据.xlsx')
train_x = train_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
train_y = train_data['类型_num']
from sklearn.preprocessing import scale
data = pd.DataFrame()
data['萼片长标准化'] = scale(train_x['萼片长(cm)']) #标准化
data['萼片宽标准化'] = scale(train_x['萼片宽(cm)'])
data['花瓣长标准化'] = scale(train_x['花瓣长(cm)'])
data['花瓣宽标准化'] = scale(train_x['花瓣宽(cm)'])
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=2) #训练
knn.fit(data,train_y)
train_predicted = knn.predict(data) #预测
score = knn.score(data,train_y)
print(score)
test_x = test_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
test_y = test_data['类型_num']
from sklearn.preprocessing import scale
data_test = pd.DataFrame()
a = test_x['萼片长(cm)']
data_test['萼片长标准化'] = scale(test_x['萼片长(cm)'])
data_test['萼片宽标准化'] = scale(test_x['萼片宽(cm)'])
data_test['花瓣长标准化'] = scale(test_x['花瓣长(cm)'])
data_test['花瓣宽标准化'] = scale(test_x['花瓣宽(cm)'])
test_predicted = knn.predict(data_test)
score = knn.score(data_test,test_y)
print(score)
输出为:
0.9696969696969697
0.8888888888888888
更多推荐

所有评论(0)