SVM支持向量机基础

SVM

  • 用于图像识别、人脸识别等复杂的分类情况
  • 但是效果没有深度学习好,所以现在SVM的很多领域被深度学习取代了
"""
# @Time    :  2020/8/21
# @Author  :  Jimou Chen
"""
from sklearn.svm import SVC  # 导入svm的分类器SVC

# 二维的情况
x = [[3, 3], [4, 3], [1, 1]]
y = [1, 1, 0]  # 分类标签,2个类

# 建模, 核函数为线性
model = SVC(kernel='linear')
model.fit(x, y)

# 打印支持向量
print('支持向量:\n', model.support_vectors_)
# 看看哪几个点是支持向量,打印出来是第2和第0个
print('第几个点是支持向量:\n', model.support_)
# 支持向量的分布情况,在分界线两端,这里打出来是各有1个
print('支持向量在分界线两端的分布情况\n', model.n_support_)

# 预测类别
print('预测坐标(%d, %d)的类别是:' % (-8, 3), model.predict([[-8, 3]]))
print('预测坐标(%d, %d)的类别是:' % (4, 3), model.predict([[4, 3]]))

# 看看系数和截距
print('系数:\n', model.coef_)
print('截距:\n', model.intercept_)

支持向量:
 [[1. 1.]
 [3. 3.]]
第几个点是支持向量:
 [2 0]
支持向量在分界线两端的分布情况
 [1 1]
预测坐标(-8, 3)的类别是: [0]
预测坐标(4, 3)的类别是: [1]
系数:
 [[0.5 0.5]]
截距:
 [-2.]

Process finished with exit code 0

svm处理非线性问题,低维映射到高维

  • 如2维转3维,找到切平面,在投影到2维平面,可能是个圆或者椭圆的分界线
"""
# @Time    :  2020/8/22
# @Author  :  Jimou Chen
"""
import matplotlib.pyplot as plt
from sklearn import datasets

'''用于解决非线性问题'''

# 制造数据
x_data, y_data = datasets.make_circles(n_samples=500, factor=0.3, noise=0.1)
# 画出来看看
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()

'''接下来把2维映射到3维'''

z_data = x_data[:, 0] ** 2 + x_data[:, 1] ** 2
# 画3d图
ax = plt.figure().add_subplot(111, projection='3d')
ax.scatter(x_data[:, 0], x_data[:, 1], z_data, c=y_data, s=10)  # s是大小
plt.show()

投影到二维平面

核函数

svm推导过程

  • 推导过程理解起来较为复杂,见其他机器学习教材或者相关资料

svm处理多分类问题

  • 一般svm是处理二值分类问题的,如果处理多个类别的,使用下面三种方法
model = svm.SVC(decision_function_shape='ovo')
model = svm.SVC(decision_function_shape='ovr')
model = svm.SVC(probability=True)
  • 以下是先用pca降维后,再用svm进行分类的例子
"""
# @Time    :  2020/8/30
# @Author  :  Jimou Chen
"""
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import svm
from sklearn.metrics import classification_report


data = pd.read_csv('data/wine.csv')
y_data = data.iloc[:, 0]
x_data = data.iloc[:, 1:]

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data)
pca = PCA(n_components=2)
new_data = pca.fit_transform(x_data)

# 画出来看一下
plt.scatter(new_data[:, 0], new_data[:, 1], c=y_data)
plt.show()

# 建模预测,多分类的三种方法,有时候会警告,不影响
# model = svm.SVC(decision_function_shape='ovo')
model = svm.SVC(decision_function_shape='ovr')
# model = svm.SVC(probability=True)
model.fit(x_train, y_train)

prediction = model.predict(x_data)

print(model.score(x_test, y_test))
print(classification_report(y_data, prediction))

# 画出预测的
plt.scatter(new_data[:, 0], new_data[0:, 1], c=prediction)
plt.show()
  • 结果:
0.6888888888888889
              precision    recall  f1-score   support

           1       0.89      0.85      0.87        59
           2       0.70      0.72      0.71        71
           3       0.49      0.50      0.49        48

    accuracy                           0.70       178
   macro avg       0.69      0.69      0.69       178
weighted avg       0.71      0.70      0.70       178


Process finished with exit code 0
  • 原始的

  • 预测的

  • 改进
    上面这个题用随机森林的效果会更好,无论降到2/3/5维,预测效果几乎完美
    model = RandomForestClassifier(n_estimators=100)

posted @ 2020-08-23 00:49  JackpotNeaya  阅读(227)  评论(0编辑  收藏  举报