支持向量机

Reads: 707 Edit

1 数据说明

我们以sklearn自带的鸢尾花数据集(Iris)为例来预测花的物种。

2 导入所需模块

from sklearn.model_selection import GridSearchCV
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score,precision_score
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import RocCurveDisplay
from sklearn.inspection import DecisionBoundaryDisplay
from matplotlib.colors import ListedColormap  

3 查看数据的结构

# 鸢尾花数据集(Iris)获取
iris = datasets.load_iris()
print("特征变量的维度: ", iris.data.shape)
print("特征变量的名字: ", iris.feature_names)
print("目标变量的长度: ", iris.target.shape)

特征变量的维度: (150, 4)
特征变量的名字: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
目标变量的长度: (150,)

data =pd.DataFrame(data=iris.data, columns=iris.feature_names)
data.insert(0,column='Species',value=iris.target)
print(data)
data.to_csv('./iris.csv', index=None) # 可以把数据保存到本地

pyt-126

4 读取数据并划分为训练样本和测试样本

# 将数据分成特征变量和目标变量
X, y = datasets.load_iris(return_X_y=True)
# 将数据分成训练样本和测试样本
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.7)

5 模型训练

# 训练模型
svm = SVC().fit(X_train, y_train)

6 模型评价

# 预测目标变量
y_test_pred = svm.predict(X_test)
# 模型评价
print('准确率为:', accuracy_score(y_test,y_test_pred))
print('精确率为:', precision_score(y_test,y_test_pred,average=None))

准确率为: 0.8857142857142857
精确率为: [1. 0.73913043 1. ]

print('使用SVM预测iris数据的分类报告为:','\n',classification_report(y_test,y_test_pred))
# 混淆矩阵
print('使用SVM预测iris数据的分类报告为:','\n',confusion_matrix(y_test,y_test_pred))

pyt-127

目前支持向量机的linear核可以根据特征的权重来计算特征重要性,其他核下无法给出直接给出特征的重要性!

7 模型选择

# 模型选择
parameters = {'kernel': ('linear', 'rbf'), 'C': np.logspace(-2, 10, 13),'gamma': np.logspace(-9, 3, 13)}
svm_grid = GridSearchCV(SVC(), parameters,cv=5).fit(iris.data, iris.target)
print('gridsearch选择的参数为:', svm_grid.best_params_)
print('对应的准确率得分为:', svm_grid.best_score_)

gridsearch选择的参数为: {'C': 1.0, 'gamma': 1e-09, 'kernel': 'linear'}
对应的准确率得分为: 0.9800000000000001

8 SVM的图形展示

鸢尾花数据集(Iris)有6个特征变量,因而无法绘制出svm在6维空间的分类图形。这里仅取前2个特征变量,演示svm模型在2维空间的分类图示。

# 绘制SVM的二维图示
X, y = datasets.load_iris(return_X_y=True)
X = X[:, 0:2]
# 将数据分成训练样本和测试样本
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.7)

# 训练模型
svm2 = SVC().fit(X_train, y_train)
score = svm2.score(X_test, y_test)

# 设置绘图颜色、坐标轴范围
cm = plt.cm.RdBu
cm_bright = ListedColormap(["#FF0000", "#0000FF", "chartreuse"])

DecisionBoundaryDisplay.from_estimator(svm2, X, cmap=cm, alpha=0.8, eps=0.5)

x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5

# 绘制训练样本的散点
plt.scatter(
    X_train[:, 0],
    X_train[:, 1],
    c=y_train,
    cmap=cm_bright,
    edgecolors="k"
)
# 绘制测试样本的散点
plt.scatter(
    X_test[:, 0],
    X_test[:, 1],
    c=y_test,
    cmap=cm_bright,
    edgecolors="k",
    alpha=0.6,
    marker='^',
)

plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)

plt.show()

pyt-128



获取案例数据和源代码,请关注微信公众号并回复:Python_dt18


Comments

Make a comment