【python】【SVM method】sklearn.svm包中的SVC(kernel='linear')和LinearSVC的区别

本文对比了sklearn库中SVM与LinearSVC两种算法的使用方法,详细介绍了SVC(kernel='linear')和LinearSVC的具体操作步骤,为读者提供了在不同场景下选择合适算法的依据。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

参考文章:https://www.cnblogs.com/zealousness/p/7757603.html

使用方法上同样存在一些差别。

sklearn.svm包中的SVC(kernel=‘linear’), 使用步骤:
clf = SVC(kernel=‘linear’)
clf.fit(x_train,y_train)
clf.score(x_test,y_test)
clf.predict(x_test)

而LinearSVC的使用步骤:
prob = problem(y_train,x_train)
param = parameter(’-s 0 -c 1 -q’)
model = train(prob,param)
frbs, p_acc, p_vals = predict(y_test, x_test, model, ‘-b 0’)

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

import numpy as np import os from sklearn import svm from sklearn.preprocessing import StandardScaler from sklearn.model_selection import GridSearchCV from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay import matplotlib.pyplot as plt from scipy import interpolate # 数据标准化函数 def data_std(vector_raw): x_raw = np.linspace(1, 1000, len(vector_raw)) x_new = np.linspace(1, 1000, 1000) tck = interpolate.splrep(x_raw, vector_raw) vector_new = interpolate.splev(x_new, tck) return vector_new # 定义数据集模型类 class dataset_model: def __init__(self): self.train_data = [] # 一系列初始化 self.test_data = [] self.train_label = [] self.test_label = [] self.scaler = None # 添加一个 scaler 属性用于保存训练时的标准化器 # 加载训练数据 def train_data_load(self, path, i_max, j_max): #self.train_data = [] 重复 self.train_label = [] for i in range(1, i_max + 1): for j in range(0, j_max + 1): file_path = os.path.join(path, f"{i}", f"test{j}.txt") if os.path.exists(file_path): # 检查文件是否存在 with open(file_path, 'r') as f: tmp = data_std(list(np.loadtxt(f))) # 调用data_std对数据进行插值标准化 if len(self.train_data) == 0: # 数据为空,初始化 self.train_data = tmp.reshape(1, -1) else: self.train_data = np.vstack((self.train_data, tmp)) # 否则堆叠到已有训练数据 self.train_label.append(i - 1) # 标签为文件夹编号减1 # 加载测试数据 def test_data_load(self, path, i_max, j_max): #self.test_data = [] self.test_label = [] for i in range(1, i_max + 1): for j in range(0, j_max + 1): file_path = os.path.join(path, f"{i}", f"test{j}.txt") if os.path.exists(file_path): with open(file_path, 'r') as f: tmp = data_std(list(np.loadtxt(f))) if len(self.test_data) == 0: self.test_data = tmp.reshape(1, -1) else: self.test_data = np.vstack((self.test_data, tmp)) self.test_label.append(i - 1) # 标签为文件夹编号减1 # 训练模型 def train_model(self): if len(self.train_data) != len(self.train_label): # 检查训练数据标签长度是否一致 raise ValueError( f"Training data and labels have inconsistent lengths: {len(self.train_data)} vs {len(self.train_label)}") # 初始化并拟合 StandardScaler self.scaler = StandardScaler() self.train_data_std = self.scaler.fit_transform(self.train_data) # 使用 GridSearchCV 进行超参数优化 param_grid = {'C': [1e1, 1e2, 1e3], 'gamma': [0.0001, 0.0005, 0.001]} # 定义超参数网格 clf = GridSearchCV(svm.SVC(kernel='rbf', class_weight='balanced'), param_grid, cv=5) clf.fit(self.train_data_std, self.train_label) print("Best parameters:", clf.best_params_) return clf # 测试模型 def test_model(self, clf, testwho): if testwho == 'train': print('Training accuracy:', clf.score(self.train_data_std, self.train_label)) pred_train = clf.predict(self.train_data_std) print(classification_report(pred_train, self.train_label,zero_division=0)) cm = confusion_matrix(pred_train, self.train_label) disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=np.unique(self.train_label)) disp.plot(cmap=plt.cm.Blues) plt.title("Confusion Matrix (Train)") plt.show() elif testwho == 'test': if len(self.test_data) != len(self.test_label): raise ValueError( f"Test data and labels have inconsistent lengths: {len(self.test_data)} vs {len(self.test_label)}") # 使用训练时的 scaler 对测试数据进行标准化 if self.scaler is None: raise ValueError("Scaler has not been fitted yet. Please call 'train_model' first.") self.test_data_std = self.scaler.transform(self.test_data) print('Test accuracy:', clf.score(self.test_data_std, self.test_label)) pred_test = clf.predict(self.test_data_std) print(classification_report(pred_test, self.test_label,zero_division=0)) cm = confusion_matrix(pred_test, self.test_label) disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=np.unique(self.test_label)) disp.plot(cmap=plt.cm.Blues) plt.title("Confusion Matrix (Test)") plt.show() # 主函数 if __name__ == '__main__': height = dataset_model() height.train_data_load('D:\\PyCharm\\pythonProject\\SVMclassifierdata\\test', 2, 25) height.test_data_load('D:\\PyCharm\\pythonProject\\SVMclassifierdata\\testdata', 2, 25) clf = height.train_model() height.test_model(clf, 'train') height.test_model(clf, 'test') 修改上述代码使得SVM算法训练结果可视化,并输出修改后的完整代码
05-21
### 修改后的完整代码 以下是基于现有代码的基础上,添加 SVM 训练结果可视化的完整代码。该代码不仅展示了决策边界支持向量的位置,还通过颜色区分不同类别的数据点。 ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.svm import SVC from sklearn.inspection import DecisionBoundaryDisplay # 加载数据并构建特征X标签y数据集 data = pd.read_csv("your_data.csv") # 替换为实际的数据文件路径 X = data[['x1', 'x2']].values y = data['y'].values # 创建SVM模型并训练 svm_model = SVC(kernel='linear', C=1.0) # 使用线性核函数作为示例 svm_model.fit(X, y) # 绘制散点图表示原始数据分布 plt.figure(figsize=(8, 6)) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap="coolwarm", label="Data Points") # 添加决策边界可视化 DecisionBoundaryDisplay.from_estimator( svm_model, X, plot_method="contour", colors="k", levels=[-1, 0, 1], alpha=0.7, linestyles=["--", "-", "--"], linewidths=2 ) # 获取支持向量并绘制 support_vectors = svm_model.support_vectors_ plt.scatter( support_vectors[:, 0], support_vectors[:, 1], s=100, facecolors="none", edgecolors="k", label="Support Vectors" ) # 设置图形属性 plt.title("SVM Decision Boundary and Support Vectors Visualization") plt.xlabel("Feature x1") plt.ylabel("Feature x2") plt.legend() plt.grid(True) plt.show() ``` --- ### 关键说明 上述代码实现了以下功能: 1. **加载数据** 假设数据存储在一个 CSV 文件中,其中 `x1` `x2` 是两个特征列,而 `y` 是目标变量列[^3]。 2. **创建并训练 SVM 模型** 使用 `sklearn.svm.SVC` 类创建了一个带有线性核的 SVM 模型,并对其进行训练。可以根据需求调整核函数(如 `'rbf'`, `'poly'` 等)其他超参数[^1]。 3. **绘制裁决边界** 利用 `DecisionBoundaryDisplay.from_estimator()` 方法绘制了决策边界及其边缘区域。这有助于直观理解分类器的工作原理[^3]。 4. **标记支持向量** 将支持向量单独提取出来并通过空心圆圈标注在图表上,以便清晰展示这些关键点的作用[^2]。 5. **增强可读性** 图形设置了标题、坐标轴标签以及网格线等功能,使得整体更加美观易懂。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值