这个蘑菇可以吃吗

蘑菇分类数据分析与模型构建

欢迎来到蘑菇分类的奇妙世界!本项目旨在通过数据分析和机器学习模型,预测蘑菇是否有毒。让我们一起来探讨数据背后的故事吧 🍄

数据集介绍

本次分析使用的数据集来自UCI机器学习库,包括8124个蘑菇样本和23个特征,每个特征都是分类变量。

特征描述

  • class: 可食用(e)或有毒(p)
  • cap-shape: 菌盖形状(bell=b, conical=c, convex=x, flat=f, knobbed=k, sunken=s)
  • cap-surface: 菌盖表面(fibrous=f, grooves=g, scaly=y, smooth=s)
  • cap-color: 菌盖颜色(brown=n, buff=b, cinnamon=c, gray=g, green=r, pink=p, purple=u, red=e, white=w, yellow=y)
  • bruises: 是否有瘀伤(bruises=t, no=f)
  • odor: 气味(almond=a, anise=l, creosote=c, fishy=y, foul=f, musty=m, none=n, pungent=p, spicy=s)
  • 其余特征省略,具体见数据集说明。

我们将在接下来的分析中,逐步揭示数据中的奥秘,并通过多种机器学习模型进行分类预测。让我们开始吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 导入必要的库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score
from sklearn.model_selection import cross_val_score

# 设置绘图风格
sns.set(style="whitegrid")

# 加载数据
file_path = 'mushrooms.csv'
data = pd.read_csv(file_path)

# 显示前5行数据
data.head()

数据探索

在正式建模之前,我们需要先对数据进行探索和理解。这一步非常重要,就像在做饭前需要准备好食材一样。让我们从查看数据的基本信息开始,看看蘑菇数据集的结构和基本统计情况。

1
2
3
4
5
6
# 查看数据的基本信息
data.info()

# 查看数据的描述性统计
data.describe(include='all')

数据清洗与预处理

在数据探索之后,我们需要对数据进行清洗与预处理。这包括处理缺失值、编码分类变量以及移除不相关或冗余的特征。虽然我们的数据集没有缺失值,但我们仍需要对分类变量进行独热编码 (One-Hot Encoding) 以便模型能够处理它们。

处理步骤:

  1. 独热编码所有分类特征
  2. 移除不相关或冗余的特征(如 class_pbruises
1
2
3
4
5
6
7
8
9
10
11
# 独热编码所有分类特征
data_encoded = pd.get_dummies(data)

# 移除不相关或冗余的特征
# 'class_p' 是独热编码产生的,与 'class_e' 完全互斥
# 'bruises_f' 和 'bruises_t' 是 'bruises' 的独热编码结果
data_encoded = data_encoded.drop(columns=['class_p', 'bruises_f', 'bruises_t'])

# 显示预处理后的数据前5行
data_encoded.head(5)

特征相关性分析

在数据预处理之后,我们需要进行特征相关性分析。相关性分析可以帮助我们理解特征之间的关系,识别高度相关的特征,避免多重共线性问题。通过热图 (Heatmap),我们可以直观地查看特征之间的相关性。

相关性分析步骤:

  1. 计算特征之间的相关矩阵
  2. 可视化相关矩阵
  3. 识别和处理高度相关的特征
1
2
3
4
5
6
7
8
# 计算相关矩阵
correlation_matrix = data_encoded.corr().abs()

# 绘制热图
plt.figure(figsize=(16, 12))
sns.heatmap(correlation_matrix, cmap='coolwarm', annot=False, fmt=".2f")
plt.title('Feature Correlation Heatmap')
plt.show()

特征选择

通过相关性分析,我们可以识别出与目标变量 class_e 相关性最高的特征。为了避免特征冗余,我们可以去除一些高度相关的特征,并保留最重要的特征。接下来,我们将列出与 class_e 相关性最高的5个特征,并移除不必要的特征。

步骤:

  1. 列出与目标变量 class_e 相关性最高的5个特征。
  2. 移除高度相关的特征。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 选择目标变量
target_variable = 'class_e'

# 提取与目标变量的相关性并排序
target_correlations = correlation_matrix[target_variable].sort_values(ascending=False)

# 检查 'class_p' 是否在列中,如果在则删除
if 'class_p' in target_correlations.index:
target_correlations = target_correlations.drop(['class_p'])

# 获取与目标变量相关性最高的5个特征(不包括目标变量本身)
most_correlated_features = target_correlations[1:6]

# 打印结果
print("Top 5 features most correlated with class_e:")
print(most_correlated_features)

模型构建与评估

在选择了最重要的特征之后,我们将使用这些特征来构建和评估我们的分类模型。我们将使用两种常见的分类算法:逻辑回归和随机森林。通过交叉验证,我们可以评估模型的性能并选择最优模型。

步骤:

  1. 数据分割:将数据分为训练集和测试集。
  2. 逻辑回归模型的交叉验证。
  3. 随机森林模型的交叉验证。
1
2
3
4
5
6
7
8
9
10
11
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

# 定义特征和目标变量
X = data_encoded.drop(columns=['class_e'])
y = data_encoded['class_e']

# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
1
2
3
4
5
6
7
# 逻辑回归模型的交叉验证
logreg = LogisticRegression(max_iter=10000)
logreg_scores = cross_val_score(logreg, X, y, cv=5)

print(f"Logistic Regression Cross-Validation Scores: {logreg_scores}")
print(f"Logistic Regression Average Cross-Validation Score: {logreg_scores.mean()}")

1
2
3
4
5
6
7
# 随机森林模型的交叉验证
rf = RandomForestClassifier(random_state=42)
rf_scores = cross_val_score(rf, X, y, cv=5)

print(f"Random Forest Cross-Validation Scores: {rf_scores}")
print(f"Random Forest Average Cross-Validation Score: {rf_scores.mean()}")