1、SVM就是寻找最大分类间隔的过程,使得数据点到分类超平面之间的距离最大化。
2、SVM分类适合二分类问题,在文本分类尤其是针对二分类任务性能卓越,也可用于多分类,对多分类问题的处理有下面两种方式:
(1)一对多法:
假设要把数据集分为A、B、C、D 4个类,可以将其中一个类作为分类1,其他类作为分类2,这样我们要进行 4次SVM分类:
类别1:A 类别2:B、C、D
类别1:B 类别2:A、C、D
类别1:C 类别2:A、B、D
类别1:D 类别2:B、C、D
这种方法,针对 K 个分类,需要训练 K 个分类器,分类速度较快,但训练速度较慢,因为每个分类器都需要对全部样本进行训练,而且负样本数量远大于正样本数量,会造成样本不对称的情况,而且当增加新的分类,比如第 K+1 类时,需要重新对分类器进行构造。
(2)一对一法:
在任意两类样本之间构造一个 SVM,这样针对 K 类的样本,就会有 C(k,2) 类分类器。
比如我们想要划分 A、B、C 三个类,可以构造 3 个分类器:
a) 分类器 1:A、B; b) 分类器 2:A、C; c) 分类器 3:B、C。
当对一个未知样本进行分类时,每一个分类器都会有一个分类结果,即为 1 票,最终得票最多的类别就是整个未知样本的类别。
优点:如果新增一类,不需要重新训练所有的 SVM,只需要训练和新增这一类样本的分类器。而且这种方式在训练单个 SVM 模型的时候,训练速度快。
缺点:分类器的个数与 K 的平方成正比,所以当 K 较大时,训练和测试的时间会比较慢。
3、硬间隔:对于完全线性可分的数据集,分类全部准确,没有错误,此时的线性分类器的核心思想就是找到最大分类间隔。
4、软间隔:实际工作中的数据没有那么干净,划分数据集时容许一定量的分类错误,此时的分类间隔为软间隔。
5、对于非线性可分的数据集,引入了核函数,核函数将数据集投射到更高纬的空间,使得数据集线性可分。
6、用svm算法对乳腺癌进行检测:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
# 导入数据
data = pd.read_csv('breast_cancer_data-master/data.csv')
# 探索数据
pd.set_option('display.max_columns', None)
print(data.columns)
print(data.head())
print(data.describe())
# 数据清洗
data.drop('id', axis=1, inplace=True)
data['diagnosis'] = data['diagnosis'].map({'M':1, 'B':0})
# 将特征字段分成3组
features_mean = list(data.columns[2:12])
features_se = list(data.columns[12:22])
features_worst = list(data.columns[22:32])
# 将肿瘤诊断结果可视化
sns.countplot(data['diagnosis'], label='Count')
plt.show()
# 用热力图呈现features_mean字段之间的关系
corr = data[features_mean].corr()
plt.figure(figsize=(14,14))
# annot=True显示每个方格的数据
sns.heatmap(corr, annot=True)
plt.show()
# 选择特征字段
features_remain = ['radius_mean', 'texture_mean', 'perimeter_mean',
'area_mean', 'smoothness_mean',
'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',]
# 从样本中抽取30%数据作为测试集,其余作为训练集
train, test = train_test_split(data, test_size=0.3)
# 抽取特征选择的数据作为训练和测试数据
train_x = train[features_remain]
train_y = train['diagnosis']
test_x = test[features_remain]
test_y = test['diagnosis']
# 规范化数据,保证每个特征维度的数据均值为0,方差为1
ss = StandardScaler()
train_x = ss.fit_transform(train_x)
test_x = ss.fit_transform(test_x)
# 创建svm分类器
model = svm.SVC()
model.fit(train_x, train_y)
prediction = model.predict(test_x)
print('准确率为:{}'.format(metrics.accuracy_score(prediction, test_y)))