【机器学习】任务五:葡萄酒和鸢尾花数据集分类任务

目录

1.实验基础知识

1.1 集成学习

(1)随机森林

(2)梯度提升决策树(GBDT)

(3)XGBoost

(4)LightGBM

1.2 参数优化

(1)网格搜索

(2)随机搜索

(3)贝叶斯优化

(4)遗传算法

(5)超参数优化工具

1.3 模型解释

(1)特征重要性分析

(2)SHAP

(3)部分依赖图(PDP)

(4)对抗性样本分析

(5)LIME

2.葡萄酒数据集分类任务

2.1 导入必要的库文件并加载数据集

(1)目标:

(2)代码:

(3)解释:

2.2 对数据进行初步探索和可视化

(1)目标:

(2)代码:

(3)解释:

2.3 将数据集分为训练集和测试集

(1)目标:

(2)代码:

(3)解释:

2.4 对 XGBoost 模型进行参数优化

(1)目标:

(2)代码:

(3)解释:

2.5 使用测试集进行预测并评估模型性能

(1)目标:

(2)代码:

(3)解释:

2.6 可视化模型性能

(1)目标:

(2)代码:

(3)解释:

3.鸢尾花数据集分类任务报告

3.1 导入必要的库文件并加载数据集

(1)目标:

(2)代码:

(3)解释:

3.2 对数据进行初步探索和可视化

(1)目标:

(2)代码:

(3)解释:

3.3 将数据集分为训练集和测试集

(1)目标:

(2)代码:

(3)解释:

3.4 对 LightGBM 模型进行参数优化

(1)目标:

(2)代码:

(3)解释:

3.5 使用测试集进行预测并评估模型性能

(1)目标:

(2)代码:

(3)解释:

3.6 可视化模型性能

(1)目标:

(2)代码:

(3)解释:

4.总体代码和结果

4.1葡萄酒

(1)总体代码

(2)运行结果

(3)结果分析

4.2鸢尾花

(1)总体代码

(2)运行结果

(3)结果分析


1.实验基础知识

1.1 集成学习

集成学习是一种通过组合多个基学习器来提高模型预测性能的技术。主要有两类方法:

  • Bagging:通过对数据进行重采样,构建多个独立的模型,然后将这些模型的预测结果进行平均(回归)或投票(分类)。典型的算法包括随机森林
  • Boosting:通过串行训练多个模型,每个模型都在前一个模型的基础上进行改进。常用算法包括GBDTXGBoostLightGBM

(1)随机森林

  • 随机森林是 Bagging 的一种具体实现,通过随机选择样本和特征构建多个决策树,并通过投票(分类)或平均(回归)进行预测。随机森林减少了过拟合,增强了模型的稳定性和准确性。

(2)梯度提升决策树(GBDT)

  • GBDT 是 Boosting 的一种,通过逐步构建树模型,每棵新树都是在前一棵树的基础上通过最小化残差来改进模型。GBDT 在处理非线性关系和特征交互时表现良好。

(3)XGBoost

  • XGBoost 是 GBDT 的高效实现,具有更快的训练速度和更好的性能。通过正则化和并行计算加速模型训练,同时减少过拟合,XGBoost 还可以处理缺失值。

(4)LightGBM

  • LightGBM 是微软开发的高效 GBDT 实现,使用基于直方图的决策树算法,显著提高了训练速度和内存效率,适用于大规模数据集和高维特征场景。

1.2 参数优化

为了提升模型性能,参数优化是关键步骤。常用的参数优化方法有:

(1)网格搜索

  • 网格搜索是一种穷举法,通过在预定义的参数空间中列出所有可能的参数组合,逐一训练模型并评估其性能。虽然计算开销较大,但简单易懂,适用于小规模参数优化。

(2)随机搜索

  • 随机搜索随机选择参数组合来进行训练,相比网格搜索能更高效地探索高维空间,常在较短时间内找到较优的参数。

(3)贝叶斯优化

  • 贝叶斯优化通过构建目标函数的概率模型,逐步更新该模型来找到最优参数,适合计算成本较高的模型训练,能减少评估次数。

(4)遗传算法

  • 遗传算法模拟自然选择的过程,通过选择、交叉和变异操作在参数空间内进行全局搜索,适合复杂的优化问题。

(5)超参数优化工具

  • OptunaHyperoptRay Tune 等工具集成了多种优化算法,可以自动化参数搜索过程,并提供可视化和分析功能。

1.3 模型解释

理解模型的决策过程对于确保模型透明性和解释性至关重要。常用的解释方法包括:

(1)特征重要性分析

  • 通过评估特征对模型预测结果的影响,分析哪些特征在模型决策中起到了关键作用。随机森林和 XGBoost 提供了基于树模型的特征重要性评估。

(2)SHAP

  • SHAP 值基于合作博弈论,通过计算特征对预测结果的贡献来解释模型。它能够量化每个特征对单个预测的影响,也能通过全局解释分析模型行为。

(3)部分依赖图(PDP)

  • PDP 用于可视化单个或多个特征对预测的影响,揭示特征与预测结果之间的关系。

(4)对抗性样本分析

  • 通过生成对抗性样本并观察模型的预测变化,可以评估模型的脆弱性和决策边界。

(5)LIME

  • LIME 是一种模型无关的解释方法,能通过生成局部线性模型来近似复杂模型的行为,提供单个预测的可解释性。

2.葡萄酒数据集分类任务

2.1 导入必要的库文件并加载数据集

(1)目标:

  • 导入必要的库文件(如 pandasnumpymatplotlibseabornsklearnxgboostlightgbm 等)。
  • 加载 scikit-learn 提供的葡萄酒数据集。

(2)代码:

# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, f1_score
import xgboost as xgb
import lightgbm as lgb# 加载葡萄酒数据集
wine = load_wine()# 提取特征矩阵(X)和目标变量(y)
X_wine, y_wine = wine.data, wine.target

(3)解释:

  • 导入库文件:导入数据处理、可视化、机器学习和模型评估所需的库。
    • pandas 用于数据处理,numpy 用于数值计算,matplotlibseaborn 用于绘图。
    • xgboostlightgbm 是两种常用的集成学习方法,用于分类任务。
  • 加载葡萄酒数据集:使用 scikit-learn 提供的 load_wine() 函数加载葡萄酒数据集。数据集包含 13 个特征和 178 个样本。
  • 提取特征矩阵和目标变量X_wine 保存特征数据,y_wine 保存目标类别标签。

2.2 对数据进行初步探索和可视化

(1)目标:

  • 查看数据集的基本信息和统计摘要,确保数据集没有缺失值或异常。
  • 使用 seaborn 进行数据可视化,了解特征与目标标签之间的关系。

(2)代码:

# 将数据转为DataFrame
df_wine = pd.DataFrame(X_wine, columns=wine.feature_names)
df_wine['target'] = y_wine# 查看数据集信息
print(df_wine.info())
print(df_wine.describe())# 可视化葡萄酒数据集特征与目标的关系
sns.pairplot(df_wine, hue="target", markers=["o", "s", "D"])
plt.show()

(3)解释:

  • 转换为 DataFrame:将 numpy 数组转换为 pandas 数据框,以便更方便地查看和处理数据。
  • 数据集探索:使用 info()describe() 查看数据的基本信息,包括数据类型、缺失值和统计摘要。
    • info() 显示数据集的结构信息,确保没有缺失值。
    • describe() 提供特征的统计描述,如均值、方差、最大值和最小值等。
  • 数据可视化:使用 seabornpairplot() 绘制多变量散点图,观察特征与目标变量(葡萄酒种类)之间的关系。
    • hue="target" 使用不同颜色区分不同类别的葡萄酒。

2.3 将数据集分为训练集和测试集

(1)目标:

  • 将葡萄酒数据集划分为训练集和测试集,以便训练模型并验证其性能。
  • 采用 80:20 的比例划分,80% 的数据用于训练,20% 用于测试。

(2)代码:

# 将葡萄酒数据集划分为训练集和测试集
X_train_wine, X_test_wine, y_train_wine, y_test_wine = train_test_split(X_wine, y_wine, test_size=0.2, random_state=42)

(3)解释:

  • train_test_split():用于将数据集划分为训练集和测试集。这里使用 80% 的数据用于模型训练,20% 的数据用于测试模型。
  • random_state=42:确保数据集划分的随机性保持一致,便于结果复现。
  • X_train_wine, y_train_wine 分别表示葡萄酒训练集的特征和标签,X_test_wine, y_test_wine 为测试集。

2.4 对 XGBoost 模型进行参数优化

(1)目标:

  • 使用网格搜索 (GridSearchCV) 对 XGBoost 分类器的参数进行优化,找到最佳参数组合以提高模型性能。

(2)代码:

# 定义XGBoost模型和参数网格
xgb_model_wine = xgb.XGBClassifier(random_state=42)
xgb_param_grid_wine = {'n_estimators': [50, 100, 200],'max_depth': [3, 5, 7],'learning_rate': [0.01, 0.1, 0.3]
}# 进行网格搜索和交叉验证
xgb_grid_search_wine = GridSearchCV(estimator=xgb_model_wine, param_grid=xgb_param_grid_wine, scoring='accuracy', cv=3)
xgb_grid_search_wine.fit(X_train_wine, y_train_wine)# 打印最佳参数
print("XGBoost最佳参数(葡萄酒数据集):", xgb_grid_search_wine.best_params_)

