SVM的核函数之线性和高斯的选择

Table of Contents

关于SVM中线性核函数和高斯核函数的选择

SVM中常用核函数一般是线性核函数和高斯核函数。以sklearn中的SVC,提供的’linear’和’rbf’做说明。面向[n,m]原始数据集,一般的选取准则:

  1. 相对于n,m很大。比如m≥n, m=10000, n=10~1000,即(m/n)>10。
    考虑’linear’
  2. m很小,n一般大小。比如m=1-1000, n=10~10000,即(m/n)在[0.0001,100].
    考虑’rbf’
  3. m很小,n很大。比如n=1-1000,m=50000+,即(m/n)在[~,0.02].
    增加m的量,考虑’linear’

补充:logistic约等同于’linear’的选择

#!/usr/bin/python
# encoding: utf-8


"""
@author : jack_lu
@contact : my@google
@File : SVM
@time : 2018/12/12 12:12
"""
# 练习所用数据集
from sklearn.datasets import fetch_lfw_people,olivetti_faces

# 特征提取方法
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 特征转换方法
from sklearn.preprocessing import StandardScaler

# sklearn模型方法
from sklearn.model_selection import train_test_split

# metric方法
from sklearn.metrics import accuracy_score

# 机器学习模型
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC

1.基本数据准备

print('#'*50 + '  1.基本数据准备  ' + '#'*50)
lfw_people2 = fetch_lfw_people(min_faces_per_person=70, resize=0.4)  # 需要通过翻墙下载,C:\Users\Administrator\scikit_learn_data\lfw_home\joblib\sklearn\datasets\lfw\_fetch_lfw_people
##################################################  1.基本数据准备  ##################################################
n_samples, h, w = lfw_people2.images.shape
X = lfw_people2.data
y = lfw_people2.target
n_features = X.shape[1]

target_names = lfw_people2.target_names
n_class = target_names.shape[0]

print('#'*20,'数据集基本情况','#'*20)
print('**样本数量**:%d' %(X.shape[0]))
print('**特征维度**:%d' %(X.shape[1]))
print('**目标类别数**:%d' %(n_class))
print('#'*20,'数据集基本情况','#'*20)

#################### 数据集基本情况 ####################
**样本数量**:1288
**特征维度**:1850
**目标类别数**:7
#################### 数据集基本情况 ####################
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.25,random_state=1)

print('#'*20,'训练数据集基本情况','#'*20)
print('**训练样本数量**:%d' %(X_train.shape[0]))
print('**训练特征维度**:%d' %(X_train.shape[1]))
print('**目标类别数**:%d' %(n_class))
print('#'*20,'训练数据集基本情况','#'*20)

#################### 训练数据集基本情况 ####################
**训练样本数量**:966
**训练特征维度**:1850
**目标类别数**:7
#################### 训练数据集基本情况 ####################

2.各情况对比

print('#'*50 + '  2.建模与比较  ' + '#'*50)

##################################################  2.建模与比较  ##################################################

1. SVM(kernel=‘linear’):直接采用数据集[966,1850]

svm_origin = SVC(kernel='linear', C=1000, decision_function_shape='ovo')  # 根据官方说明,对于多分类任务宜采用'ovo'即onevsone策略
svm_origin.fit(X_train, y_train)
y_pred = svm_origin.predict(X_test)
print('**情况1-linear的准确率**: %s' %(accuracy_score(y_pred=y_pred, y_true=y_test)))
**情况1-linear的准确率**: 0.832298136646

2. SVM(kernel=‘rbf’):直接采用数据集[966,1850]

svm_rbf = SVC(kernel='rbf', C=1000, decision_function_shape='ovo')  # 根据官方说明,对于多分类任务宜采用'ovo'即onevsone策略
svm_rbf.fit(X_train, y_train)
y_pred = svm_rbf.predict(X_test)
print('**情况2-rbf的准确率**: %s' %(accuracy_score(y_pred=y_pred, y_true=y_test)))
**情况2-rbf的准确率**: 0.44099378882

3. LR:直接采用数据集[966,1850]

lr_origin = LogisticRegression()  # 对于多分类任务,multi_class可选择'ovr'或者'auto'自动选择,这里按照默认'auto'
lr_origin.fit(X_train, y_train)
y_pred = lr_origin.predict(X_test)
print('**情况3-LR的准确率**: %s' %(accuracy_score(y_pred=y_pred, y_true=y_test)))
**情况3-LR的准确率**: 0.826086956522

4. 降维之后

print('#'*20,'维度由1850减少到150之后','#'*20)

#################### 维度由1850减少到150之后 ####################
def namestr(obj, namespace):
    return [name for name in namespace if namespace[name] is obj]
print(namestr(lr_origin,globals()),'\n',
namestr(lr_origin,globals())[0])

['lr_origin', 'model'] 
 lr_origin
def small_feature_model(model,X_train=X_train,y_train=y_train,X_test=X_test, y_test=y_test):
    pca = PCA(n_components=150,random_state=0,whiten=True)
    pipeline = Pipeline([('scale',StandardScaler()),('pca',pca)])
    processing = pipeline.fit(X_train)
    X_train = processing.transform(X_train)
    X_test = processing.transform(X_test)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
#     print(namestr(model,globals()))
    print('**small-%s的准确率**: %.3f' %(namestr(model, globals())[0],accuracy_score(y_pred=y_pred, y_true=y_test)))
for model in [svm_origin, svm_rbf, lr_origin]:
    small_feature_model(model)
**small-svm_origin的准确率**: 0.789
**small-svm_rbf的准确率**: 0.811
**small-lr_origin的准确率**: 0.835
print('#'*50 + '  完成  ' + '#'*50)

##################################################  完成  ##################################################

3.小结

从结果看到:

  1. 将维度减少到150之后,选择kernel='rbf’的效果>‘linear’;
  2. 在没有调参情况下,LR的效果还不错,初期建模值得先尝试。

当然,上面是指定了特定的参数,更主要的目的是对比SVM两种核方法在n和m的比例当中的效果。在具体问题当中,在计算力有限条件下,建议还是通过网格搜索的方法对比选出最优的kernel。

  • 5
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在西瓜数据集3.0a上,我们可以使用支持向量机(SVM)作为分类器进行训练和测试。SVM是一种监督学习算法,它可以在高维空间中构建一个超平面来区分不同类别的数据点。在此数据集上,我们可以采用不同的函数来训练SVM模型,其中包括线性高斯,这两种函数的训练和预测结果也会有所不同。 线性SVM中最常用的函数之一。它的主要作用是线性转换原始特征空间到高维空间,这使得线性不可分的数据集也变得线性可分。在西瓜数据集3.0a中,如果我们使用线性训练SVM模型,它会在一个平面上构建一个超平面,通过该超平面将数据分为两个类别。由于数据集中的样本数据比较简单,线性的表现就比较好,容易得到较高的精度率和较好的泛化性能。 高斯也是SVM中常用的函数之一。它的主要作用是将原始特征空间变换到高维空间,并且在高维空间中计算样本之间的相似度。在西瓜数据集3.0a中,采用高斯训练SVM模型可以达到更好的分类效果。使用高斯SVM模型能够更准确地捕捉数据的特征,适用于更复杂的非线性问题。同时,高斯也有一定的泛化能力,使得该模型可以对新的数据进行较好的预测。 总结来说,西瓜数据集3.0a上采用不同的函数训练SVM模型,线性主要适用于简单的线性分割问题,而高斯适用于更复杂的非线性问题。在实际应用中,我们需要根据数据分布的特点和问题的细节来选择合适的函数,以达到最佳的分类效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值