15-Adaboost-红葡萄酒品质分类预测
1. 需求分析用Adaboost算法对葡萄酒品质进行分类2. 数据说明葡萄牙北部绿酒Vinho Verde理化检测 人工感官评分数据集2009 年 Cortez 发布于 UCI 机器学习库同时支持回归预测分数、分类划分品质等级两大任务。红葡萄酒winequality-red.csv1599 行11 特征 1 标签白葡萄酒winequality-white.csv4898 行11 特征 1 标签特征列英文名称中文释义业务意义fixed acidity固定酸度酒石酸、苹果酸等不易挥发有机酸决定基础酸度volatile acidity挥发性酸度乙酸过高会出现醋味大幅降低品质citric acid柠檬酸提升果香少量可柔化口感residual sugar残糖甜味来源干型 / 甜型酒区分核心指标chlorides氯化物含盐量过高带来咸味、劣质口感free sulfur dioxide游离二氧化硫抑菌抗氧化过量产生刺鼻硫磺味total sulfur dioxide总二氧化硫游离 结合 SO₂食品安全限制指标density密度与酒精度、含糖量强相关pH酸碱度酸度平衡影响稳定性与风味sulphates硫酸盐提升葡萄酒香气alcohol酒精度高度数通常对应更高品质评分标签列quality人工感官打分区间 38 分无 1/2/9/10类别极度不均衡红酒主流5、6 分少量 3、4、7、8白酒主流5、6 分极少 3、4、8分类任务常用标签转换方案原始 quality 是有序多分类工程上三种主流处理方案 1二分类好酒quality ≥ 6 → label1差酒quality ≤ 5 → label0 适用逻辑回归、SVM、二分类树、AUC/KS 评估方案 2三分类低档3,4中档5,6高档7,8 适用有序分类模型Ordinal Logistic、XGBoost 序分类方案 3原始多分类6 类3,4,5,6,7,8直接以分数为 6 分类标签样本分布极不均衡适合类别不平衡建模加权损失、过采样3. 建模# 包 import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report, roc_curve, auc from sklearn.ensemble import AdaBoostClassifier import matplotlib.pyplot as plt import joblib3.1 加载数据# 1. 导入数据 data pd.read_csv(./data/winequality-red.csv, sep;) # data.info() print(data[quality].value_counts()) # 查看标签列分布3.2 数据预处理# 2. 数据预处理 # 2.1 提取特征和标签 x data.iloc[:, :-1].copy() y data[quality].copy() # 2.2 缺失值、异常值处理无 # 2.3 标签列转换 标签列含多分类需要转换成两类 规则quality5 -- good - 0; else -- bad - 1 y y.map(lambda cls : 0 if cls5 else 1) # 2.4 划分数据集 x_train, x_test, y_train, y_test train_test_split(x,y,test_size0.2,random_state1234)3.3 特征工程不用3.4 模型训练3.4.1 场景1单一cart决策树# 4. 模型训练、预测、评估 # 4.1 场景1: 单一cart决策树 estimator1 DecisionTreeClassifier(random_state1234) estimator1.fit(x_train, y_train) y_pre1 estimator1.predict(x_test) print(单一决策树模型效果\n, classification_report(y_test, y_pre1))3.4.2 场景2Adaboost默认参数# 4.2 场景2: Adaboost默认参数 estimator2 AdaBoostClassifier(random_state1234) estimator2.fit(x_train, y_train) y_pre2 estimator2.predict(x_test) print(Adaboost默认参数模型效果\n, classification_report(y_test, y_pre2))3.4.3 场景3Adaboost网格搜索交叉验证# 4.3 场景3: Adaboost网格搜索交叉验证 estimator3 AdaBoostClassifier(random_state1234) param_grid { n_estimators: [50,100,150,200], learning_rate: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1] } gs_estimator GridSearchCV(estimator3, param_gridparam_grid, cv5) gs_estimator.fit(x_train, y_train) y_pre3 gs_estimator.predict(x_test) print(Adaboost网格搜素交叉验证模型效果\n, classification_report(y_test, y_pre2)) print(最佳参数: , gs_estimator.best_params_) print(最佳准确率, gs_estimator.best_score_)3.5 模型预测、评估# 用最佳参数再进行训练 estimator4 AdaBoostClassifier(n_estimators200, learning_rate1, random_state1234) estimator4.fit(x_train, y_train) y_pre4 estimator4.predict(x_test) print(Adaboost最佳参数模型效果, classification_report(y_test, y_pre4))3.6 画图# 5. 绘图 fpr, tpr, thresholds roc_curve(y_test, estimator4.predict_proba(x_test)[:,1]) auc_value auc(fpr, tpr) plt.figure(figsize(3,3)) plt.plot(fpr, tpr, labelAUC %.2f % auc_value) plt.plot([0,1], [0,1], r--) plt.xlabel(False Positive Rate) plt.ylabel(True Positive Rate) plt.legend() plt.show()3.7 模型保存# 6. 保存模型 joblib.dump(estimator4, ./model/adaboost_wine_red_model.pkl) print(模型保存成功) # 7. 模型加载 # estimator joblib.load(./model/adaboost_wine_red_model.pkl) # x_new # 新的数据集df # y_pre estimator.predict(x_new) # 预测