机器学习入门实战:基于 Sklearn 实现鸢尾花分类(含 GridSearch 参数调优)
机器学习入门实战:基于 Sklearn 实现鸢尾花分类(含 GridSearch 参数调优)
本实战将引导您一步步使用 Python 的 Scikit-learn 库实现鸢尾花分类任务。鸢尾花数据集是机器学习中的经典数据集,包含三种鸢尾花(Setosa、Versicolor、Virginica)的四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。我们将使用支持向量机(SVM)作为分类模型,并通过 GridSearch 进行超参数调优,以提高模型性能。整个过程包括数据加载、预处理、模型训练、调优和评估。所有代码均基于真实可靠的 Sklearn 实践。
步骤 1: 准备数据
首先,加载鸢尾花数据集并分割为训练集和测试集。数据预处理包括标准化特征(可选,但通常能提升 SVM 性能),这里我们使用 Sklearn 的 StandardScaler。数据分割比例为 80% 训练集和 20% 测试集。
# 导入所需库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data # 特征矩阵 (150 个样本 × 4 个特征)
y = iris.target # 标签向量 (0, 1, 2 对应三种鸢尾花)
# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 标准化特征 (均值为 0,标准差为 1)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
步骤 2: 选择并训练基础模型
我们选择支持向量机(SVM)作为分类模型。SVM 的核心思想是找到一个超平面来最大化类间间隔。决策函数可表示为: $$ f(\mathbf{x}) = \text{sign}(\mathbf{w} \cdot \mathbf{x} + b) $$ 其中 $\mathbf{w}$ 是权重向量,$b$ 是偏置项。我们使用径向基函数(RBF)核,适合非线性分类。先训练一个基础模型(无调优),并评估其准确率。
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 初始化 SVM 模型(使用默认参数)
svm_base = SVC(kernel='rbf', random_state=42)
svm_base.fit(X_train_scaled, y_train) # 训练模型
# 在测试集上预测并评估
y_pred_base = svm_base.predict(X_test_scaled)
base_accuracy = accuracy_score(y_test, y_pred_base)
print(f"基础模型准确率: {base_accuracy:.4f}")
步骤 3: 使用 GridSearch 进行参数调优
基础模型可能未达到最优性能,因为 SVM 的关键参数如正则化强度 $C$ 和核函数参数 $\gamma$ 需要优化。GridSearch 通过穷举搜索给定参数网格,找到最佳组合。我们定义参数范围:
- $C$:控制误分类惩罚,值越大模型越复杂。
- $\gamma$:影响 RBF 核的宽度,值越大决策边界越复杂。
参数网格为:
- $C$: [0.1, 1, 10, 100]
- $\gamma$: [1, 0.1, 0.01, 0.001]
使用 GridSearchCV 进行 5 折交叉验证。
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'C': [0.1, 1, 10, 100], # 正则化参数
'gamma': [1, 0.1, 0.01, 0.001] # RBF 核参数
}
# 初始化 GridSearch(使用 SVM 模型)
grid_search = GridSearchCV(
SVC(kernel='rbf', random_state=42),
param_grid,
cv=5, # 5 折交叉验证
scoring='accuracy', # 评估指标为准确率
verbose=1 # 输出进度
)
# 执行网格搜索(在训练集上)
grid_search.fit(X_train_scaled, y_train)
# 获取最佳参数和模型
best_params = grid_search.best_params_
best_svm = grid_search.best_estimator_
print(f"最佳参数: {best_params}")
步骤 4: 评估调优后的模型
使用最佳参数模型在测试集上预测,并比较调优前后的性能。计算准确率、混淆矩阵等指标。
from sklearn.metrics import confusion_matrix, classification_report
# 使用最佳模型预测测试集
y_pred_best = best_svm.predict(X_test_scaled)
best_accuracy = accuracy_score(y_test, y_pred_best)
# 输出性能报告
print(f"调优后模型准确率: {best_accuracy:.4f}")
print("\n混淆矩阵:")
print(confusion_matrix(y_test, y_pred_best))
print("\n分类报告:")
print(classification_report(y_test, y_pred_best))
# 比较基础模型和调优模型
print(f"准确率提升: {best_accuracy - base_accuracy:.4f}")
完整代码示例
以下是整合所有步骤的完整 Python 代码:
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 步骤 1: 加载和预处理数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 步骤 2: 训练基础模型
svm_base = SVC(kernel='rbf', random_state=42)
svm_base.fit(X_train_scaled, y_train)
y_pred_base = svm_base.predict(X_test_scaled)
base_accuracy = accuracy_score(y_test, y_pred_base)
print(f"基础模型准确率: {base_accuracy:.4f}")
# 步骤 3: GridSearch 参数调优
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001]}
grid_search = GridSearchCV(SVC(kernel='rbf', random_state=42), param_grid, cv=5, scoring='accuracy', verbose=1)
grid_search.fit(X_train_scaled, y_train)
best_params = grid_search.best_params_
best_svm = grid_search.best_estimator_
print(f"最佳参数: {best_params}")
# 步骤 4: 评估调优模型
y_pred_best = best_svm.predict(X_test_scaled)
best_accuracy = accuracy_score(y_test, y_pred_best)
print(f"调优后模型准确率: {best_accuracy:.4f}")
print("\n混淆矩阵:")
print(confusion_matrix(y_test, y_pred_best))
print("\n分类报告:")
print(classification_report(y_test, y_pred_best))
print(f"准确率提升: {best_accuracy - base_accuracy:.4f}")
结果分析与总结
运行上述代码,您将看到类似输出:
- 基础模型准确率通常在 $0.9$ 到 $0.95$ 之间。
- GridSearch 会输出搜索进度,并找到最佳参数(如 $C=10$, $\gamma=0.1$)。
- 调优后模型准确率可达 $0.97$ 或更高,提升明显。
关键点总结:
- GridSearch 优势:自动化参数搜索,避免手动试错,显著提升模型性能。交叉验证确保结果鲁棒。
- SVM 适用性:RBF 核适合鸢尾花数据集,因为特征间存在非线性关系。
- 扩展建议:尝试其他模型(如随机森林)或添加更多参数(如核函数类型)。数据集较小,但方法可推广到更大数据集。
通过本实战,您掌握了机器学习分类任务的基本流程:从数据准备到模型调优。实际应用中,确保数据质量和参数范围合理是关键。继续练习可加深理解!
机器学习入门实战:基于 Sklearn 实现鸢尾花分类(含 GridSearch 参数调优)
本实战将引导您一步步使用 Python 的 Scikit-learn 库实现鸢尾花分类任务。鸢尾花数据集是机器学习中的经典数据集,包含三种鸢尾花(Setosa、Versicolor、Virginica)的四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。我们将使用支持向量机(SVM)作为分类模型,并通过 GridSearch 进行超参数调优,以提高模型性能。整个过程包括数据加载、预处理、模型训练、调优和评估。所有代码均基于真实可靠的 Sklearn 实践。
步骤 1: 准备数据
首先,加载鸢尾花数据集并分割为训练集和测试集。数据预处理包括标准化特征(可选,但通常能提升 SVM 性能),这里我们使用 Sklearn 的 StandardScaler。数据分割比例为 80% 训练集和 20% 测试集。
# 导入所需库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data # 特征矩阵 (150 个样本 × 4 个特征)
y = iris.target # 标签向量 (0, 1, 2 对应三种鸢尾花)
# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 标准化特征 (均值为 0,标准差为 1)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
步骤 2: 选择并训练基础模型
我们选择支持向量机(SVM)作为分类模型。SVM 的核心思想是找到一个超平面来最大化类间间隔。决策函数可表示为: $$ f(\mathbf{x}) = \text{sign}(\mathbf{w} \cdot \mathbf{x} + b) $$ 其中 $\mathbf{w}$ 是权重向量,$b$ 是偏置项。我们使用径向基函数(RBF)核,适合非线性分类。先训练一个基础模型(无调优),并评估其准确率。
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 初始化 SVM 模型(使用默认参数)
svm_base = SVC(kernel='rbf', random_state=42)
svm_base.fit(X_train_scaled, y_train) # 训练模型
# 在测试集上预测并评估
y_pred_base = svm_base.predict(X_test_scaled)
base_accuracy = accuracy_score(y_test, y_pred_base)
print(f"基础模型准确率: {base_accuracy:.4f}")
步骤 3: 使用 GridSearch 进行参数调优
基础模型可能未达到最优性能,因为 SVM 的关键参数如正则化强度 $C$ 和核函数参数 $\gamma$ 需要优化。GridSearch 通过穷举搜索给定参数网格,找到最佳组合。我们定义参数范围:
- $C$:控制误分类惩罚,值越大模型越复杂。
- $\gamma$:影响 RBF 核的宽度,值越大决策边界越复杂。
参数网格为:
- $C$: [0.1, 1, 10, 100]
- $\gamma$: [1, 0.1, 0.01, 0.001]
使用 GridSearchCV 进行 5 折交叉验证。
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'C': [0.1, 1, 10, 100], # 正则化参数
'gamma': [1, 0.1, 0.01, 0.001] # RBF 核参数
}
# 初始化 GridSearch(使用 SVM 模型)
grid_search = GridSearchCV(
SVC(kernel='rbf', random_state=42),
param_grid,
cv=5, # 5 折交叉验证
scoring='accuracy', # 评估指标为准确率
verbose=1 # 输出进度
)
# 执行网格搜索(在训练集上)
grid_search.fit(X_train_scaled, y_train)
# 获取最佳参数和模型
best_params = grid_search.best_params_
best_svm = grid_search.best_estimator_
print(f"最佳参数: {best_params}")
步骤 4: 评估调优后的模型
使用最佳参数模型在测试集上预测,并比较调优前后的性能。计算准确率、混淆矩阵等指标。
from sklearn.metrics import confusion_matrix, classification_report
# 使用最佳模型预测测试集
y_pred_best = best_svm.predict(X_test_scaled)
best_accuracy = accuracy_score(y_test, y_pred_best)
# 输出性能报告
print(f"调优后模型准确率: {best_accuracy:.4f}")
print("\n混淆矩阵:")
print(confusion_matrix(y_test, y_pred_best))
print("\n分类报告:")
print(classification_report(y_test, y_pred_best))
# 比较基础模型和调优模型
print(f"准确率提升: {best_accuracy - base_accuracy:.4f}")
完整代码示例
以下是整合所有步骤的完整 Python 代码:
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 步骤 1: 加载和预处理数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 步骤 2: 训练基础模型
svm_base = SVC(kernel='rbf', random_state=42)
svm_base.fit(X_train_scaled, y_train)
y_pred_base = svm_base.predict(X_test_scaled)
base_accuracy = accuracy_score(y_test, y_pred_base)
print(f"基础模型准确率: {base_accuracy:.4f}")
# 步骤 3: GridSearch 参数调优
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001]}
grid_search = GridSearchCV(SVC(kernel='rbf', random_state=42), param_grid, cv=5, scoring='accuracy', verbose=1)
grid_search.fit(X_train_scaled, y_train)
best_params = grid_search.best_params_
best_svm = grid_search.best_estimator_
print(f"最佳参数: {best_params}")
# 步骤 4: 评估调优模型
y_pred_best = best_svm.predict(X_test_scaled)
best_accuracy = accuracy_score(y_test, y_pred_best)
print(f"调优后模型准确率: {best_accuracy:.4f}")
print("\n混淆矩阵:")
print(confusion_matrix(y_test, y_pred_best))
print("\n分类报告:")
print(classification_report(y_test, y_pred_best))
print(f"准确率提升: {best_accuracy - base_accuracy:.4f}")
结果分析与总结
运行上述代码,您将看到类似输出:
- 基础模型准确率通常在 $0.9$ 到 $0.95$ 之间。
- GridSearch 会输出搜索进度,并找到最佳参数(如 $C=10$, $\gamma=0.1$)。
- 调优后模型准确率可达 $0.97$ 或更高,提升明显。
关键点总结:
- GridSearch 优势:自动化参数搜索,避免手动试错,显著提升模型性能。交叉验证确保结果鲁棒。
- SVM 适用性:RBF 核适合鸢尾花数据集,因为特征间存在非线性关系。
- 扩展建议:尝试其他模型(如随机森林)或添加更多参数(如核函数类型)。数据集较小,但方法可推广到更大数据集。
通过本实战,您掌握了机器学习分类任务的基本流程:从数据准备到模型调优。实际应用中,确保数据质量和参数范围合理是关键。继续练习可加深理解!
更多推荐
所有评论(0)