(3)解释:

  • 定义模型xgb.XGBClassifierXGBoost 分类器,用于处理葡萄酒数据集的分类任务。
  • 参数优化
    • 通过网格搜索 (GridSearchCV) 调整 n_estimators(决策树数量)、max_depth(决策树深度)和 learning_rate(学习率)等参数。
    • cv=3 表示 3 折交叉验证,用于评估模型性能并选择最佳参数组合。
  • 输出最佳参数:通过 best_params_ 打印 XGBoost 模型的最佳参数组合。

2.5 使用测试集进行预测并评估模型性能

(1)目标:

  • 使用通过网格搜索找到的最佳 XGBoost 模型对测试集进行预测,并评估模型的分类性能。

(2)代码:

# 使用最佳XGBoost模型对测试集进行预测
xgb_y_pred_wine = xgb_grid_search_wine.best_estimator_.predict(X_test_wine)# 评估模型性能(准确率和F1得分)
xgb_accuracy_wine = accuracy_score(y_test_wine, xgb_y_pred_wine)
xgb_f1_wine = f1_score(y_test_wine, xgb_y_pred_wine, average='weighted')# 打印性能结果
print(f"XGBoost分类器 - 葡萄酒数据集: 准确率 = {xgb_accuracy_wine}, F1 得分 = {xgb_f1_wine}")

(3)解释:

  • 定义模型xgb.XGBClassifierXGBoost 分类器,用于处理葡萄酒数据集的分类任务。
  • 参数优化
    • 通过网格搜索 (GridSearchCV) 调整 n_estimators(决策树数量)、max_depth(决策树深度)和 learning_rate(学习率)等参数。
    • cv=3 表示 3 折交叉验证,用于评估模型性能并选择最佳参数组合。
  • 输出最佳参数:通过 best_params_ 打印 XGBoost 模型的最佳参数组合。

2.6 可视化模型性能

(1)目标:

  • 绘制 XGBoost 模型在葡萄酒数据集上的准确率和 F1 得分的柱状图,直观展示模型性能。

(2)代码:

# 绘制XGBoost模型性能柱状图
performance_metrics = ['Accuracy', 'F1 Score']
xgb_performance_wine = [xgb_accuracy_wine, xgb_f1_wine]plt.figure(figsize=(8, 6))
plt.bar(performance_metrics, xgb_performance_wine, color='blue')
plt.title('XGBoost 模型在葡萄酒数据集上的性能')
plt.ylabel('得分')
plt.ylim(0, 1)
plt.show()

(3)解释:

  • 绘图:使用 matplotlibbar() 函数绘制柱状图,展示 XGBoost 模型的准确率和 F1 得分。
  • 直观展示:通过柱状图直观展示模型的分类性能,帮助更好地理解模型的优劣。
    • ylim(0, 1) 设置 Y 轴的范围为 0 到 1。

3.鸢尾花数据集分类任务报告

3.1 导入必要的库文件并加载数据集

(1)目标:

  • 导入必要的库文件(如 pandasnumpymatplotlibseabornsklearnxgboostlightgbm 等)。
  • 加载 scikit-learn 提供的鸢尾花数据集。

(2)代码:

# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, f1_score
import xgboost as xgb
import lightgbm as lgb# 加载鸢尾花数据集
iris = load_iris()# 提取特征矩阵(X)和目标变量(y)
X_iris, y_iris = iris.data, iris.target

(3)解释:

  • 导入库文件:导入数据处理、可视化、机器学习和模型评估所需的库。
    • pandas 用于数据处理,numpy 用于数值计算,matplotlibseaborn 用于绘图。
    • xgboostlightgbm 是两种常用的集成学习方法,用于分类任务。
  • 加载鸢尾花数据集:使用 scikit-learn 提供的 load_iris() 函数加载鸢尾花数据集。该数据集包含 150 个样本,4 个特征,以及 3 种不同的鸢尾花类别。
  • 提取特征矩阵和目标变量X_iris 保存特征数据,y_iris 保存目标类别标签。

3.2 对数据进行初步探索和可视化

(1)目标:

  • 查看数据集的基本信息和统计摘要,确保数据集没有缺失值或异常。
  • 使用 seaborn 进行数据可视化,了解特征与目标标签之间的关系。


(2)代码:

# 将数据转为DataFrame
df_iris = pd.DataFrame(X_iris, columns=iris.feature_names)
df_iris['target'] = y_iris# 查看数据集信息
print(df_iris.info())
print(df_iris.describe())# 可视化鸢尾花数据集特征与目标的关系
sns.pairplot(df_iris, hue="target", markers=["o", "s", "D"])
plt.show()

(3)解释:

  • 转换为 DataFrame:将 numpy 数组转换为 pandas 数据框,以便更方便地查看和处理数据。
  • 数据集探索:使用 info()describe() 查看数据的基本信息,包括数据类型、缺失值和统计摘要。
    • info() 显示数据集的结构信息,确保没有缺失值。
    • describe() 提供特征的统计描述,如均值、标准差、最大值和最小值等。
  • 数据可视化:使用 seabornpairplot() 绘制多变量散点图,观察特征与目标变量(鸢尾花种类)之间的关系。
    • hue="target" 使用不同颜色区分不同类别的鸢尾花。

3.3 将数据集分为训练集和测试集

(1)目标:

  • 将鸢尾花数据集划分为训练集和测试集,以便训练模型并验证其性能。
  • 采用 80:20 的比例划分,80% 的数据用于训练,20% 用于测试。

(2)代码:

# 将鸢尾花数据集划分为训练集和测试集
X_train_iris, X_test_iris, y_train_iris, y_test_iris = train_test_split(X_iris, y_iris, test_size=0.2, random_state=42)

(3)解释:

  • train_test_split():用于将数据集划分为训练集和测试集。这里使用 80% 的数据用于模型训练,20% 的数据用于测试模型。
  • random_state=42:确保数据集划分的随机性保持一致,便于结果复现。
  • X_train_iris, y_train_iris 分别表示鸢尾花训练集的特征和标签,X_test_iris, y_test_iris 为测试集。

3.4 对 LightGBM 模型进行参数优化

(1)目标:

  • 使用网格搜索 (GridSearchCV) 对 LightGBM 分类器的参数进行优化,找到最佳参数组合以提高模型性能。

(2)代码:

# 定义LightGBM模型和参数网格
lgb_model_iris = lgb.LGBMClassifier(random_state=42)
lgb_param_grid_iris = {'n_estimators': [50, 100, 200],'num_leaves': [31, 50, 100],'learning_rate': [0.01, 0.1, 0.3]
}# 进行网格搜索和交叉验证
lgb_grid_search_iris = GridSearchCV(estimator=lgb_model_iris, param_grid=lgb_param_grid_iris, scoring='accuracy', cv=3)
lgb_grid_search_iris.fit(X_train_iris, y_train_iris)# 打印最佳参数
print("LightGBM最佳参数(鸢尾花数据集):", lgb_grid_search_iris.best_params_)

(3)解释:

  • 定义模型lgb.LGBMClassifierLightGBM 分类器,用于处理鸢尾花数据集的分类任务。
  • 参数优化
    • 通过网格搜索 (GridSearchCV) 调整 n_estimators(决策树数量)、num_leaves(叶子节点数)和 learning_rate(学习率)等参数。
    • cv=3 表示 3 折交叉验证,用于评估模型性能并选择最佳参数组合。
  • 输出最佳参数:通过 best_params_ 打印 LightGBM 模型的最佳参数组合。

3.5 使用测试集进行预测并评估模型性能

(1)目标:

  • 使用通过网格搜索找到的最佳 LightGBM 模型对测试集进行预测,并评估模型的分类性能。

(2)代码:

# 使用最佳LightGBM模型对测试集进行预测
lgb_y_pred_iris = lgb_grid_search_iris.best_estimator_.predict(X_test_iris)# 评估模型性能(准确率和F1得分)
lgb_accuracy_iris = accuracy_score(y_test_iris, lgb_y_pred_iris)
lgb_f1_iris = f1_score(y_test_iris, lgb_y_pred_iris, average='weighted')# 打印性能结果
print(f"LightGBM分类器 - 鸢尾花数据集: 准确率 = {lgb_accuracy_iris}, F1 得分 = {lgb_f1_iris}")

(3)解释:

  • 预测:使用 best_estimator_ 返回最佳 LightGBM 模型,使用 predict() 方法对测试集进行预测。
  • 性能评估
    • accuracy_score() 用于计算模型的准确率,即预测正确的样本占总样本的比例。
    • f1_score() 计算 F1 得分,衡量模型的精确率和召回率的平衡。
  • 输出结果:打印 LightGBM 模型在鸢尾花数据集上的准确率和 F1 得分。

3.6 可视化模型性能

