Python课程设计报告

课程设计名称: 使用scikit-learn和TensorFlow构建和评价葡萄酒分类模型

课程设计时间:2024.6.14至2024.6.20

一、引言

  • 简介
    本课程设计旨在利用Python的scikit-learn库及TensorFlow框架,对葡萄酒数据集进行预处理、特征工程、模型构建与评估,以探索葡萄酒种类的分类问题。具体而言,我们将针对wine数据集,进行数据清洗、划分训练集与测试集、特征标准化、PCA降维,并采用多层感知机深度学习算法和支持向量机构建模型,最终通过定量指标评价模型性能。

二、数据集介绍

  • wine数据集:包含178条记录,每条记录代表一种葡萄酒,通过13项化学属性预测葡萄酒的种类(三类)。
  • wine_quality数据集:wine_quality数据集共有1599个观察值,11个输入特征和一个标签。其中,不同类的观察值数量不等,所有特征为连续型数据。通过酒的各类化学成分,预测该葡萄酒的评分。因为选择第3课题,此数据集仅做数据处理。

三、数据预处理

  1. 数据加载与分割:使用Pandas加载wine数据集和wine_quality数据集,通过选取不同的列,拆分数据和标签;并使用train_test_split函数将其划分为训练集和测试集,比例为7:3。

    wine=pd.read_csv(r"C:\Users\LCX\Documents\python\wine.csv")
    wine_quality=pd.read_csv(r"C:\Users\LCX\Documents\python\wine_quality.csv",sep=';')
    wine_data=wine.iloc[:,1:]
    wine_target=wine.iloc[:,0]
    
    wine_quality_data=wine_quality.iloc[:,0:10]
    wine_quality_target=wine_quality.iloc[:,11]
    
    
    wine_train_data, wine_test_data, wine_train_target, wine_test_target = train_test_split(
    wine_data, wine_target, test_size=0.3, random_state=42)
    
    
    wine_quality_train_data, wine_quality_test_data, wine_quality_train_target, wine_quality_test_target = train_test_split(
    wine_quality_data, wine_quality_target, test_size=0.3, random_state=42)
    
  2. 特征标准化:应用StandardScaler对特征进行标准化处理,确保各特征在同一尺度上。

    scaler = StandardScaler()
    
    wine_train_data_scaled = scaler.fit_transform(wine_train_data)
    wine_test_data_scaled = scaler.transform(wine_test_data)
    
    wine_quality_train_data_scaled = scaler.fit_transform(wine_quality_train_data)
    wine_quality_test_data_scaled = scaler.transform(wine_quality_test_data)
    
  3. PCA降维:基于95%的累计方差解释度,使用PCA对数据进行降维,得到简化特征空间。

    pca_wine = PCA(n_components=0.95)
    pca_wine_quality = PCA(n_components=0.95)
    
    
    wine_train_pca = pca_wine.fit_transform(wine_train_data_scaled)
    wine_test_pca = pca_wine.transform(wine_test_data_scaled)
    
    wine_quality_train_pca = pca_wine_quality.fit_transform(wine_quality_train_data_scaled)
    wine_quality_test_pca = pca_wine_quality.transform(wine_quality_test_data_scaled)
    

    在这里插入图片描述

四、模型构建与评估

使用深度学习方法构建多层感知机。

