SVM模型

超平⾯的理解

在⼀维空间中,如需将数据切分为两段,只需要⼀个点即可;
在⼆维空间中,对于线性可分的样本点,将其切分为两类,只需⼀条直线即可;
在三维空间中,将样本点切分开来,就需要⼀个平⾯。

分隔带

“分割带”代表了模型划分样本点的能⼒或可信度。
“分割带”越宽,说明模型能够将样本点划分得越清晰,进⽽保证模型泛化能⼒越强,分类的可信度越⾼;
反之,“分割带”越窄,说明模型的准确率越容易受到异常点的影响,进⽽理解为模型的预测能⼒越弱,分类的可信度越低。

线性可分的SVM模型函数介绍

LinearSVC(tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,class_weight=None, max_iter=1000)

tol:⽤于指定SVM模型迭代的收敛条件,默认为0.0001
C:⽤于指定⽬标函数中松弛因⼦的惩罚系数值,默认为1
fit_intercept:bool类型参数,是否拟合线性“超平⾯”的截距项,默认为True
intercept_scaling:当参数fit_intercept为True时,该参数有效,通过给参数传递⼀个浮点值,就相
当于在⾃变量X矩阵中添加⼀常数列,默认该参数值为1
class_weight:⽤于指定因变量类别的权重,如果为字典,则通过字典的形式{class_label:weight}
传递每个类别的权重;如果为字符串'balanced',则每个分类的权重与实际样本中的⽐例成反⽐,当
各分类存在严重不平衡时,设置为'balanced'会⽐较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最⼤迭代次数,默认为1000

⾮线性可分的SVM模型函数介绍

SVC(C=1.0, kernel=‘rbf’, degree=3, gamma=‘auto’, coef0=0.0, tol=0.001,
class_weight=None, verbose=False, max_iter=-1, random_state=None)

C:⽤于指定⽬标函数中松弛因⼦的惩罚系数值,默认为1
kernel:⽤于指定SVM模型的核函数,该参数如果为'linear',就表示线性核函数;如果为'poly',就
表示多项式核函数,核函数中的r和p值分别使⽤degree参数和gamma参数指定;如果为'rbf',表示
径向基核函数,核函数中的r参数值仍然通过gamma参数指定;如果为'sigmoid',表示Sigmoid核函
数,核函数中的r参数值需要通过gamma参数指定;如果为'precomputed',表示计算⼀个核矩阵
degree:⽤于指定多项式核函数中的p参数值
gamma:⽤于指定多项式核函数或径向基核函数或Sigmoid核函数中的r参数值
coef0:⽤于指定多项式核函数或Sigmoid核函数中的r参数值
tol:⽤于指定SVM模型迭代的收敛条件,默认为0.001
class_weight:⽤于指定因变量类别的权重,如果为字典,则通过字典的形{class_label:weight}
传递每个类别的权重;如果为字符串'balanced',则每个分类的权重与实际样本中的⽐例成反⽐,当
各分类存在严重不平衡时,设置为'balanced'会⽐较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最⼤迭代次数,默认为-1,表示不限制迭代次数

代码演示

# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics

# 读取外部数据
letters = pd.read_csv(r'letterdata.csv')
# 将数据拆分为训练集和测试集
predictors = letters.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(letters[predictors], letters.letter,test_size = 0.25, random_state = 1234)


# 选择线性可分SVM模型
linear_svc = svm.LinearSVC()
# 模型在训练数据集上的拟合
linear_svc.fit(X_train,y_train)

# 模型在测试集上的预测
pred_linear_svc = linear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test, pred_linear_svc)


# 选择非线性SVM模型
nolinear_svc = svm.SVC(kernel='rbf')
# 模型在训练数据集上的拟合
nolinear_svc.fit(X_train,y_train)

# 模型在测试集上的预测
pred_svc = nolinear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test,pred_svc)






# 读取外部数据
forestfires = pd.read_csv(r'forestfires.csv')
# 删除day变量
forestfires.drop('day',axis = 1, inplace = True)
# 将月份作数值化处理
forestfires.month = pd.factorize(forestfires.month)[0]

# 导入第三方模块
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import norm
# 绘制森林烧毁面积的直方图
sns.distplot(forestfires.area, bins = 50, kde = True, fit = norm, hist_kws = {'color':'steelblue'}, 
             kde_kws = {'color':'red', 'label':'Kernel Density'}, 
             fit_kws = {'color':'black','label':'Nomal', 'linestyle':'--'})
# 显示图例
plt.legend()
# 显示图形
plt.show()

# 导入第三方模块
from sklearn import preprocessing
import numpy as np
from sklearn import neighbors
# 对area变量作对数变换
y = np.log1p(forestfires.area)
# 将X变量作标准化处理
predictors = forestfires.columns[:-1]
X = preprocessing.scale(forestfires[predictors])
# 将数据拆分为训练集和测试集
X_train,X_test,y_train,y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)

# 构建默认参数的SVM回归模型
svr = svm.SVR()
# 模型在训练数据集上的拟合
svr.fit(X_train,y_train)
# 模型在测试上的预测
pred_svr = svr.predict(X_test)
# 计算模型的MSE
metrics.mean_squared_error(y_test,pred_svr)


# 使用网格搜索法,选择SVM回归中的最佳C值、epsilon值和gamma值
epsilon = np.arange(0.1,1.5,0.2)
C= np.arange(100,1000,200)
gamma = np.arange(0.001,0.01,0.002)
parameters = {'epsilon':epsilon,'C':C,'gamma':gamma}
grid_svr = model_selection.GridSearchCV(estimator = svm.SVR(max_iter=10000),param_grid =parameters,
                                        scoring='neg_mean_squared_error',cv=5,verbose =1, n_jobs=2)
# 模型在训练数据集上的拟合
grid_svr.fit(X_train,y_train)
# 返回交叉验证后的最佳参数值
print(grid_svr.best_params_, grid_svr.best_score_)

# 模型在测试集上的预测
pred_grid_svr = grid_svr.predict(X_test)
# 计算模型在测试集上的MSE值
metrics.mean_squared_error(y_test,pred_grid_svr)
posted @ 2020-11-13 16:35  最冷不过冬夜  阅读(879)  评论(0)    收藏  举报