(1)目标:

  • 绘制 LightGBM 模型在鸢尾花数据集上的准确率和 F1 得分的柱状图,直观展示模型性能。

(2)代码:

# 绘制LightGBM模型性能柱状图
performance_metrics = ['Accuracy', 'F1 Score']
lgb_performance_iris = [lgb_accuracy_iris, lgb_f1_iris]plt.figure(figsize=(8, 6))
plt.bar(performance_metrics, lgb_performance_iris, color='green')
plt.title('LightGBM 模型在鸢尾花数据集上的性能')
plt.ylabel('得分')
plt.ylim(0, 1)
plt.show()

(3)解释:

  • 绘图:使用 matplotlibbar() 函数绘制柱状图,展示 LightGBM 模型的准确率和 F1 得分。
  • 直观展示:通过柱状图直观展示模型的分类性能,帮助更好地理解模型的优劣。
    • ylim(0, 1) 设置 Y 轴的范围为 0 到 1。

4.总体代码和结果

4.1葡萄酒

(1)总体代码

# 步骤一:导入所需模块
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pdfrom sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.feature_selection import SelectFromModel
from sklearn.metrics import f1_score
import numpy as np# 步骤二:导入数据集,并分割为特征和标签
wine = load_wine()
X = wine.data
y = wine.target# 步骤三:划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 输出训练集和测试集的形状
print("训练集特征形状:", X_train.shape)
print("测试集特征形状:", X_test.shape)
print("训练集标签形状:", y_train.shape)
print("测试集标签形状:", y_test.shape)# 步骤四:定义随机森林分类器并进行参数优化
rf = RandomForestClassifier(random_state=42)
param_grid = {'n_estimators': [50, 100, 200],'max_depth': [None, 10, 20],'min_samples_split': [2, 5]
}grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, scoring='accuracy', cv=3)
grid_search.fit(X_train, y_train)# 打印最佳参数
print("最佳参数:", grid_search.best_params_)# 步骤五:使用最佳参数训练模型
best_model = grid_search.best_estimator_
best_model.fit(X_train, y_train)# 步骤六:打印出分类器的混淆矩阵
y_pred = best_model.predict(X_test)
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:\n", conf_matrix)# 绘制混淆矩阵热力图
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.xlabel('Predicted label')
plt.ylabel('True label')
plt.show()# 步骤七:获取特征重要性并排序可视化
feature_importances = best_model.feature_importances_
feature_names = wine.feature_names
feature_importance_df = pd.DataFrame({'Feature': feature_names, 'Importance': feature_importances})
feature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)# 绘制特征重要性条形图
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=feature_importance_df)
plt.title('Feature Importance from Random Forest')
plt.show()# 步骤八:进行特征选择
selector = SelectFromModel(best_model, threshold='mean', prefit=True)
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test)# 步骤九:使用选择后的特征训练模型并评估
rf_selected = RandomForestClassifier(random_state=42)
rf_selected.fit(X_train_selected, y_train)
y_pred_selected = rf_selected.predict(X_test_selected)accuracy_selected = accuracy_score(y_test, y_pred_selected)
f1_selected = f1_score(y_test, y_pred_selected, average='weighted')print("选择后模型的准确率:", accuracy_selected)
print("选择后模型的F1得分:", f1_selected)# 步骤十:绘制性能对比图
performance_metrics = ['Accuracy', 'F1 Score']
original_performance = [accuracy_score(y_test, y_pred), f1_score(y_test, y_pred, average='weighted')]
selected_performance = [accuracy_selected, f1_selected]fig, ax = plt.subplots(figsize=(10, 6))
bar_width = 0.35
index = np.arange(len(performance_metrics))bar1 = ax.bar(index, original_performance, bar_width, label='Original Features')
bar2 = ax.bar(index + bar_width, selected_performance, bar_width, label='Selected Features')ax.set_xlabel('Performance Metrics')
ax.set_title('Classifier Performance Comparison Before and After Feature Selection')
ax.set_xticks(index + bar_width / 2)
ax.set_xticklabels(performance_metrics)
ax.legend()for bar in bar1 + bar2:height = bar.get_height()ax.annotate('%.2f' % height, xy=(bar.get_x() + bar.get_width() / 2, height),xytext=(0, 3), textcoords="offset points", ha='center', va='bottom')plt.show()

(2)运行结果

训练集特征形状: (142, 13)
测试集特征形状: (36, 13)
训练集标签形状: (142,)
测试集标签形状: (36,)
最佳参数: {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 100}
混淆矩阵:[[14  0  0][ 0 14  0][ 0  0  8]]

选择后模型的准确率: 0.9722222222222222
选择后模型的F1得分: 0.9717752234993614