模型选择:深度学习模型

  • 模型理论:

    • 基本结构

      • 输入层:接收原始数据,每个输入节点对应数据集的一个特征。
      • 隐藏层:一个或多个,其中的神经元对从上一层接收到的信息进行加权求和,并通过一个激活函数(如Sigmoid、ReLU等)转换,以引入非线性。隐藏层使得网络能够学习复杂的特征表示。
      • 输出层:产生最终的网络输出,输出的神经元数量取决于任务的性质(例如,二分类任务可能只需要一个输出神经元,而多分类任务则需要与类别数相等的输出神经元)。
    • 前向传播
      在前向传播过程中,信息从输入层经过隐藏层逐层传递至输出层。每一层的计算都是基于上一层的输出,通过加权求和并应用激活函数完成。

    • 激活函数
      激活函数是神经网络非线性表达的关键,它将神经元的线性组合转换成非线性输出,允许网络学习复杂的决策边界。常见的激活函数有sigmoid、tanh、ReLU等。

    • 损失函数与优化
      为了训练网络,需要定义一个损失函数(或成本函数)来衡量模型预测值与真实值之间的差距。常见的损失函数有均方误差(MSE)、交叉熵等。通过优化算法(如梯度下降、随机梯度下降、Adam等)调整网络的权重和偏置,目的是最小化损失函数。

    • 反向传播
      反向传播算法用于计算损失函数关于网络权重和偏置的梯度,并据此更新这些参数。这个过程从输出层开始,反向传播误差直至输入层,逐步调整各层的权重,使得网络逐渐学会从输入到正确输出的映射。

    • 学习率与正则化
      学习率是优化过程中每次参数更新的步长,选择合适的学习率对于训练速度和收敛质量至关重要。正则化技术(如L1、L2正则化)用于防止过拟合,即模型在训练数据上表现很好但在未见过的数据上泛化能力差的问题。

    • 深度与宽度
      多层感知机的深度(隐藏层数量)和宽度(每层的神经元数量)是其架构的重要方面,它们影响着模型的复杂性和学习能力。更深的网络能够学习更复杂的模式,但也可能带来训练难度和过拟合风险的增加。

  • 模型架构:构建一个包含三层隐藏层的神经网络模型,每层分别有64、32、16个神经元,激活函数分别为ReLU。输出层使用Softmax激活函数,对应三种葡萄酒类别。

    X_train=np.array(wine_train_pca)
    Y_train=np.array(to_categorical(wine_train_target))
    X_test=np.array(wine_test_pca)
    Y_test=np.array(to_categorical(wine_test_target))
    
    model = Sequential()  
    model.add(Dense(64, input_dim=X_train.shape[1], activation='relu'))  
    model.add(Dense(32, activation='relu'))
    model.add(Dense(16, activation='relu'))  
    model.add(Dense(to_categorical(wine_test_target).shape[1], activation='softmax'))  
    
  • 编译与训练:模型使用Adam优化器,损失函数为categorical_crossentropy,评估指标为accuracy。训练30个周期,批次大小为20,设置验证集比例为0.2。

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  
    
    model.fit(X_train, Y_train, epochs=30, batch_size=20, validation_split=0.2) 
    

模型选择:支持向量机

  • 模型理论:
    支持向量机(SVM, Support Vector Machine)

    1. 线性可分支持向量机
      当训练数据集完全线性可分时,SVM试图找到一个最优的超平面,该超平面能够最大程度地将两类样本分开,并且使得两类样本到这个超平面的边际(即最近的样本点到超平面的距离)最大化。这里的“硬间隔最大化”意味着模型要求所有样本不仅要被正确分类,而且都要满足一定的间隔要求,没有例外。这个过程可以通过解决一个凸优化问题实现,目标函数通常是最大化间隔,同时约束所有样本点的函数值满足其类别标签的要求。

    2. 软间隔最大化与线性支持向量机
      在现实世界中,数据往往不是完全线性可分的,可能因为噪声、异常值或者数据本身的特性导致。这时,SVM引入了“软间隔最大化”的概念,允许一定程度上的误分类,通过在目标函数中加入惩罚项(如使用 hinge 损失函数),对误分类的样本进行控制。这样,模型在追求最大化间隔的同时,也考虑到了分类的错误容忍度,通过调整惩罚系数(C值),可以在间隔最大化和分类误差之间找到一个平衡。即使某些样本点落在了“错误”的一侧,只要总体上间隔最大化的目标得以保持,模型仍然可以得到有效的分类边界。

    3. 非线性支持向量机与核技巧
      对于线性不可分的数据,SVM通过引入核技巧(Kernel Trick)来处理。核技巧的核心思想是将原始特征空间映射到一个更高维的特征空间,在这个新空间中,原来线性不可分的数据可能变得线性可分。具体操作时,不需要显式计算高维空间中的特征表示,而是通过定义一个核函数(kernel function),直接在原始特征空间中计算内积,从而避免了高维计算的复杂性和不可行性。常见的核函数有线性核、多项式核、高斯径向基核(RBF)等。通过选择合适的核函数和软间隔最大化,SVM能够在非线性场景下找到一个最优的决策边界,达到很好的分类或回归效果。

  • 选择核函数

    • 线性核函数 (Linear Kernel):
      • 形式: K ( x i , x j ) = x i T ⋅ x j K(x_i, x_j) = x_i^T \cdot x_j K(xi,xj)=xiTxj
      • 适用于线性可分的数据集。简单且计算效率高,但在面对非线性问题时表现可能不佳。
    X_train_svc=np.array(wine_train_pca)
    Y_train_svc=np.array(wine_train_target)
    X_test_svc=np.array(wine_test_pca)
    Y_test_svc=np.array(wine_test_target)
    
    clf = svm.SVC(kernel='linear')  
    clf.fit(X_train_svc, Y_train_svc)
    y_pred_svm = clf.predict(X_test_svc)
    
    • 多项式核函数 (Polynomial Kernel):
      • 形式: K ( x i , x j ) = ( γ ⋅ x i T ⋅ x j + r ) d K(x_i, x_j) = (\gamma \cdot x_i^T \cdot x_j + r)^d K(xi,xj)=(γxiTxj+r)d,其中 γ \gamma γ是系数, r r r是偏置项, d d d是多项式的次数。
      • 可以模拟更复杂的决策边界,适用于具有多项式关系的数据。通过调整参数可以控制映射到高维空间的复杂度。
    clf = svm.SVC(kernel='poly')  
    clf.fit(X_train_svc, Y_train_svc)
    y_pred_svm = clf.predict(X_test_svc)
    

