支持向量机-SVC

支持向量机

  • 支持向量机是比较有效的机器学习算法,通过找到支持向量,找到最大的决策边界。

from sklearn.datasets import make_blobs
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 构造数据集
X, y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.6)
# plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
# plt.show()

# 训练一个基本的SVC
from sklearn.svm import SVC
model = SVC(kernel='linear')
model.fit(X, y)


# 可以打印出支持向量的最近的点的坐标
print(model.support_vectors_)

# 支持向量不变,决策边界不变。

# 引入核函数
from sklearn.datasets import make_circles
X, y = make_circles(100, factor=.1, noise=.1)

clf = SVC(kernel='linear').fit(X, y)

# plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
# plt.show()

# 试试高纬度,高斯核函数,高斯变换, 核变换,比如二维变成三维,
# 径向基函数rbf,
clf = SVC(kernel='rbf', C=1E6)
clf.fit(X, y)

# plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
# plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=300, lw=1, facecolors='none')
# plt.show()


# 调节SVM参数,soft Margin 问题
# 调节C参数
# 当C趋近于无穷大,意味着分类严格不能有错误
# 当C趋近于很小的时候,意味着可以有更大的错误容忍
X, y = make_blobs(n_samples=100, centers=2, random_state=0, cluster_std=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plt.show()

# gamma 值,控制着模型的复杂程度
# 越大,模型的复杂程度越大。

支持向量机实现一个人脸分类的项目

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_lfw_people
faces = fetch_lfw_people(min_faces_per_person=60)
print(faces.target_names)
print(faces.images.shape)


# 画出图像

fig, ax = plt.subplots(3, 5)
for i, axi in enumerate(ax.flat):
    axi.imshow(faces.images[i], cmap='bone')
    axi.set(xticks=[], yticks=[], xlabel=faces.target_names[faces.target[i]])
plt.show()

# 图片的维度很高,每一个点都是一个特征,特征太多了,我们降维度,PCA
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline

pca = PCA(n_components=150, whiten=True, random_state=42)
svc = SVC(kernel='rbf', class_weight='balanced')
model = make_pipeline(pca, svc)

# 构建测试集和训练集
from sklearn.model_selection import train_test_split

Xtrain, Xtest, ytrain, ytest = train_test_split(faces.data, faces.target, random_state=40)


# 使用网格来搜索最佳参数
from sklearn.model_selection import GridSearchCV
param_grid = {'SVC_C': [1, 5, 10], 'svc_gamma':[0.0001, 0.0005, 0.001]}
grid = GridSearchCV(model, param_grid)

print(grid.best_params_)
posted @ 2020-06-11 15:10  心远志高  阅读(617)  评论(0编辑  收藏  举报