面向人工智能: 对红酒数据集进行分析 (实验四)

news2024/9/28 21:51:27

由于直接提供截图是不切实际的,我将详细解释如何使用scikit-learn(通常称为sk-learn)自带的红酒数据集进行葡萄酒数据的分析与处理。这包括实验要求的分析、数据的初步分析(完整性和重复性)以及特征之间的关联关系分析。

1. 分析实验要求

实验的主要目标是使用scikit-learn中的红酒数据集(通常是UCI机器学习库中的Wine Recognition dataset)来分析葡萄酒的化学成分与葡萄酒类型或质量之间的关系。通常,该数据集包含多种葡萄酒的化学成分(如酒精度、苹果酸含量等)以及葡萄酒的类别或质量评分。

2. 初步分析数据

2.1 加载数据

首先,你需要加载红酒数据集。在scikit-learn中,这可以通过load_wine函数完成。

# 导入必要的库  
from sklearn.datasets import load_wine  
import pandas as pd  
import matplotlib.pyplot as plt  
import seaborn as sns  
  
# 加载红酒数据集  
wine_data = load_wine()  
  
# 将数据转换为Pandas DataFrame  
df = pd.DataFrame(wine_data.data, columns=wine_data.feature_names)  
df['class'] = wine_data.target  # 将目标变量(葡萄酒的类别)添加到DataFrame中  
2.2 检查数据的完整性和重复性
  • 完整性:通过检查数据的形状(shape)和特征名称(feature_names)来验证数据是否完整。
# 检查数据的形状  
print("Data shape:", df.shape)  # 查看样本数量和特征数量 
  • 重复性:在大多数情况下,UCI数据集不会包含重复的样本。然而,为了确认,你可以使用Pandas库检查数据的唯一性。
# 检查是否有重复的行  
print("Number of duplicate rows:", df.duplicated().sum())  # 如果输出为0,则表示没有重复行

3. 分析实验数据各特征之间的关联关系

3.1 使用统计方法

使用Pandas的describe函数查看特征的统计描述,包括均值、标准差等,这些可以帮助你了解数据的分布情况。

print(df.describe())

3.2 绘制直方图和箱线图

绘制特征的直方图和箱线图,以观察特征的分布和可能的异常值。

# 绘制直方图  
df.iloc[:, :-1].hist(bins=30, figsize=(15, 10), layout=(4, 4)) 
plt.tight_layout()  
plt.show()  
  
# 使用subplots=True让matplotlib自动处理布局  
# df.iloc[:, :-1].hist(bins=30, figsize=(15, 15), layout=None, subplots=True)  
# plt.tight_layout()  # 尝试调整子图参数, 以便子图之间的重叠最小化  
# plt.show() 

# 绘制箱线图  
plt.figure(figsize=(10, 8))  
sns.boxplot(data=df.iloc[:, :-1])  
plt.title('Boxplot of Wine Dataset Features')  
plt.show()  

 subplots是一个用来控制自动处理布局的参数,但在这里是不适用的,因为hist 方法在 pandas 的 DataFrame 中并没有 subplots 参数。 subplots=True 是不适用于 pandas 的 hist 方法的,这是 matplotlib 中某些函数(如 subplot_mosaic 或在创建多个子图时)的参数。

为了在 pandas 中绘制多个特征的直方图,并且让 pandas 自动处理子图的布局,应该使用 subplots=True 的方式,但这不是通过 hist 方法的参数来实现的。相反,你需要调整 figsize 来确保图形足够大,以容纳所有特征的直方图。由于 pandas 的 hist 方法不直接支持复杂的子图布局,它通常会将所有直方图绘制在一个连续的网格中,或者可以通过迭代每列来手动创建子图。

为了简化这个过程,我们可以使用 pandas 的 hist 方法,并接受它自动选择的布局,或者我们可以使用 matplotlib 的子图功能来更精细地控制布局。

以下是使用 pandas hist 方法并调整 figsize 的示例:

(figsize:指定figure的宽和高,单位为英寸)

# 绘制特征分布的直方图  
fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(15, 15))  # 假设4x4布局,但会有些空白  
axes = axes.flatten()  # 将二维数组转换为一维,以便迭代  
  
