最易懂的支持向量机(SVM)实战教程:从原理到代码全解析
【免费下载链接】100-Days-Of-ML-Code 项目地址: https://gitcode.com/gh_mirrors/100d/100-Days-Of-ML-Code
你是否还在为机器学习算法的复杂数学公式头疼?是否想快速掌握一个既能处理线性问题又能解决非线性问题的强大分类工具?本文将通过100-Days-Of-ML-Code项目中的实战案例,带你从零开始学习支持向量机(SVM),无需深厚数学基础,只需跟随步骤操作,就能在30分钟内完成你的第一个SVM分类项目。读完本文后,你将能够独立使用SVM解决实际分类问题,并理解其工作原理和参数调优方法。
什么是支持向量机(SVM)
支持向量机(Support Vector Machine,简称SVM)是一种经典的监督学习算法,主要用于解决分类问题。它的核心思想是找到一个最优超平面,将不同类别的样本分开,并且使边际最大化。这个超平面就像是在两类样本之间画一条线,不仅要能分开它们,还要尽可能远离两边的样本,这样才能在新数据上有更好的分类效果。
SVM的优势
- 对于高维空间仍然有效
- 在维度大于样本数时仍然表现良好
- 只使用训练集中的一部分样本(支持向量),内存占用小
- 可以通过核函数处理非线性问题
SVM的应用场景
- 图像识别与分类
- 文本分类与情感分析
- 生物信息学中的蛋白质结构预测
- 金融风险评估与欺诈检测
SVM实战案例:社交网络广告点击预测
在100-Days-Of-ML-Code项目中,Day 13提供了一个完整的SVM实战案例,使用社交网络广告数据来预测用户是否会点击广告。我们将基于这个案例,一步步学习SVM的实现过程。
数据集介绍
本案例使用的数据集是Social_Network_Ads.csv,包含了用户的年龄、估计薪资和是否购买了产品的信息。我们的目标是根据年龄和薪资预测用户是否会购买产品。
数据集位置:datasets/Social_Network_Ads.csv
SVM算法流程图
下面是SVM算法的基本流程图,展示了从数据准备到模型评估的完整过程:
实战步骤
1. 导入必要的库
首先,我们需要导入Python的一些常用库,包括numpy用于数值计算,pandas用于数据处理,matplotlib用于数据可视化,以及sklearn库中的SVM模型和相关工具。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
相关代码文件:Code/Day 13_SVM.py
2. 加载和准备数据
接下来,我们加载数据集并准备特征和标签。我们将使用年龄和估计薪资作为特征,是否购买作为标签。
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
3. 拆分数据集
为了评估模型性能,我们需要将数据集拆分为训练集和测试集。通常使用80%的数据作为训练集,20%作为测试集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
4. 特征缩放
由于SVM对特征的尺度敏感,我们需要对特征进行标准化处理,将其缩放到相同的数量级。
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
注意:这里测试集应该使用训练集的缩放参数,即使用transform而不是fit_transform,以避免数据泄露。
5. 训练SVM模型
现在我们可以创建SVM分类器并使用训练集进行训练。这里我们使用线性核函数,后续会介绍其他核函数的使用。
from sklearn.svm import SVC
classifier = SVC(kernel = 'linear', random_state = 0)
classifier.fit(X_train, y_train)
6. 预测测试集结果
训练完成后,我们使用训练好的模型对测试集进行预测。
y_pred = classifier.predict(X_test)
7. 模型评估
为了评估模型性能,我们使用混淆矩阵来查看分类结果。混淆矩阵可以展示真正例(TP)、假正例(FP)、真负例(TN)和假负例(FN)的数量。
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
8. 可视化训练结果
为了更直观地理解SVM的分类效果,我们可以将训练集的分类结果可视化。下面的代码会绘制出决策边界和样本点的分布。
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('SVM (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()
下面是训练集的可视化结果,可以看到SVM找到了一个线性超平面将两类样本分开:
9. 可视化测试结果
同样,我们也可以可视化测试集的分类结果,评估模型在新数据上的表现。
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('SVM (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()
测试集的可视化结果如下,可以看到模型在测试集上也表现良好:
SVM核函数详解
SVM的强大之处在于它可以通过核函数处理非线性问题。除了上面使用的线性核函数,常用的核函数还有:
1. 多项式核函数
多项式核函数可以将数据映射到高维空间,从而处理非线性问题。它的参数包括degree(多项式次数)。
classifier = SVC(kernel = 'poly', degree = 3, random_state = 0)
2. 高斯核函数(RBF)
高斯核函数(径向基函数)是最常用的核函数之一,它可以将数据映射到无穷维空间,适用于各种复杂的数据分布。
classifier = SVC(kernel = 'rbf', gamma = 0.1, C = 1.0, random_state = 0)
其中,gamma参数控制核函数的宽度,C参数是正则化参数,控制模型的复杂度和泛化能力的权衡。
3. Sigmoid核函数
Sigmoid核函数可以将SVM转化为一个神经网络模型,常用于深度学习中。
classifier = SVC(kernel = 'sigmoid', random_state = 0)
SVM参数调优
SVM的性能很大程度上取决于参数的选择。常用的调优方法有网格搜索和交叉验证。下面是使用网格搜索寻找最佳参数的示例:
from sklearn.model_selection import GridSearchCV
parameters = [{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'kernel': ['rbf'], 'gamma': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]}]
grid_search = GridSearchCV(estimator = classifier,
param_grid = parameters,
scoring = 'accuracy',
cv = 10,
n_jobs = -1)
grid_search = grid_search.fit(X_train, y_train)
best_accuracy = grid_search.best_score_
best_parameters = grid_search.best_params_
总结与展望
通过本文的学习,我们了解了SVM的基本原理和实现步骤,并通过100-Days-Of-ML-Code项目中的案例进行了实战练习。SVM是一种强大的分类算法,在很多实际问题中都有优秀的表现。
你已经学会
- SVM的基本原理和核心思想
- 使用scikit-learn库实现SVM分类
- 数据预处理和模型评估方法
- 核函数的选择和参数调优
下一步学习建议
- 深入理解SVM的数学原理
- 尝试使用不同的核函数解决非线性问题
- 学习SVM在回归问题中的应用(SVR)
- 将SVM与其他分类算法进行比较
完整的代码实现可以参考项目中的Code/Day 13_SVM.ipynb文件,更多机器学习算法的实战案例可以查看项目README.md和其他Days的代码。
希望本文能帮助你快速掌握SVM算法,如果有任何问题或建议,欢迎在项目中提交issue或参与讨论。记得点赞、收藏并关注项目更新,获取更多机器学习实战教程!
参考资料
- 项目官方文档:README.md
- SVM完整代码:Code/Day 13_SVM.py
- Scikit-learn SVM文档:Other Docs/速查手册/Python数据科学速查表 - Scikit-Learn.pdf
- 数据科学学习资源:Other Docs/
【免费下载链接】100-Days-Of-ML-Code 项目地址: https://gitcode.com/gh_mirrors/100d/100-Days-Of-ML-Code
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



