支持向量机
- 支持向量机是比较有效的机器学习算法,通过找到支持向量,找到最大的决策边界。
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_)