蘑菇分类数据分析与模型构建 欢迎来到蘑菇分类的奇妙世界!本项目旨在通过数据分析和机器学习模型,预测蘑菇是否有毒。让我们一起来探讨数据背后的故事吧 🍄
数据集介绍 本次分析使用的数据集来自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 pdimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import classification_report, accuracy_scorefrom sklearn.model_selection import cross_val_scoresns.set (style="whitegrid" ) file_path = 'mushrooms.csv' data = pd.read_csv(file_path) data.head()
数据探索 在正式建模之前,我们需要先对数据进行探索和理解。这一步非常重要,就像在做饭前需要准备好食材一样。让我们从查看数据的基本信息开始,看看蘑菇数据集的结构和基本统计情况。
1 2 3 4 5 6 # 查看数据的基本信息 data.info() # 查看数据的描述性统计 data.describe(include='all')
数据清洗与预处理 在数据探索之后,我们需要对数据进行清洗与预处理。这包括处理缺失值、编码分类变量以及移除不相关或冗余的特征。虽然我们的数据集没有缺失值,但我们仍需要对分类变量进行独热编码 (One-Hot Encoding) 以便模型能够处理它们。
处理步骤:
独热编码所有分类特征
移除不相关或冗余的特征(如 class_p
和 bruises
)
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 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个特征,并移除不必要的特征。
步骤:
列出与目标变量 class_e
相关性最高的5个特征。
移除高度相关的特征。
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 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()}")