SVM(支持向量机)是一种强大的机器学习算法,尤其在分类问题上表现出色。Python中,我们可以使用scikit-learn库轻松实现SVM分类器。以下将详细介绍如何使用Python实现SVM分类器,并提供一个实战案例。
SVM基础
SVM通过找到一个最优的超平面来分隔数据集中的两类样本。这个超平面是数据集中最近距离超平面的样本点(支持向量)所决定的。
安装scikit-learn
首先,确保你的Python环境中已经安装了scikit-learn库。如果没有安装,可以通过以下命令进行安装:
pip install scikit-learn
导入必要的库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix
加载数据集
这里我们使用scikit-learn自带的鸢尾花(Iris)数据集作为例子。
iris = datasets.load_iris()
X = iris.data
y = iris.target
数据预处理
为了提高模型的性能,我们需要对数据进行标准化处理。
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
创建SVM分类器
我们使用SVC类创建一个SVM分类器,并设置核函数为'rbf'。
svm_classifier = SVC(kernel='rbf', gamma='scale')
训练模型
使用训练集数据来训练SVM分类器。
svm_classifier.fit(X_train, y_train)
预测和评估
使用训练好的模型对测试集进行预测,并评估模型的性能。
y_pred = svm_classifier.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
实战案例:手写数字识别
现在,我们将使用MNIST手写数字数据集来展示如何使用SVM进行图像识别。
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 加载数据集
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist["data"], mnist["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)
# 创建SVM分类器
svm_classifier = SVC(kernel='rbf', gamma='scale')
# 训练模型
svm_classifier.fit(X_train_scaled, y_train)
# 预测和评估
y_pred = svm_classifier.predict(X_test_scaled)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
通过以上步骤,我们可以轻松地在Python中使用SVM分类器。当然,SVM还有许多参数可以调整,例如核函数、C值等,这些都可以根据具体问题进行调整以获得最佳性能。