五、模型评估

  • 混淆矩阵与分类报告

    • 多层感知机:通过计算混淆矩阵和分类报告,发现模型在各类别上的精确率、召回率、F1分数均为1.0,显示了完美的分类能力。
    class_names = {1: '1等酒', 2: '2等酒', 3: '3等酒'}
    y_pred = model.predict(X_test)
    y_pred_classes = np.argmax(y_pred, axis=1)
    y_test_classes = np.argmax(Y_test, axis=1)
    y_pred_class_names = [class_names[pred] for pred in y_pred_classes]
    y_true_class_names = [class_names[label] for label in y_test_classes]
    
    
    report_with_names = classification_report(y_true_class_names, y_pred_class_names, target_names=class_names.values())
    print(report_with_names)
    

    在这里插入图片描述

    • 支持向量机(核函数:linear):报告了精确度、召回率和F1分数,展示了模型在不同类别上的性能,总体准确率为96.30%。
    class_names = {1: '1等酒', 2: '2等酒', 3: '3等酒'}
    report_with_names = classification_report(Y_test_svc, y_pred_svm, target_names=class_names.values(), digits=4)
    conf_mat = confusion_matrix(Y_test_svc, y_pred_svm)
    
    print("Classification Report:")
    print(report_with_names)
    

    在这里插入图片描述

    • 支持向量机(核函数:poly):提高了对某些类别的识别精度,整体准确率进一步提升至98.15%,表明非线性核函数在该数据集上有更好的表现。
    class_names = {1: '1等酒', 2: '2等酒', 3: '3等酒'}
    report_with_names = classification_report(Y_test_svc, y_pred_svm, target_names=class_names.values(), digits=4)
    conf_mat = confusion_matrix(Y_test_svc, y_pred_svm)
    
    print("Classification Report:")
    print(report_with_names)
    

    在这里插入图片描述

六、结论与讨论

  • 在实验的过程中,手动调整模型的超参数。当各层神经元数量为32、16、8时,训练30个epochs,能达到89%的准确率;当各层神经元数量为64、32、16时,训练30个epochs,准确率即可达到100%。
  • 对于复杂的非线性数据分类,使用多项式核函数比线性核函数的支持向量机具有更好的性能。后续在测试RBF和Sigmoid核函数的支持向量机时,分类准确率均为98%左右,说明支持向量机不能很好的把握数据在多维空间内有所交错的复杂依赖关系,分类性能不如多层感知机。
  • 本次课程设计成功展示了使用深度学习方法和支持向量机方法解决葡萄酒分类问题的过程,通过PCA降维有效减少了计算复杂度,且深度神经网络模型在经过适当训练后,取得了优异的分类性能;支持向量机也达到了98%的精度。

致谢

感谢老师的悉心指导和小组成员的共同努力,使得本课程设计得以顺利完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值