调整SVM(支持向量机)模型的参数对于提高分类准确率至关重要。Python中,我们可以使用scikit-learn库中的SVM模块来实现这一目标。以下是一份全面的攻略,旨在帮助你轻松调整SVM模型的参数。
1. 理解SVM模型及其参数
1.1 SVM简介
SVM是一种强大的监督学习算法,用于分类和回归任务。它通过找到最优的超平面来将数据分为不同的类别。
1.2 SVM参数
- C(惩罚参数):控制对误分类的惩罚程度,C值越大,误分类的惩罚越大。
- gamma(核函数系数):用于指定在特征空间中搜索最优超平面的范围。
- kernel(核函数):定义了如何将输入空间映射到高维空间,常用的有线性、多项式、径向基函数(RBF)等。
- degree(多项式核的度数):当使用多项式核时,这个参数定义了多项式的度数。
- coef0(核函数的系数):当使用核函数时,这个参数用于指定偏置项。
2. 使用scikit-learn进行SVM模型训练
2.1 导入库和准备数据
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载数据集
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.3, random_state=42)
# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
2.2 创建SVM模型并训练
from sklearn.svm import SVC
# 创建SVM模型
svm = SVC(kernel='linear')
# 训练模型
svm.fit(X_train, y_train)
3. 参数调整
3.1 使用网格搜索(GridSearchCV)
网格搜索是一种参数调整技术,通过遍历一系列参数组合来寻找最优参数。
from sklearn.model_selection import GridSearchCV
# 设置参数网格
param_grid = {
'C': [0.1, 1, 10, 100],
'gamma': [0.001, 0.01, 0.1, 1],
'kernel': ['rbf', 'linear', 'poly', 'sigmoid']
}
# 创建网格搜索对象
grid_search = GridSearchCV(SVC(), param_grid, cv=5)
# 执行网格搜索
grid_search.fit(X_train, y_train)
# 获取最佳参数
best_params = grid_search.best_params_
3.2 使用随机搜索(RandomizedSearchCV)
当参数空间很大时,随机搜索比网格搜索更有效,因为它不是遍历所有参数组合。
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import expon
# 设置参数分布
param_dist = {
'C': expon(scale=100),
'gamma': expon(scale=.1),
'kernel': ['rbf', 'linear', 'poly', 'sigmoid']
}
# 创建随机搜索对象
random_search = RandomizedSearchCV(SVC(), param_distributions=param_dist, n_iter=100, cv=5, random_state=42)
# 执行随机搜索
random_search.fit(X_train, y_train)
# 获取最佳参数
best_params = random_search.best_params_
4. 验证模型性能
4.1 评估最佳模型
# 使用最佳参数训练SVM模型
best_svm = SVC(**best_params)
best_svm.fit(X_train, y_train)
# 评估模型
score = best_svm.score(X_test, y_test)
print(f"测试集准确率: {score:.2f}")
4.2 可视化结果
为了更好地理解模型的性能,我们可以绘制学习曲线和验证曲线。
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
train_sizes, train_scores, test_scores = learning_curve(best_svm, X, y, cv=5, train_sizes=np.linspace(.1, 1.0, 5))
# 绘制学习曲线
plt.figure()
plt.title("Learning Curve")
plt.plot(train_sizes, train_scores.mean(axis=1), 'o-', color="r", label="Training score")
plt.plot(train_sizes, test_scores.mean(axis=1), 'o-', color="g", label="Cross-validation score")
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.show()
通过以上步骤,你可以轻松地调整SVM模型的参数,以提升分类准确率。记住,模型选择和参数调整是一个迭代的过程,需要根据具体问题和数据集的特性来调整策略。