贝叶斯算法实践-西瓜分类实践
1、望大家在资料-机器学习农业数据集下载waltermellon数据集
2、对该数据采用贝叶斯分类器算法进行分类
3、在实践过程中要求使用LabelEncoder对特征进行编码
因为该数据集比较小,大家可以不用拆分训练集和测试集,直接用全部数据训练和测试
4、采用分类评估标准对结果进行评估,
完成比较快的同学,请对比不同贝叶斯算法的区别
完成比较快的同学,请绘制混淆矩阵
CategoricalNB — scikit-learn 1.8.0 文档
https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.CategoricalNB.html
贝叶斯算法实践-西瓜分类(watermelon数据集) 一、项目要求1.使用 watermelonfull.csv 数据集2.采用贝叶斯分类器(CategoricalNB 或 MultinomialNB)3.使用 LabelEncoder 对特征进行编码4.数据集较小,不拆分训练集和测试集,全数据训练并评估5.输出分类评估结果6.(进阶)对比不同贝叶斯算法7.(进阶)绘制混淆矩阵 二、完整代码importpandasaspdimportnumpyasnpfromsklearn.preprocessingimportLabelEncoderfromsklearn.naive_bayesimportCategoricalNB,MultinomialNB,GaussianNBfromsklearn.metricsimportaccuracy_score,classification_report,confusion_matriximportmatplotlib.pyplotaspltimportseabornassns# 设置中文字体plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False# 1. 加载数据集df=pd.read_csv('watermelonfull.csv',encoding='gbk')# 注意编码print("数据形状:",df.shape)print("前5行:\n",df.head())# 2. 使用 LabelEncoder 对所有特征进行编码le_dict={}# 保存每个特征的编码器,方便逆转换df_encoded=df.copy()forcolindf_encoded.columns:le=LabelEncoder()df_encoded[col]=le.fit_transform(df_encoded[col])le_dict[col]=leprint("\n编码后数据前5行:\n",df_encoded.head())# 3. 分离特征与标签(假设最后一列为'好瓜')X=df_encoded.drop('好瓜',axis=1)y=df_encoded['好瓜']print("特征形状:",X.shape,"标签形状:",y.shape)# 4. 使用 CategoricalNB 训练(专为离散特征设计)model_cat=CategoricalNB()model_cat.fit(X,y)y_pred_cat=model_cat.predict(X)# 5. 评估结果print("\n"+"="*50)print(" CategoricalNB 分类结果")print("="*50)print("准确率:",accuracy_score(y,y_pred_cat))print("\n分类报告:")print(classification_report(y,y_pred_cat,target_names=['坏瓜','好瓜']))# 6. 对比其他贝叶斯算法print("\n"+"="*50)print(" 不同贝叶斯算法对比")print("="*50)# 6.1 MultinomialNBmodel_mul=MultinomialNB()model_mul.fit(X,y)y_pred_mul=model_mul.predict(X)acc_mul=accuracy_score(y,y_pred_mul)print(f"MultinomialNB 准确率:{acc_mul:.4f}")# 6.2 GaussianNBmodel_gau=GaussianNB()model_gau.fit(X,y)y_pred_gau=model_gau.predict(X)acc_gau=accuracy_score(y,y_pred_gau)print(f"GaussianNB 准确率:{acc_gau:.4f}")# 6.3 CategoricalNBacc_cat=accuracy_score(y,y_pred_cat)print(f"CategoricalNB 准确率:{acc_cat:.4f}")# 7. 绘制混淆矩阵fig,axes=plt.subplots(1,3,figsize=(15,5))forax,(model,name,y_pred)inzip(axes,[(model_cat,'CategoricalNB',y_pred_cat),(model_mul,'MultinomialNB',y_pred_mul),(model_gau,'GaussianNB',y_pred_gau)]):cm=confusion_matrix(y,y_pred)sns.heatmap(cm,annot=True,fmt='d',cmap='Blues',ax=ax,xticklabels=['坏瓜','好瓜'],yticklabels=['坏瓜','好瓜'])ax.set_title(name)ax.set_xlabel('预测值')ax.set_ylabel('真实值')plt.suptitle('三种贝叶斯算法混淆矩阵对比',fontsize=16)plt.tight_layout()plt.show()三、三种贝叶斯算法区别1.CategoricalNB:适用于特征是离散类别变量的情况,是此数据集的最佳选择。2.MultinomialNB:适用于特征表示计数或频率的场景,如文本分类中的词频。3.GaussianNB:假设特征服从高斯(正态)分布,适用于连续数值型特征。 四、算法选择建议-西瓜数据集特征均为离散类别,应优先使用 CategoricalNB。-若特征为连续值,使用 GaussianNB,但需先标准化。-文本/频率数据使用 MultinomialNB。