入门基础理论
点这里
写的太细了,以至于都不需要自己做笔记····
手写笔记
只有自己看得懂,拍照记录一下
代码
使用sklearn:官方文档
# 导库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
# 使用sklearn生成随机数据,模拟数据
from sklearn.datasets.samples_generator import make_blobs
# n_samples指定样本个数,centers结果种类 cluster_std簇的离散程度
X, y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)
使用matplotlib画SVM图形
def plot_svc_decision_function(model, ax=None, plot_support=True):
"""绘图 二维的svc决策函数"""
if ax is None:
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# create grid to evaluate model
x = np.linspace(xlim[0], xlim[1], 30)
y = np.linspace(ylim[0], ylim[1], 30)
Y, X = np.meshgrid(y, x)
xy = np.vstack([X.ravel(), Y.ravel()]).T
P = model.decision_function(xy).reshape(X.shape)
# plot decision boundary and margins
ax.contour(X, Y, P, colors='k',
levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
# plot support vectors
if plot_support:
ax.scatter(model.support_vectors_[:, 0],
model.support_vectors_[:, 1],
s=300, linewidth=1, facecolors='none')
ax.set_xlim(xlim)
ax.set_ylim(ylim)
创建一个简单的svm模型
需要重点关注的就是C的值,还有gamma,两个参数都需要寻找最合适的值。可以通过GridSearchCV来做做最优参数的组合。
- 调节C,也就是软间隔问题(soft margin),C越大分类越严格,相对的容易过拟合,泛化能力差。C越小越能容忍错误
- 只在rbf中使用,gamma越大 特征映射纬度越高,模型越复杂,泛化能力越差
clf = SVC(kernel='rbf', C=1, gamma=0.01).fit(X, y)
# clf = SVC(kernel='linear', C=1).fit(X, y)
看看半成品结果
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(clf)
plt.show()
GridSearchCV寻找最优参数
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [1, 5, 10], 'gamma': [0.01, 0.0005, 0.0001]}
grid = GridSearchCV(clf, param_grid=param_grid)
grid.fit(X, y)
print(grid.best_params_)
不同的模型和数据,使用的c和gamma都是不一样的。调参的过程还是看自己。。。
过程中还可以将数据使用K折验证法配合GridSearchCV。
别人的代码:
def ml_svc(X, y):
"""
svc 算法
:param X: 训练集
:param y: 标签
:param model_name: 模型名
:return: svc.model
"""
# 定义模型名
model_name = 'svc.model'
# 取出部分样例划分 训练集(寻参用) 和 测试集(评估用),进行 网格寻参 以及 评估模型
X_train, X_test, y_train, y_test = train_test_split(X[:2000], y[:2000], test_size=0.2)
# 网格寻参范围
param_grid = {
'C': [2 ** i for i in range(-5, 15, 2)],
'gamma': [2 ** i for i in range(3, -15, -2)],
}
# param_grid = {
# 'C': [1e3, 5e3, 1e4, 5e4, 1e5],
# 'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1],
# }
# 定义模型
svc = SVC(kernel='rbf', class_weight='balanced')
# 定义用于网格寻参的对象,每次锁定一组参数,进行5折交叉验证,评定标准为 f1 score
clf = GridSearchCV(svc, param_grid, scoring='f1', n_jobs=10, cv=5)
# 开始在数据集 X_train, y_train 上进行网格寻参
clf.fit(X_train, y_train)
# 打印最优的参数
print(clf.best_estimator_)
# 评估模型,这里的原理是利用最优参数对应的模型进行预测
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
# 重新定义 svc 模型
svc = SVC(kernel='rbf', class_weight='balanced',
C = clf.best_params_['C'], gamma=clf.best_params_['gamma'])
# 训练模型
model = svc.fit(X, y)
# 打印模型信息
print(model)
# 保存模型
with open(model_path + 'svc.model', 'wb') as f:
pickle.dump(model, f)
print('save svc.model done')
return model