1.支持向量机SVM的基本原理:
SVM就是解决线性不可分的算法。 将数据投射到高维空间,这正是SVM算法的核函数的功能.
在SVM中用得最普遍的两种把数据投射到高维空间的方法分别是多项式内核和径向基内核(RBF)。其中多项式内核比较容易理解,它是通过把样本原始特征进行乘方来把数据投射到高维空间。至于RBF内核,将在之后的例子中展示。
2.SVM算法的优势与不足:
SVM可以说是在机器学习领域非常强大的算法,SVM应对高维数据集和低维数据集都还算是得心应手。但是,前提条件是数据集的规模不算大。如果数据集中的样本数量在一万以内,SVM都能驾驭的了,但是如果样本数量超过十万的话,SVM就会非常耗费时间和内存。 SVM还有一个短板,就是对于数据预处理和参数调节要求非常高。所以现在很多场景下大家都会更乐意使用随机森林算法或者是梯度上升决策树算法。因为它们不需要对数据进行预处理,也不用费尽心机去调参。 其中gamma值越小,模型越倾向于欠拟合,gamma值越大,模型越倾向于过拟合。 至于正则化参数,C值越小,模型就越简单,C值越大,模型就越复杂。
3.SVM实例——波士顿房价回归分析:
from sklearn.datasets import load_boston
boston=load_boston()
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
X,y=boston.data,boston.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=8)
for kernel in ['linear','rbf']:
svr=SVR(kernel=kernel)
svr.fit(X_train,y_train)
print(kernel,'核函数的测试集得分:{}'.format(svr.score(X_test,y_test)))
结果分析: 从结果中可以看到,两种核函数的模型得分都不能令人满意,并且rbf的正确率很低很低,这是什么原因导致的呢? 这是因为数据集的各个特征之间的量级差的比较远。 SVM算法对数据预处理的要求是比较高的,如果数据特征量级差异较大,我们就需要对数据进行预处理。 为了让SVM算法能够更好的拟合数据,我们必须对数据集进行预处理。代码如下:
from sklearn.datasets import load_boston
boston=load_boston()
from sklearn.model_selection import train_test_split
X,y=boston.data,boston.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=8)
from sklearn.preprocessing import StandardScaler
sca=StandardScaler()
sca.fit(X_train)
X_train_sca=sca.transform(X_train)
X_test_sca=sca.transform(X_test)
from sklearn.svm import SVR
for kernel in ['linear','rbf']:
svr=SVR(kernel=kernel)
svr.fit(X_train_sca,y_train)
print(kernel,'核函数的测试集得分:{}'.format(svr.score(X_test_sca,y_test)))
结果分析: 从结果中可以看到,经过预处理之后,‘linear’内核的SVR得分变化不大,而‘rbf’内核的SVR得分有了巨大的提升。尤其是在测试集中的得分,已经提高到非常接近linear内核的模型了,那么如果我们进一步调整‘rbf’模型的参数,会有什么表现呢? 和SVC一样,SVR也有‘gamma’和‘C’两个参数,接下来我们试着对这两个参数进行修改:
svr=SVR(C=100,gamma=0.1)
svr.fit(X_train_sca,y_train)
print('调整参数后的模型在测试集上的得分:{}'.format(svr.score(X_test_sca,y_test)))
结果分析: 这是一个比较不错的结果,我们看到通过参数调节,‘rbf’内核的SVR模型在测试集上的得分,可以说现在模型的表现已经是可以接受的了。
小结:
SVM算法对于数据预处理和调参的要求都是非常高的了。
|