[22]:

(3)结果分析

          模型在葡萄酒数据集上的分类表现非常优异,达到了 97.22% 的准确率和 0.9718 的 F1 得分。通过最佳参数(未限制树深度、100 棵树等),模型有效地避免了过拟合,并且对所有类别的分类均无误,具备良好的泛化能力和稳定性。

4.2鸢尾花

(1)总体代码

# 步骤一:导入需要的库文件及数据集
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, f1_score
import xgboost as xgb
import lightgbm as lgb
import matplotlib.font_manager as fm# 设置中文字体,解决显示中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
font_path = 'C:/Windows/Fonts/simhei.ttf'  # Windows系统的字体路径
my_font = fm.FontProperties(fname=font_path)# 步骤二:加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
features = iris.feature_names# 将数据转换为DataFrame便于查看
df = pd.DataFrame(X, columns=features)
df['target'] = y# 步骤三:对数据进行初步探索,包括查看数据的基本信息和可视化特征之间的关系
print(df.info())
print(df.describe())# 可视化特征之间的关系
sns.pairplot(df, hue="target", markers=["o", "s", "D"])
plt.show()# 步骤四:将数据集分为训练集和测试集,按8:2的比例划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 步骤五:对选定的分类方法(XGBoost和LightGBM)进行参数优化
# 1. XGBoost参数优化
xgb_model = xgb.XGBClassifier(random_state=42)
xgb_param_grid = {'n_estimators': [50, 100, 200],'max_depth': [3, 5, 7],'learning_rate': [0.01, 0.1, 0.3]
}
xgb_grid_search = GridSearchCV(estimator=xgb_model, param_grid=xgb_param_grid, scoring='accuracy', cv=3)
xgb_grid_search.fit(X_train, y_train)
xgb_best_model = xgb_grid_search.best_estimator_
print(f"XGBoost最佳参数: {xgb_grid_search.best_params_}")# 2. LightGBM参数优化
# 使用 verbosity=-1 来消除警告
lgb_model = lgb.LGBMClassifier(random_state=42, verbosity=-1)# LightGBM参数优化
lgb_param_grid = {'n_estimators': [50, 100, 200],'num_leaves': [31, 50, 100],'learning_rate': [0.01, 0.1, 0.3]
}lgb_grid_search = GridSearchCV(estimator=lgb_model, param_grid=lgb_param_grid, scoring='accuracy', cv=3)
lgb_grid_search.fit(X_train, y_train)lgb_best_model = lgb_grid_search.best_estimator_
print(f"LightGBM最佳参数: {lgb_grid_search.best_params_}")# 步骤六:使用测试集进行预测,并将结果保存下来
xgb_y_pred = xgb_best_model.predict(X_test)
lgb_y_pred = lgb_best_model.predict(X_test)# 保存结果到CSV文件
pd.DataFrame({'XGBoost预测结果': xgb_y_pred, 'LightGBM预测结果': lgb_y_pred}).to_csv('classification_results.csv', index=False)# 步骤七:分别比较参数优化前后及特征选择前后两个不同分类器的性能
# 对XGBoost分类器的性能评估
xgb_accuracy = accuracy_score(y_test, xgb_y_pred)
xgb_f1 = f1_score(y_test, xgb_y_pred, average='weighted')
print(f"XGBoost分类器 - 准确率: {xgb_accuracy}, F1得分: {xgb_f1}")# 对LightGBM分类器的性能评估
lgb_accuracy = accuracy_score(y_test, lgb_y_pred)
lgb_f1 = f1_score(y_test, lgb_y_pred, average='weighted')
print(f"LightGBM分类器 - 准确率: {lgb_accuracy}, F1得分: {lgb_f1}")# 步骤八:对比较结果进行可视化
performance_metrics = ['Accuracy', 'F1 Score']
xgb_performance = [xgb_accuracy, xgb_f1]
lgb_performance = [lgb_accuracy, lgb_f1]fig, ax = plt.subplots(figsize=(10, 6))
bar_width = 0.35
index = np.arange(len(performance_metrics))bar1 = ax.bar(index, xgb_performance, bar_width, label='XGBoost')
bar2 = ax.bar(index + bar_width, lgb_performance, bar_width, label='LightGBM')ax.set_xlabel('性能指标', fontproperties=my_font)
ax.set_title('XGBoost vs LightGBM 性能比较', fontproperties=my_font)
ax.set_xticks(index + bar_width / 2)
ax.set_xticklabels(performance_metrics, fontproperties=my_font)
ax.legend()# 在柱状图上标注数值
for bar in bar1 + bar2:height = bar.get_height()ax.annotate('%.2f' % height, xy=(bar.get_x() + bar.get_width() / 2, height),xytext=(0, 3), textcoords="offset points", ha='center', va='bottom')plt.show()

