⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计15619字,阅读大概需要30分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
⏰个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

K近邻算法实现葡萄酒分类


任务背景

k近邻(k-nearest neighbor,kNN)算法(以下简称kNN),依据待测样本与所在的特征空间的样本距离,计算出距离测试样本最邻近的k个样本,依此判定测试样本属于某类,或用于简单的回归计算。kNN原理简单,理论成熟,是实践最广泛的机器学习算法之一。本节将由它来演示机器学习的基本过程,以此揭开看似神秘的机器学习这门学科的真貌。

任务需求

本节实验采用UCI开放出来的用于机器学习算法的经验分析的数据库中的葡萄酒样本数据,完成kNN分类算法的演示工作。数据记录了意大利同一地区种植的葡萄酿造的3个不同品种的葡萄酒数据,数据包含了178组葡萄酒经过化学分析后记录的13种成分的数据。实验数据的下载网址为:
链接: http://archive.ics.uci.edu/ml/datasets/Wine
本次实验的目的是通过未知品种的拥有13种成分的葡萄酒,应用kNN分类算法,完成葡萄酒分类的判断。

任务步骤

kNN算法主要是通过k近邻样本数与样本间距离关系进行分类判断,故kNN分类器对训练数据集中包含的异常值和噪声敏感,而且k值的选定也尤为重要。为了较合理地应用kNN算法,需要构建的kNN分类器,主要完成数据处理、建模、分析三大部分:
第1步: 准备数据:使用Python导入葡萄酒实验文本数据

第2步:数据分析,通过画箱线图,分析数据情况,尤其是否存在异常点

第3步:数据处理

  • 数据清洗,求出异常值,进行降噪处理,即修正异常数据
  • 数据标准化,消除量纲关系及数据分散的问题

第4步:k值设定

  • 分割数据集,分成训练集和测试集(测试集占比0.25)
  • 建立kNN模型,基于欧氏距离,少数服从多数的投票方法进行分类建模
  • 用测试集测试模型性能
  • 利用5折交叉验证寻找最佳K值,交叉验证寻找最佳K值key code
  • 将实验结果进行可视化,选取最佳K值

第5步:构建较理想的kNN分类器对葡萄酒进行分类

第6步:结果分析

任务结果

本次实验最终knn葡萄酒分类模型,应用欧氏距离及k=5的情况下,knn分类结果与实际数据分类情况100%吻合。实际项目中,很难遇到这种情况,也说明了本次数据具有极强的代表情况。此外,本次实验样本在没有进行数据去噪处理的情况下,即带有异常值的情况下,分类结果仍然达到了100%。说明本次knn建模具有一定的抗噪功能。

任务实施过程

  1. 配置Pycharm工具,创建Python3项目

知识点

  1. Pycharm工具下建立Python3项目
  2. 项目中建立统一的UTF-8编码格式
  3. 项目中建立包名

实验目的

  1. 掌握Pycharm工具下建立Python3项目的方法

实验环境

  1. Oracle Linux 7.4
  2. Jdk1.8.0_171
  3. Pycharm
  4. Python3.6.5

实验步骤

1) 打开Pycharm工具下Python3开发环境的设置

  1. 如果出现Complete Installation弹窗时点击Do not import settings 点击ok。
    由于第1次打开此工具会弹出“Welcome to PyCharm Community Edition”窗口,配置新安装上的Python3。具体做法:鼠标点击“Configure->Settings”。
    在这里插入图片描述
    在这里插入图片描述

  2. 在弹出“Default settings”窗口的左侧,选择“Project Interpreter”选项,此时窗口右侧出现该选项相应配置选项,鼠标选择“Project Interpreter”选项,在下拉菜单中选择“Show All”。
    在这里插入图片描述

  3. 在弹出“Project Interpreter”窗口的右侧,点击“+”按钮,在弹出的下拉菜单中选择“Add Local”。
    在这里插入图片描述

  4. 在弹出“Select Python Interpreter”窗口中选择Python3安装位置下bin下的Python3,点击OK按钮。如图所示。
    在这里插入图片描述

  5. 回到“Project Interpreter”窗口,确认Python3选项,点击OK按钮。如图所示。
    在这里插入图片描述

  6. 回到““Default settings”窗口,确认Python3选项,点击OK按钮。如图所示。完成Pycharm工具下Python3环境的设置。
    在这里插入图片描述