# 注意:如果特征数量不是16个,则以下循环将不会为所有特征绘制直方图  
# 或者,你可以根据特征数量动态调整nrows和ncols  
for i, feature in enumerate(df.columns[:-1]):  # 遍历除'class'之外的所有特征  
    if i < len(axes):  # 确保索引不会超出axes的长度  
        df[feature].hist(ax=axes[i], bins=30)  
        axes[i].set_title(feature)  
    else:  
        # 如果特征数量超过16个,你可以在这里添加代码来处理额外的特征  
        # 例如,创建一个新的图形或调整布局  
        break  
  
# 如果特征数量少于16个,可以移除多余的子图(可选)  
for ax in axes[len(df.columns[:-1]):]:  
    ax.remove()  
  
plt.tight_layout()  
plt.show()

上面的代码在特征数量不是16个时会留下空白的子图。一个更灵活的方法是使用 GridSpec 或类似的方法来动态地创建子图网格。不过,对于简单的用例,可能只需要调整 figsize 并接受 pandas hist 方法的默认布局。

如果只是想让 pandas 自动处理布局,并希望图形足够大以清晰显示所有直方图,可以这样做:

# 绘制特征分布的直方图,让pandas自动处理布局  
df.iloc[:, :-1].hist(bins=30, figsize=(15, 20))  # 调整figsize的高度以容纳更多直方图  
plt.tight_layout()  # 尝试调整子图参数,但效果可能有限  
plt.show()
3.3 计算特征之间的相关性

使用Pandas的corr函数计算特征之间的相关系数(如皮尔逊相关系数),以分析它们之间的线性关系。

# 计算特征之间的相关系数矩阵  
correlation_matrix = df.iloc[:, :-1].corr()  # 排除'class'列  
  
# 打印相关系数矩阵  
print("Correlation Matrix:")  
print(correlation_matrix)  
  
# 绘制热力图以更直观地查看相关性  
plt.figure(figsize=(10, 8))  
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')  
plt.title('Correlation Heatmap of Wine Dataset Features')  
plt.show()  

注意:

  1. pandas用于数据处理,matplotlib.pyplotseaborn用于数据可视化。
  2. 使用load_wine函数加载了红酒数据集,并将其转换为pandas.DataFrame以便于处理。
  3. 在分析特征之间的关联关系时,排除了目标变量'class'列,只计算了特征之间的相关系数。
  4. 绘制直方图和箱线图时,layout参数要根据特征数目进行相应的调整。如果特征数量不是3的倍数,可能需要调整layout参数或使用plt.subplots来更灵活地控制子图的布局。
  5. seabornheatmap函数用于绘制相关系数矩阵的热力图,它提供了直观的视觉表示来查看哪些特征之间存在强相关性

结果:

4.决策树模型:

(使用准确度和AUC指标进行模型评估)

准确度指标:
# 划分数据集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  

# 训练模型  
clf = DecisionTreeClassifier(random_state=42)  
clf.fit(X_train, y_train)

# 预测测试集  
y_pred = clf.predict(X_test)  
  
# 评估模型(准确度)  
accuracy = accuracy_score(y_test, y_pred)  
print(f"Accuracy: {accuracy:.2f}")  
 AUC指标:
y_scores = clf.predict_proba(X_test)  # 获取每个类别的概率  
auc = roc_auc_score(y_test, y_scores, multi_class='ovr', average='macro')  
print(f"Macro-average AUC: {auc:.2f}")  
  • clf:这是一个已经训练好的分类器对象,在这个例子中,它是一个DecisionTreeClassifier实例。
  • .predict_proba(X_test):这是clf对象的一个方法,用于对给定的测试集X_test中的样本进行预测,但它不直接给出类标签(即预测结果所属的类别),而是给出每个样本属于各个类别的概率。这个方法返回一个二维数组,其中每一行对应X_test中的一个样本,每一列对应一个类别,元素值是该样本属于对应类别的概率。
  • y_scores:这个变量接收了.predict_proba(X_test)方法的返回值,即测试集中每个样本属于各个类别的概率。