(2)运行结果

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):#   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  0   sepal length (cm)  150 non-null    float641   sepal width (cm)   150 non-null    float642   petal length (cm)  150 non-null    float643   petal width (cm)   150 non-null    float644   target             150 non-null    int64  
dtypes: float64(4), int64(1)
memory usage: 6.0 KB
Nonesepal length (cm)  sepal width (cm)  petal length (cm)  \
count         150.000000        150.000000         150.000000   
mean            5.843333          3.057333           3.758000   
std             0.828066          0.435866           1.765298   
min             4.300000          2.000000           1.000000   
25%             5.100000          2.800000           1.600000   
50%             5.800000          3.000000           4.350000   
75%             6.400000          3.300000           5.100000   
max             7.900000          4.400000           6.900000   petal width (cm)      target  
count        150.000000  150.000000  
mean           1.199333    1.000000  
std            0.762238    0.819232  
min            0.100000    0.000000  
25%            0.300000    0.000000  
50%            1.300000    1.000000  
75%            1.800000    2.000000  
max            2.500000    2.000000  

XGBoost最佳参数: {'learning_rate': 0.01, 'max_depth': 3, 'n_estimators': 200}
LightGBM最佳参数: {'learning_rate': 0.01, 'n_estimators': 200, 'num_leaves': 31}
XGBoost分类器 - 准确率: 1.0, F1得分: 1.0
LightGBM分类器 - 准确率: 1.0, F1得分: 1.0

(3)结果分析

        模型在鸢尾花数据集上的表现同样出色,分类准确率达到了 100%。通过最佳参数的选择,模型能够对所有类别的样本进行准确分类,显示出较强的泛化能力和稳定性,证明了其对数据的高效学习和精确预测能力。

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

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

相关文章

Java面试篇基础部分-Java线程池工作原理

线程池的出现,主要是用来管理一组线程的工作运行状态,这样可以方便JVM更好的利用CPU资源。 Java线程池的工作原理:JVM先根据用户的参数创建一定数量的可运行的线程任务,并且将这些任务放入到队列中,在线程创建之后,启动这些任务。 如果当线程数超过最大线程数,这个线程数…

WIFI路由器的套杆天线简谈

❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代&#xff0c;想必大家对其都不陌生。随着科技的发展&#xff0c;常用的路由器上的天线也越来越多&#xff0c;那么问题来了&#xff1a;天线越多&#xff0c;信号越好吗&#xff1f;路由器…

视频转文字工具:开启视频内容深度挖掘的钥匙

图片里到文字要提取出来&#xff0c;现在有很多的工具&#xff0c;但是视频里的文字要提取出来&#xff0c;是不是就不那么好操作呢&#xff1f;并不是的&#xff0c;现在也有不少支持视频转文字的工具&#xff0c;这次我们就来介绍一些可以提高我们视频文字提取效率的工具吧。…

【CSS in Depth 2 精译_033】5.4 Grid 网格布局的显示网格与隐式网格(中)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

[Redis][环境配置]详细讲解

目录 1.安装 && 简单配置2.文件目录说明3.客户端 1.安装 && 简单配置 Ubuntu下&#xff0c;直接使用sudo apt install redis -y即可支持远程连接&#xff1a;修改/etc/redis/redis.conf 将bind 127.0.0.1改为bing 0.0.0.0作为学习用途&#xff0c;可以将prote…

代码——IMX6UL烧录工具及其使用

一、简介 在此感谢正点原子官方提供的IMX6UL烧录代码&#xff0c;本篇是在正点原子给的代码基础上修改的&#xff0c;增加了些许功能&#xff0c;可根据自己的需求更改。此外代码难免有疏漏之处&#xff0c;还望见谅 二、源代码的使用 1,库和工具的安装 安装库和工具前&#x…

Datawhale X 南瓜书 task01学习笔记

机器学习三观 机器学习工程领先理论 what:什么是机器学习? 机器学习定义&#xff1a;研究关于“学习算法”(一类能从数据中学习出其背后潜在规律的算法)的一门学科PS:深度学习指的是&#xff1a;神经网络那一类学习算法&#xff0c;因此是机器学习的子集把深度学习单列出来…

idea连接docker 自动化部署

进入Linux服务器 vim /lib/systemd/system/docker.service将 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 替换为 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock新建文件 Dockerfile配置Dockerfile文…

Linux下rpm方式部署mysql(国产化生产环境无联网服务器部署实操)