2.Pycharm工具下建立Python3项目与包名

  1. 回到“Welcome to PyCharm Community Edition”窗口,鼠标点击“Do not show again”,下次再打开工具时就不会弹出此窗口,然后选择“Create New Project”。
    在这里插入图片描述

  2. 在弹出的Create Project窗口中,显示的Location对应的文本框中输入项目名project,点击Create按钮,完成项目的创建。在这里插入图片描述

  3. 建立包名chapter02,用于写清洗Python程序。具体做法:选中新建立的项目project->鼠标右键->New->Python Package。
    在这里插入图片描述

  4. 在弹出的New Package窗口中的文本框内,输入要建立的包名(用户可自定义)“chapter02”,点击OK按键,完成包名的创建。
    在这里插入图片描述

  5. 此时在窗口左侧的窗口中的project项目下可以看到新建立chapter02程序包,在该包下写实验相关的Python程序。
    在这里插入图片描述

建立对中文支持良好的统一的UTF-8编码格式

  1. 设置统一的编码模式,使新生成的文件支持中文,统一设置utf-8编码。具体做法:File->settings->Editor->File and Code Templates->Python Script。在Python Script对应的文本模式中输入具体编码设置,点击OK按钮,完成设置。
#!/usr/bin/python
# -*- coding:utf-8 -*-

在这里插入图片描述

2.Pandas读取葡萄酒实验文本数据

知识点

  1. pandas读取葡萄酒数据

实验目的

  1. 掌握pandas读取葡萄酒数据

实验环境

  1. Oracle Linux 7.4
  2. Pycharm
  3. Python3

实验步骤

1.新建py源代码文件,编写代码执行并查看结果

  1. 建立2.2-knnClassify.py文件,用于编写Python实验程序。具体做法:选中新建立的项目project-下新建立的包名chapter02>鼠标右键->New->Python File。
    在这里插入图片描述

  2. 在弹出的新建立Python文件(New Python file)窗口中显示的Name属性对应的文本框中输入文件名2.2-knnClassify,点击OK按键,完成文件的建立。
    在这里插入图片描述

  3. 数据准备,将工程所需的数据文件添加至项目中,具体指令如下:

cp -r /root/experiment/data/chapter02/datas /root/PycharmProjects/project/chapter02

在这里插入图片描述

  1. 编写2.2-knnClassify.py文件的代码。具体代码如下:
'''
第1步:	准备数据:使用Python导入葡萄酒实验文本数据
'''
import pandas as pd
def createDataSet(url):
    #LABEL代表葡萄酒种类列名标签,A1~A13代表葡萄酒化学分析的13维数据列名标签
    names = ['LABEL', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11', 'A12', 'A13']
    dataset = pd.read_csv(url, names=names)  # 读取指定文件wine.data的数据
    orginData = dataset.iloc[range(0, 178), range(1, 14)] # Pandas中的 iloc 基于整数的下标定位选择A1~A13的数据
    X = orginData.values # 获取数据
    Y = dataset.iloc[range(0, 178), range(0, 1)].values.reshape(1, 178)[0]# Pandas中的reshape方法重塑数据
    return names,dataset,orginData,X,Y #返回names,dataset,orginData,X,Y值
       
if __name__ == "__main__":
    url = "datas/wine.data" # 葡萄酒原数据存储位置
    names, dataset, orginData, X, Y=createDataSet(url)
    print('标签名names:',names)
    print('葡萄酒数据dataset:',dataset)
    print('orginData:', orginData)
    print('X:', X)
    print('Y:', Y)

在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

dataset中记录了葡萄酒数据集wine.data的数据,共计14列,其中LABEL对应列记录了葡萄酒的3个种类:1、2和3。对应的A1~A13记录了每种葡萄酒中含有的13种成分的数据分别为:酒精(Alcohol)、苹果酸(Malic acid)、灰(Ash)、灰分的碱度(Alcalinity of ash)、镁(Magnesium)、总酚(Total phenols)、类黄酮(Flavanoids)、非黄烷类酚(Nonflavanoid phenols)、原花青素(Proanthocyanins)、颜色强度(Color intensity)、色调(Hue)、稀释葡萄酒的OD280 / OD315(OD280/OD315 of diluted wines)和脯氨酸(Proline)。

3.数据分布可视化分析

知识点

  1. pandas的describe函数
  2. matplotlib绘制箱线图

实验目的

  1. 掌握pandas的describe函数的使用
  2. 掌握matplotlib绘制箱线图

实验环境

  1. Oracle Linux 7.4
  2. Pycharm
  3. Python3

实验步骤

1.通过describe分析葡萄酒13种情况的统计情况

  1. 编写2.2-knnClassify.py文件的代码。具体代码如下:
print(orginData.describe())  #求数据的各个统计量

在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

该13个成分(A1~A13)共有178组数据,针对每个成分对平均值、方差、最小、178行数据的25%、50%、75%的情况和最大值进行了统计展示。看出数据间大小差别较大,稳定度也不是很好,这些都会影响后期的数据计算。
2)通过箱线图分析葡萄酒13种情况的统计情况
1.为了更能很好地展示13个成分数据的分布情况,数据不稳定因素是否会有异常点的存在,可将数据可视化成箱线图,通过肉眼直观地分析数据情况,尤其是否存在异常点。编写2.2-knnClassify.py文件的代码。具体代码如下:

import matplotlib.pyplot as plt
def boxPlot(orginData):
    plt.style.use('seaborn-darkgrid')
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    p = orginData.plot(kind='box', subplots=True, layout=(4, 4), sharex=False, sharey=False, )
    plt.show()

在主程序中编写调用数据生成箱线图的方法boxPlot。

boxPlot(orginData)

在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

图中,展示了葡萄酒A1~A13种成分的数据分布情况,上四分位、下四分位和中位线的分布并不均匀,尤其A2、A3、A4、A5、A9、A10和A11成分中存在异常数据。

4.数据清洗

知识点

  1. 异常数据处理

实验目的

  1. 掌握异常数据处理的方法

实验环境

  1. Oracle Linux 7.4
  2. Pycharm
  3. Python3

实验步骤

异常数据的存在直接影响kNN的分类结果,在进行正式的kNN建模前,很有必要去除葡萄酒中的异常数据,进行数据的降噪处理,即修正异常数据,为后期的kNN建模做好特征空间样本的准备工作。

1.查找异常值

  1. 分析葡萄酒实验文本文件wine.data的数据异常值,并对其进行更改。编写2.2-knnClassify.py文件的代码。具体代码如下:
'''
数据清洗:数据清洗,求出异常值,并手工修正异常值
'''
def clearnData(orginData):
    p = orginData.boxplot(return_type='dict')
    for i in range(13):
        y = p['fliers'][i].get_ydata()  # 查找离群点,进行修正
        print('A', i + 1, '中异常值:', y)

在主程序中编写调用数据清洗的方法clearnData。

#第3步:数据处理->数据清洗,求出异常值,并修正异常值
clearnData(orginData)

在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

结果分析

运行结果显示出箱线图中展示的葡萄酒13种成分中A2、A3、A4、A5、A9、A10和A11成分中异常数据的具体值。此时,需要对异常值进行处理,处理的方法与业务有直接的关系,如果数据去掉对应用模型本身没有影响,可去掉异常值处理。否则,需要依据一定的算法对异常的值进行更改替换,例如邻近数据的平均值、专家的印象值等等方法。本文采用依据异常样本数据的前后值,进行人为近似估计更改这些异常值,例如A2的异常值5.8前后的数据分别为4.43和4.31,所以估计5.8的值为4.37,等于或接近于前后数据的平均值。然后再重新运行实例,直到没有异常值后再进行后面的kNN分类器建模的过程。

2.更改异常值

  1. 本文更改的数据下表所示。
    在这里插入图片描述

  2. 将手动修正后的数据存储于wine-clean.data文件中,将url数据指定至修正后的文件中,更改代码如下:

url = "datas/wine-clean.data"  # 修正后的数据存储位置

在这里插入图片描述

  1. 再次运行程序,在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

