当前位置: 首页 > news >正文

2022 年高教社杯全国大学生数学建模竞赛-C 题 古代玻璃制品的成分分析与鉴别详解+分类模型Python代码源码

前言

简单介绍一下我自己:博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。参与过十余次数学建模大赛,三次美赛获得过二次M奖一次H奖,国赛二等奖。**提供免费的思路和部分源码,以后的数模比赛只要我还有时间肯定会第一时间写出免费开源思路。**博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码且完全免费。希望有需求的小伙伴不要错过笔者精心打造的文章。
数学建模的基本步骤大致如下:

  1. 问题定义:明确你需要解决的问题。这包括对问题的背景进行研究,理解问题的实际意义,以及确定问题的边界条件和假设。
  2. 建立数学模型:将实际问题转换为数学问题。这通常涉及到定义变量、参数、约束条件以及目标函数(如果是优化问题的话)。
  3. 求解数学模型:选择合适的数学工具和方法求解模型。这可能包括解析方法、数值方法、仿真等。
  4. 模型验证与分析:使用实际数据测试模型的有效性,分析模型结果,对模型进行必要的调整和优化。
  5. 撰写模型报告:详细记录模型的建立过程、求解步骤、结果分析以及模型的局限性等。

在这里插入图片描述本篇文章上接第三问分类,前面两问都有单独的文章进行讲解,大家直接可以进我专栏搜索2022C题即可看到源码以及详细的建模过程,本篇文章主要详解第三问的分类模型建模,对第三张表的未知数据分类。

问题 3

对附件表单 3 中未知类别玻璃文物的化学成分进行分析,鉴别其所属类型,并对分类结果的敏感性进行分析。问题三就是一个比较简单的分类算法了,到了这一步就相当好做了,因为我们有第一二问的基础,根据对应的数据可以很好的构造分类模型,首先我们还是根据建模步骤来一步步完成第三问分类模型的建模

数据预览

在这里插入图片描述
那么我们根据风化和无风化把他们分开:
在这里插入图片描述
在这里插入图片描述
同时我们需要根据之前分类的风化数据和无风化数据提取特征列和标签列,进行训练,这些数据确实太适合应用KNN算法了,我这里就直接采用KNN算法来进行分类预测,我其实认为K为1的时候会比较适合,因为微量元素的欺负不会很大,但是对于颜色来说就十分难以分类了,因为关于颜色的数据实在是过少,后续需要进行数据均衡,但是前两个标签纹饰和类型就很好分类了,而且准确率都挺高的。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.multioutput import MultiOutputClassifier
from sklearn.metrics import classification_report
# 分离特征和标签
X = df_fenhua.iloc[:,list(range(1, 15))]
y = df_fenhua.iloc[:,list(range(18, 21))]
# 标签列(纹饰、类型、颜色)
label_columns = ['纹饰', '类型', '颜色']
# 拆分训练集和测试集(用于模型验证)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用KNN分类器
knn_model = KNeighborsClassifier(n_neighbors=1)# 使用MultiOutputClassifier来处理多输出问题
multi_target_knn = MultiOutputClassifier(knn_model, n_jobs=-1)# 训练模型
multi_target_knn.fit(X_train, y_train)# 在测试集上进行预测
y_pred = multi_target_knn.predict(X_test)# 输出分类结果报告
for i, label in enumerate(label_columns):print(f"Classification Report for {label}:")print(classification_report(y_test.iloc[:, i], y_pred[:, i]))
Classification Report for 纹饰:precision    recall  f1-score   supportA       0.00      0.00      0.00         1B       1.00      1.00      1.00         1C       0.80      0.80      0.80         5accuracy                           0.71         7macro avg       0.60      0.60      0.60         7
weighted avg       0.71      0.71      0.71         7Classification Report for 类型:precision    recall  f1-score   support铅钡       1.00      1.00      1.00         6高钾       1.00      1.00      1.00         1accuracy                           1.00         7macro avg       1.00      1.00      1.00         7
weighted avg       1.00      1.00      1.00         7Classification Report for 颜色:precision    recall  f1-score   support浅蓝       0.00      0.00      0.00         2深绿       0.50      0.50      0.50         2蓝绿       0.33      0.33      0.33         3黑       0.00      0.00      0.00         0accuracy                           0.29         7macro avg       0.21      0.21      0.21         7
weighted avg       0.29      0.29      0.29         7

切换K为3的时候准确率可以更高:

Classification Report for 纹饰:precision    recall  f1-score   supportA       0.00      0.00      0.00         1B       1.00      1.00      1.00         1C       0.83      1.00      0.91         5accuracy                           0.86         7macro avg       0.61      0.67      0.64         7
weighted avg       0.74      0.86      0.79         7Classification Report for 类型:precision    recall  f1-score   support铅钡       1.00      1.00      1.00         6高钾       1.00      1.00      1.00         1accuracy                           1.00         7macro avg       1.00      1.00      1.00         7
weighted avg       1.00      1.00      1.00         7Classification Report for 颜色:precision    recall  f1-score   support浅绿       0.00      0.00      0.00         0浅蓝       0.25      0.50      0.33         2深绿       1.00      0.50      0.67         2蓝绿       1.00      0.33      0.50         3accuracy                           0.43         7macro avg       0.56      0.33      0.38         7
weighted avg       0.79      0.43      0.50         7

对于颜色来说我们需要另外选择其他的模型,我们可以通过数据可视化来看看颜色的分布:
在这里插入图片描述
在这里插入图片描述我们可以清晰的看到数据几乎是十分不均衡的,浅绿颜色仅仅只有一条,检查类别样本数量并移除少量样本类别:

from collections import Counter
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
# 分离特征和标签
X = df_fenhua.iloc[:, list(range(1, 15))]
y = df_fenhua['颜色']# 检查每个类别的样本数量
counter = Counter(y)
print(counter)# 移除样本数少于2的类别
to_remove = [k for k, v in counter.items() if v < 2]
X_filtered = X[~y.isin(to_remove)]
y_filtered = y[~y.isin(to_remove)]# 再次检查过滤后的类别分布
counter_filtered = Counter(y_filtered)
print(counter_filtered)# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_filtered, y_filtered, test_size=0.2, random_state=42)# 使用SMOTE进行过采样,调整k_neighbors为1
smote = SMOTE(random_state=42, k_neighbors=1)
X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)# 使用KNN分类器
knn_model = KNeighborsClassifier(n_neighbors=3)# 训练KNN模型
knn_model.fit(X_train_resampled, y_train_resampled)# 在测试集上进行预测
y_pred = knn_model.predict(X_test)# 输出分类结果报告
print(f"Classification Report for 颜色:")
print(classification_report(y_test, y_pred))
Counter({'浅蓝': 10, '蓝绿': 9, '深绿': 5, '紫': 4, '黑': 3, '浅绿': 1})
Counter({'浅蓝': 10, '蓝绿': 9, '深绿': 5, '紫': 4, '黑': 3})
KNeighborsClassifier(n_neighbors=3)
Classification Report for 颜色:precision    recall  f1-score   support浅蓝       0.50      0.67      0.57         3深绿       1.00      0.50      0.67         2蓝绿       1.00      0.50      0.67         2黑       0.00      0.00      0.00         0accuracy                           0.57         7macro avg       0.62      0.42      0.48         7
weighted avg       0.79      0.57      0.63         7

多标签能到达这个准确率还行。

在这里插入图片描述
最后得到预测结果,无风化数据也是一样的,重复次过程即可。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【知识点】图论续篇 - 最短路算法合集
  • A02、Java编程性能调优(02)
  • 论文速读|重新审视奖励设计与评估:用于强健人型机器人站立与行走控制的方法
  • 设计模式学习-简单的命令模式例子
  • AI科学家:自动化科研的未来之路
  • S3C2440开发板:时钟,PWM定时器控制蜂鸣器发声
  • 小白遇上字符串解析问题,正则和原生字符串函数谁来救场?
  • 双绞线如何抑制传导干扰
  • DigitalOcean Kubernetes引入NVIDIA H100 GPU,助力 AI/ML 创新
  • 第R2周:LSTM-火灾温度预测
  • Java使用POI创建带样式和公式的Excel文件
  • 区块链Hyperledger Fabric2.2 环境搭建
  • OpenCV 旋转矩形边界
  • 2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)
  • 【FFMPEG】Install FFmpeg CUDA gltransition in Ubuntu
  • [nginx文档翻译系列] 控制nginx
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android单元测试 - 几个重要问题
  • es的写入过程
  • export和import的用法总结
  • HTML5新特性总结
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Spark RDD学习: aggregate函数
  • 不上全站https的网站你们就等着被恶心死吧
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 仿天猫超市收藏抛物线动画工具库
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 关于使用markdown的方法(引自CSDN教程)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊聊flink的TableFactory
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 学习Vue.js的五个小例子
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # include “ “ 和 # include < >两者的区别
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (理论篇)httpmoudle和httphandler一览
  • (转)memcache、redis缓存
  • (转)我也是一只IT小小鸟
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .net经典笔试题
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @Autowired多个相同类型bean装配问题