请放心观看&#xff0c;已在正式环境部署验证&#xff0c;流程无问题&#xff01; 所用系统为国产化麒麟银河 aarch64系统&#xff0c;部署时间2024年9月份&#xff01; #查看服务器信息 #涉及生产服务器&#xff0c;所以输出信息隐藏了一部分[rootecs-xxxxx hdata]# uname -…

Java 中常用的排序算法

Java 中常用的排序算法有很多&#xff0c;每种算法的时间复杂度和适用场景都不同。以下是几种常见的排序算法及其 Java 实现和讲解&#xff1a; 1. 冒泡排序 (Bubble Sort) 算法思路&#xff1a; 重复地遍历数组&#xff0c;每次比较相邻两个元素。如果前一个比后一个大&…

性能测试笔记

一、性能测试介绍 1.概述 性能测试时通过工具/代码模拟正常/峰值/异常的负载条件&#xff0c;对系统的各项性能指标进行测试和评估的过程 本阶段的学习范围是服务端的性能测试&#xff0c;不包括客户端性能 测试目的 评估当前系统能力&#xff0c;如&#xff1a;新出的手机都…

新书速览|NestJS全栈开发解析:快速上手与实践

《NestJS全栈开发解析:快速上手与实践》 本书内容 《NestJS全栈开发解析:快速上手与实践》旨在帮助读者快速掌握NestJS&#xff08;简称Nest&#xff09;开发&#xff0c;并应用于实战项目。本书共10章&#xff0c;首先介绍基本概念&#xff0c;为读者打下坚实的知识基础。接着…

chapter15-泛型——(泛型语法)——day20

目录 554-泛型引入 555-泛型入门 556-泛型入门 557-泛型应用实例 558/9-泛型使用细节 560-泛型课堂练习 554-泛型引入 555-泛型入门 556-泛型入门 泛型先泛再型 557-泛型应用实例 泛型一旦指定了&#xff0c;编译器就会按照指定来约束传入类型 558/9-泛型使用细节 560-泛…

算法训练——day15数组交集(是否去重)

349. 两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入…

Java SE基础知识详解:源于技术书籍的深度解读

写在前面 ⭐️在无数次的复习巩固中&#xff0c;我逐渐意识到一个问题&#xff1a;面对同样的面试题目&#xff0c;不同的资料来源往往给出了五花八门的解释&#xff0c;这不仅增加了学习的难度&#xff0c;还容易导致概念上的混淆。特别是当这些信息来自不同博主的文章或是视…

【C语言零基础入门篇 - 9】:文件操作

文章目录 文件操作文件的简介指向指针的文件文件的打开方式字符的读取和存储数据的读取和存储 文件操作 文件的简介 一、什么是文件&#xff1f; 文件有不同的类型&#xff0c;主要有两种文件&#xff1a; &#xff08;1&#xff09;程序文件。&#xff08;2&#xff09;数据…

python基础(1)pyenv安装和对Django使用

pyenv安装 pyenv主要针对类 Unix 系统&#xff08;如 Linux、macOS&#xff09;用户&#xff0c;pyenv-win 是专为 Windows 开发的 pyenv 版本&#xff0c;允许您在不使用 WSL 的情况下管理多个 Python 版本和虚拟环境。 建议Git Bash&#xff1a; Powershell或Git Bash&…

攻防实战-nacos新洞如何反弹和注入内存马

攻防实战-nacos新洞如何反弹和注入内存马 起因 ‍‍‍‍hw中,遇到2个nacos还在测试nacos的yaml漏洞时候,突然有人发了0day.不过网上的师傅好像都没有继续下一步. 本地搭建了windows和linux先本地测试了一下. 测试 ‍‍总体分为两步,第一步 http://ip/nacos/v1/cs/ops/data/…

基于windows下docker安装HDDM并运行

安装主要教程 如何安装HDDM(基于windows下 docker 和 linux) | 传鹏的实验室 (chuan-peng-lab.netlify.app) 安装时遇到的问题 1.下载完docker安装包&#xff0c;安装提示不适合本电脑 解决办法&#xff1a; 第一步&#xff1a;开启CPU虚拟化 Windows电脑如何开启CPU虚拟化…

【C51】独立按键控制LED灯

1.简介 在单片机应用系统中&#xff0c;常常使用轻触按键组成键盘。轻触按键具有自动回弹的特点&#xff0c;即按下按键&#xff0c;两个触点接通&#xff0c;放开按键&#xff0c;两个触点断开。轻触按键的外形及电路符号如图&#xff0c;通常轻触按键有4个引脚&#xff0c;4个…