运行结果中已经没有异常值,可以将修正后的数据进行kNN建模应用了。

5.数据标准化

知识点

  1. 数据标准化处理

实验目的

  1. 掌握数据标准化处理的方法

实验环境

  1. Oracle Linux 7.4
  2. Pycharm
  3. Python3

实验步骤

数据标准化的目的就是为了在不影响各维度因素间数量关系的情况下,收敛数据间大小的差异(如将数据映射到0~1范围之内)和取消各维数据间数据级差别化为无量纲的表达式,成为纯量,避免因为输入输出数据数量级差别较大而造成应用模型计算造成的误差较大。

1.数据标准化

  1. 本节葡萄酒实验数据采用的是sklearn组件中的StandardScaler函数,应用了基于z-score 标准化的计算公式。编写2.2-knnClassify.py文件的代码。具体代码如下:
from sklearn import preprocessing
if __name__ == "__main__":
    # 数据标准化:特征均值方差归一化
    url = "datas/wine-clean.data"
    names = ['LABEL', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11', 'A12', 'A13']
    denoiseData = pd.read_csv(url, names=names)
    # 初始化scalar对象
    pscalar=preprocessing.StandardScaler()
    # 数据标准化
    normalData=pscalar.fit_transform(denoiseData)
    print('数据标准化后结果:', normalData)

在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

6.K值的选择

知识点

  1. K值的选择

实验目的

  1. 掌握K值选择的方法

实验环境

  1. Oracle Linux 7.4
  2. Pycharm
  3. Python3

实验步骤

数据处理后,在正式建立可用模型之前,设定一个正确的k值显得尤为重要。如果k值设定不合理,可能会导致分类正确率下降,或出现过拟合、欠拟合等情况。
为了设定较合理的k值,本节首先将可用数据集进行1:3的分割,其中25%的数据作为测试数据集,75%做为训练数据集。分割后的数据集应用于kNN模型,通过性能分析及交叉验证,求取最合理的k值,参与最终的kNN葡萄酒分类器的建模。

1.分割数据集

  1. 将标准化后的数据normalData进行分割,打印出分割后各数据集的长度。编写2.2-knnClassify.py文件的代码。具体代码如下:
from sklearn import model_selection

  #分割数据集,分成训练集和测试集(测试集占比0.25)
    X_n = normalData
    y_n = denoiseData.iloc[range(0, 178), range(0, 1)].values.reshape(1, 178)[0]
    X_train, X_test, y_train, y_test = model_selection.train_test_split(X_n, y_n, random_state=4)
    print('X测试集样本的个数:',len(X_test))
    print('X训练集样本的个数:', len(X_train))
    print('y测试集样本的个数:', len(y_test))
    print('y训练集样本的个数:', len(y_train))

在这里插入图片描述
在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

运行结果验证了标准化后的数据集进行分割后,测试集数据占比约为25%,训练集数据占比约为75%。

2.基于欧氏距离,建立kNN模型

  1. 基于训练与测试数据集应用kNN模型,测试模型性能。编写2.2-knnClassify.py文件的代码。具体代码如下:
from sklearn import neighbors
# 建立kNN模型,基于欧氏距离,少数服从多数的投票方法进行分类建模
    knn1 = neighbors.KNeighborsClassifier(n_neighbors=5)  # k值设定为5
    knn1.fit(X_train, y_train)
    print(knn1.score(X_test, y_test)) #打印出给定测试数据和标签的平均精度

在这里插入图片描述
在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

3.利用5折交叉验证寻找最佳K值

  1. 交叉验证寻找最佳K值。编写2.2-knnClassify.py文件的代码。具体代码如下:
if __name__ == "__main__":
    #利用5折交叉验证寻找最佳K值,交叉验证寻找最佳K值key code
    k_range = [2 * i + 1 for i in range(11)]
    k_ranges = [str(i) for i in k_range]
    k_scores = []
    for k in k_range:
        knn = neighbors.KNeighborsClassifier(n_neighbors=k)
        scores = model_selection.cross_val_score(knn, X_n, y_n, cv=5, scoring='accuracy')
        k_scores.append(scores.mean())

在这里插入图片描述

  1. 在主函数前插入以下代码,将实验结果进行可视化,选取最佳K值,建立画图的方法drawPlot。
from matplotlib.font_manager import FontProperties
#画图
def drawPlot(k_range,k_ranges,k_scores):
    zhfont = FontProperties(fname='datas/simsun.ttc', size=12)
    figure1 = plt.figure()
    selectKImg = figure1.add_axes([0.11, 0.1, 0.8, 0.8])

    plt.ylim(0.9, 1)
    plt.xticks(k_range, k_ranges)
    plt.xlabel('k的设定值', fontproperties=zhfont)
    plt.ylabel('交叉验证的准确率(%)', fontproperties=zhfont)

    selectKImg.plot(k_range, k_scores, color="blue", marker='', lw=1)
    selectKImg.scatter(k_range, k_scores, color='red', s=50)

    plt.grid()  # 生成网格
    plt.show()

在这里插入图片描述

  1. 在2.2-knnClassify.py主函数中,追加以下代码:
drawPlot(k_range,k_ranges,k_scores)

在这里插入图片描述

  1. 在2.2-knnClassify.py文件的空白处,鼠标右键选“Run‘2.2-knnClassify’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

结果分析

k值设定为整数,一般不建议太大,最好小于20的值。本实验对1,3,5,…,21的k值下,进行knn模型的5折交叉验证,结果表明随着k值从1开始逐渐增大,准确率在逐渐提升,当k=5时达到峰值,随后虽然呈波浪式波动,但总体呈下降趋势,虽然在21又有所提升,但不建议k值过大,故本次实验数据knn建模时,建议k取值为5。

7. 构建完整可用的葡萄酒knn分类器

知识点

  1. K近邻算法实现葡萄酒分类

实验目的

  1. 掌握K近邻算法实现葡萄酒分类的方法

实验环境

  1. Oracle Linux 7.4
  2. Pycharm
  3. Python3

实验步骤

1.新建py源代码文件,编写代码执行并查看结果

  1. 建立2.2.py文件,用于编写Python实验程序。具体做法:选中新建立的项目project-下新建立的包名chapter02>鼠标右键->New->Python File。
    在这里插入图片描述

  2. 在弹出的新建立Python文件(New Python file)窗口中显示的Name属性对应的文本框中输入文件名2.2,点击OK按键,完成文件的建立。
    在这里插入图片描述

  3. 编写2.2.py文件的代码。具体代码如下:

import pandas
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn import neighbors
from sklearn import model_selection

if __name__ == "__main__":
    #对处理后的葡萄酒数据集进行标准化
    url = "datas/wine-clean.data"
    names = ['LABEL', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11', 'A12', 'A13']
    denoiseData = pandas.read_csv(url, names=names)
    normalData = preprocessing.StandardScaler().fit_transform(denoiseData)
    # 分割数据集,分成训练集和测试集(测试集占比0.25)
    X_n = normalData
    y_n = denoiseData.iloc[range(0, 178), range(0, 1)].values.reshape(1, 178)[0]
    X_train, X_test, y_train, y_test = model_selection.train_test_split(X_n, y_n, random_state=4)
    # 求得k=5时,预测样本分类结果
    knn = neighbors.KNeighborsClassifier(n_neighbors=5)  # 取得knn分类器
    knn.fit(X_train, y_train)  # 导入数据进行训练
    print('k=5时,X_test测试数据集经过knn葡萄酒分类器计算的分类结果:', knn.predict(X_test))
    print('X_test测试数据集葡萄酒实际分类数据:', y_test)

在这里插入图片描述

  1. 在2.2.py文件的空白处,鼠标右键选“Run‘2.2’”,运行代码。
    在这里插入图片描述

  2. 在Pycharm工具当前项目窗口的底部看到运行的窗口,结果如下所示:
    在这里插入图片描述

本次实验最终knn葡萄酒分类模型,应用欧氏距离及k=5的情况下,knn分类结果与实际数据分类情况100%吻合。实际项目中,很难遇到这种情况,也说明了本次数据具有极强的代表情况。此外,本次实验样本在没有进行数据去噪处理的情况下,即带有异常值的情况下,分类结果仍然达到了100%。说明本次knn建模具有一定的抗噪功能。

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