class sklearn.svm.SVC(*, C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=- 1, decision_function_shape='ovr', break_ties=False, random_state=None)[source]
kernel:SVM核函数
能够使用数据原始空间中的向量计算来表示升维后的空间中的点积结果的数学方式,这个在原始空间中的点积函数,被叫做“核函数”
核函数的作用:
1. 确保了高维空间中任意两个向量的点积一定可以被低维空间中的两个向量的某种计算来表示
2. 使用核函数计算低维度中的向量关系更简单
因为计算是在原始空间中进行的,避免了维度的问题
输入 | 含义 | 解决问题 |
“linear” | 线性核 | 线性 |
“poly” | 多项式核 | 偏线性 |
“sigmoid” | 双曲正切核 | 非线性 |
“rbf” | 高斯径向基 | 偏非线性 |
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
from sklearn.metrics import mean_absolute_error, mean_squared_error
from sklearn.datasets import load_breast_cancer, load_wine
from sklearn.datasets import load_boston
import warnings
warnings.simplefilter("ignore")
支持向量机解决分类问题
cancer = load_breast_cancer()
df_data = pd.DataFrame(cancer.data)
df_data.columns = cancer.feature_names
df_target = pd.DataFrame(cancer.target)
df_target.columns = ['LABEL']
df = pd.concat([df_data, df_target], axis=1)
X_train, X_test, y_train, y_test = train_test_split(df_data, df_target, test_size=0.2, random_state=0)
svc_model = svm.SVC()
svc_model.fit(X_train, y_train['LABEL'])
train_score = svc_model.score(X_train, y_train['LABEL'])
test_score = svc_model.score(X_test, y_test['LABEL'])
print('train_score',train_score)
print('test_score',test_score)
y_pred = svc_model.predict(X_test)
acc_score = accuracy_score(y_pred, y_test)
print('acc_score',acc_score)
支持向量机解决回归问题
boston = load_boston()
df_data = pd.DataFrame(boston.data)
df_data.columns = boston.feature_names
df_target = pd.DataFrame(boston.target)
df_target.columns = ['LABEL']
df = pd.concat([df_data, df_target], axis=1)
X_train, X_test, y_train, y_test = train_test_split(df_data, df_target, test_size=0.2, random_state=0)
svr_model = svm.SVR(C=3.0, kernel='linear')
svr_model.fit(X_train, y_train['LABEL'])
train_score = svr_model.score(X_train, y_train['LABEL'])
test_score = svr_model.score(X_test, y_test['LABEL'])
print('train_score',train_score)
print('test_score',test_score)
y_pred = svr_model.predict(X_test)
mae_score = mean_absolute_error(y_pred, y_test)
mse_score = mean_squared_error(y_pred, y_test)
print('mae_score',mae_score)
print('mse_score',mse_score)
plt.figure(figsize=(20,5),dpi=80)
x = np.arange(0,50,1)
y = y_test[0:50]
z = y_pred[0:50]
plt.scatter(x, y, s=20, color='blue', label='y_test')
plt.scatter(x, z, s=20, color='red', label='y_pred')
# 添加描述信息
plt.xlabel('index')
plt.ylabel('value')
plt.title('y_test and y_pred')
plt.legend(loc='upper left')
plt.show()
支持向量机分类器,是在数据空间中找出一个超平面作为决策边界,利用这个决策边界来对数据进行分类,并使分类误差尽量小的模型。
软间隔:让决策边界能够忍受小部分数据训练误差,而不是单纯追求最大边际。
需要找出“最大边际”与“被分错的样本数量”之间的平衡
引入松弛系数C
C较大,SVC选择边际较小的,能够更好分类所有训练点的决策边界
C较小,SVC最大化决策边界,将掉落在决策边界另一方的样本点预测正确,决策功能简单
二分类SVC中的样本不均衡问题,class_weight
较大的权重加在少数类的样本上,迫使模型向着少数类的方向建模
从准确度的角度,不做样本平衡的时候准确率反而更高,做了样本平衡准确率反而变低
因为做了样本平衡后,为了更有效捕捉少数类,模型误分类了许多多数类样本,而多数类被分错的样本数量大于少数类被分类正确的样本数量,使得模型整体的精确性下降。
准确率
精度度
召回率
混淆矩阵
SVM实现概率预测
重要参数:probability
重要接口:predict_proba、decision_function
probability在训练时设置为True,SVC的接口predict_proba、decision_function生效