第二行代码用于计算ROC曲线下的面积(AUC):

  • y_test:这是测试集的真实标签,即每个样本的实际类别。
  • y_scores:这是通过.predict_proba(X_test)得到的预测概率。
  • multi_class='ovr':这个参数指定了如何将多分类问题转换为多个二分类问题以计算AUC。'ovr'代表“一对一”(One-vs-Rest),即对于每个类别,都将其视为正类,其余所有类别视为负类,然后计算每个类别的ROC AUC,最后通过某种方式(如平均)汇总这些AUC值。
  • average='macro':这个参数指定了如何汇总每个类别的AUC值。'macro'意味着简单地计算所有类别AUC的未加权平均值。

AUC(Area Under the Curve)通常用于评估二分类问题的ROC曲线下的面积,但葡萄酒数据集是一个多分类问题。对于多分类问题,我们可以计算加权平均AUC(通过roc_auc_scoremulti_class参数设置为ovrovo),但更常见的做法是使用准确度、F1分数、混淆矩阵等指标。 

如果数据集是高度不平衡的,使用精确度-召回率曲线可能更加合适,因为它能更好地反映模型在少数类上的性能 。

结果:

5.随机森林:

# 划分数据集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  
  
  
# 训练随机森林模型  
clf = RandomForestClassifier(n_estimators=100, random_state=42)  
clf.fit(X_train, y_train)  # 注意:ravel()将y_train从二维数组转换为一维数组  
  
#预测测试集的概率
y_score = clf.predict_proba(X_test)  
  
# 评估模型(准确度)
# 预测测试集的标签  
y_pred = clf.predict(X_test)  # 注意:这里使用原始标签的索引进行预测  
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")  
  

auc = roc_auc_score(y_test, y_score, multi_class='ovr', average='macro')  
print(f"Macro-average AUC: {auc:.2f}") 

 结果:

(居然准确度和AUC指标都是1!!怀疑)

如果你得到的准确度和AUC都为1,这通常意味着你的模型在测试集上表现得非常完美,几乎没有任何错误。然而,这种情况在实际应用中是非常罕见的,特别是当使用随机森林这样的集成学习方法时,因为数据集通常包含一些噪声或难以预测的样本。

不放心搜了一下出现这种情况的原因,大家可以参考一下: 

以下是一些可能导致这种情况的原因:

  1. 过拟合:模型在训练集上表现得太好,以至于它学习到了训练数据中的噪声或特定模式,而这些模式在测试集中并不适用。然而,随机森林通常具有较好的抗过拟合能力,所以这可能是不太可能的原因,除非数据集非常小或非常特殊。

  2. 数据泄漏:在训练和测试集之间存在某种形式的重叠或信息泄漏。例如,如果测试集中的某些样本在无意中用于训练模型,或者如果特征和标签之间存在直接的依赖关系(这些依赖关系在训练集和测试集中都被保留了下来),那么模型可能会表现得异常好。

  3. 简单的数据集:数据集可能非常简单,以至于即使是随机猜测也能得到很好的结果。然而,由于你正在使用随机森林这样的复杂模型,并且通常预期它在更复杂的数据集上也能表现良好,所以这种情况也不太可能。

  4. 标签不平衡:如果测试集中的大多数样本都属于同一个类别,并且模型只是简单地预测这个最常见的类别,那么准确度可能会很高,但这并不意味着模型实际上能够区分不同的类别。然而,在这种情况下,AUC通常不会接近1,因为它考虑了所有类别的区分能力。

  5. 随机性:虽然你设置了random_state来确保结果的可重复性,但随机森林的每次运行都可能略有不同(尽管差异很小)。然而,这种随机性不太可能导致准确度和AUC都为1。

  6. 评估错误:可能你在评估模型时犯了某种错误。例如,你可能错误地将训练集用作测试集,或者你可能在计算AUC时使用了错误的参数或方法。

  7. 模型参数:在某些情况下,随机森林的参数(如n_estimators)可能被设置得非常高,导致模型过度拟合训练数据。然而,即使在这种情况下,通常也不会看到准确度和AUC都为1的完美结果。

为了诊断这个问题,可以尝试以下步骤:

  • 检查数据:确保训练集和测试集之间没有重叠,并且它们都正确地反映了你要解决的问题。
  • 检查标签:确保测试集的标签是正确的,并且没有误用训练集的标签。
  • 交叉验证:使用交叉验证来评估模型,这可以帮助你了解模型在不同测试集上的表现。
  • 简化模型:尝试使用更简单的模型(如决策树)来查看是否仍然得到相同的结果。
  • 检查AUC计算:确保你正确地计算了AUC,并且使用了适当的参数(如multi_class='ovr'average='macro')。如果你对二分类问题使用AUC,请确保你的问题是二分类的,或者你已经将多类问题转换为了多个二分类问题。
  • 查看预测结果:查看模型的预测结果,特别是那些被错误分类的样本,以了解模型可能存在的问题。
  • 调整模型参数:尝试调整随机森林的参数,如n_estimatorsmax_depth等,以查看是否对结果有影响。然而,请注意,过度调整参数可能会导致过拟合。

 6.调试

scaler = StandardScaler()  
X_train_scaled = scaler.fit_transform(X_train)  
X_test_scaled = scaler.transform(X_test);
param_grid = {  
    'n_estimators': [50, 100, 200],  
    'max_depth': [None, 10, 20, 30],  
    'min_samples_split': [2, 5, 10],  
    'min_samples_leaf': [1, 2, 4]  
}  
  
grid_search = GridSearchCV(clf, param_grid, cv=5, scoring='accuracy', verbose=2, n_jobs=-1)  
grid_search.fit(X_train_scaled, y_train)  
  
best_clf = grid_search.best_estimator_  
y_pred_best = best_clf.predict(X_test_scaled)  
print("Best Parameters:", grid_search.best_params_)  
print("Best Accuracy:", accuracy_score(y_test, y_pred_best))  
print("Classification Report with Best Parameters:\n", classification_report(y_test, y_pred_best))

结果:

结论

通过上述步骤,可以初步了解红酒数据集的完整性、重复性以及各特征之间的关联关系。这些数据分析步骤对于进一步的数据处理和建模(如分类或回归)至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2174858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP EWM QM 集成

目录 1 简介 2 业务流程 3 后台配置 4 主数据 5 业务操作 5.1 创建 EWM 交货单 5.2 不同的质检结果导致不同的入库地点 - 质检通过 5.3 不同的质检结果导致不同的入库地点 - 质检失败 1 简介 EWM 与 QM (quality management) 集成,自动 or 手动执行质检流程。质检可以…

现代cpp多线程与并发初探

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 在现代c(c20)中,有了jthread和协程的概念,使得我们编写并发程序更加方便. 这里作简单学习. 前言知识 多线程编程 std::thread 用于创建一个执行的线程实例,所以它是一切并发编程的基础,使用时需要包含 <thread…

XSS(内含DVWA)

目录 一.XSS的攻击方式&#xff1a; 1. 反射型 XSS&#xff08;Reflected XSS&#xff09; 2. 存储型 XSS&#xff08;Stored XSS&#xff09; 3. DOM型 XSS&#xff08;DOM-based XSS&#xff09; 总结 二..XSS的危害 三.常见的XSS方式 1.script标签 四.常见基本过滤方…

假期旅行数仓项目--OLAP

需要这个完整离线数仓项目的源码和流程PPT可以私信我&#xff0c;可以帮助解决项目中遇到的问题&#xff0c;做完项目可以让你对数仓有更加清晰的认识 项目流程&#xff1a; 配置文件 kafka server.properties hive : hvie-site.xml 启动mysql 的binlog日志 修改maxwell配置…

QT:常用类与组件

1.设计QQ的界面 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QLabel>//自定义类Widget,采用public方式继承QWidget&#xff0c;该类封装了图形化界面的相关操作&#xff…

怎么绕开华为纯净模式安装软件

我是标题 众所周不知&#xff0c;华为鸿蒙系统自带纯净模式&#xff0c;而且 没法关闭 : ) 我反正没找到关闭键 以前或许会有提示&#xff0c;无视风险&#xff0c;“仍要安装”。但我这次遇到的问题是&#xff0c;根本没有这个选项&#xff0c;只有“应用市场”和“取消”&…

动态规划笔记

第一轮面试准备到第26题 一 解题步骤 对于动态规划问题&#xff0c;我将拆解为如下五步曲&#xff0c;这五步都搞清楚了&#xff0c;才能说把动态规划真的掌握了&#xff01; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历…

基于yolov8的海上红外目标系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的海上红外目标系统是一项集成了前沿技术的创新解决方案&#xff0c;专为复杂海洋环境下的目标检测而设计。该系统利用YOLOv8深度学习模型的强大目标检测能力&#xff0c;结合红外成像技术&#xff0c;实现了对海上小型船只、浮标、甚至水下潜器等目标…

Arch - 架构安全性_传输(Transport Security)

文章目录 OverView导图1. 概述2. TLS的基本概念2.1 什么是TLS&#xff1f;2.2 TLS与SSL的关系2.3 TLS的工作原理 3. TLS的核心组件3.1 加密算法3.2 哈希函数3.3 数字证书 4. TLS握手过程4.1 客户端Hello4.2 服务器Hello4.3 证书验证4.4 密钥交换4.5 会话密钥生成4.6 安全连接建…

解锁初中学习新境界 —— 初中通关宝典速记手册

在初中这个学习生涯的关键阶段&#xff0c;掌握扎实的基础知识是取得优异成绩的关键。为此&#xff0c;我们特别推荐《初中通关宝典》——一本专为初中生打造的各科基础知识速记手册&#xff0c;它将成为你学习路上的得力助手。 文章目录 1. 全科覆盖&#xff0c;精准速记2.科学…

K8S的Pod IP

pod 的ip 一般是提供给pod1与pod2之间的通信&#xff0c;它有两个特点 1. Pod IP会随着Pod实例 的创新创建&#xff08;重启&#xff09;发生变化&#xff1b; 2. Pod IP只在集群内节点可见&#xff0c;外部无法直接访问

基于Spring框架的分层解耦详解

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Java Web 三层架构&#xff1a; Java Web可以大致被分为三层架构&#xff1a;…

基于单片机的水位检测系统仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;DHT11温湿度采集温湿度&#xff0c;滑动变阻器连接ADC0832数模转换器模拟水位传感器检测水位&#xff0c;通过LCD1602显示信息&#xff0c;然后在程序里设置好是否…

《Spring Boot应用进阶:打造优雅的错误处理机制与全局异常拦截器》

文章目录 自定义异常类AppException封装业务有关的枚举类AppExceptionCodeMsg全局异常拦截器Handler响应类模板Resp案例展示 || Demo项目结构pom依赖DemoController实际执行结果 Demo案例Git地址 | Gitee 本文主要介绍自己在工作中在处理抛出异常类和封装响应类处理的模板总结。…

首屏优化之:SSR(服务端渲染)

引言 今天我们来聊一下首屏优化之SSR-服务端渲染&#xff08;Server-Side Rendering&#xff09;。 可能很多朋友并不了解什么是 SSR&#xff0c;包括在工作中写的网站是什么类型的也不太清楚&#xff0c;是 CSR 还是 SSR&#xff1f;作者在阅读过大量的文章之后&#xff0c;…

数据结构:二叉树OJ题篇 手把手带你入门数据结构~

文章目录 前言一、单值二叉树二、检查两颗树是否相同三、对称二叉树四、另一颗树的子树五、二叉树的前序遍历六、二叉树的后序遍历七、二叉树中序遍历八、二叉树的构建及遍历九、二叉树选择题1.二叉树性质2. 二叉树选择题1. 某⼆叉树共有 399 个结点&#xff0c;其中有 199 个度…

vLLM (6) - Scheduler BlockSpaceManager

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 vLLM (6) - Scheduler & BlockSpaceManager 文章目录 系列文章目录前言一、Scheduler1.概述2.Scheduler._…

Cannot solve model: no CPLEX runtime found.【macOS系统下问题解决】

最近在研究电能优化的策略时&#xff0c;运行别人代码出现了 Cannot solve model: no CPLEX runtime found. 1. 下载cplex # !pip install cplex12.8 #指定版本 !pip install cplex #下载最新的版本2. 下载docplex !pip install docplex3. 重启Jupyter或者你的项目…

C++之STL—常用排序算法

sort (iterator beg, iterator end, _Pred) // 按值查找元素&#xff0c;找到返回指定位置迭代器&#xff0c;找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // _Pred 谓词 random_shuffle(iterator beg, iterator end); // 指定范围内的元素随机调…

Qt(9.28)

widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {QPushButton *btn1 new QPushButton("登录",this);this->setFixedSize(640,480);btn1->resize(80,40);btn1->move(200,300);btn1->setIcon(QIcon("C:…