赞
踩
支持向量机(SVM)是一种用于分类和回归分析的监督学习模型。在处理非线性数据时,线性SVM可能无法很好地分离数据。为了解决这个问题,我们使用核函数将低维空间的非线性数据映射到高维空间,使得在高维空间中可以线性分离。
目标是找到最优分离超平面,使得分类间隔最大。其优化问题如下:
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn import datasets
- from sklearn.model_selection import train_test_split
- from sklearn.preprocessing import StandardScaler
- from sklearn.svm import SVC
- from sklearn.metrics import classification_report, accuracy_score
-
- # 设置全局字体为楷体
- plt.rcParams['font.family'] = 'KaiTi'
-
- # 生成多维数据集
- X, y = datasets.make_classification(n_samples=500, n_features=5, n_informative=3, n_redundant=2, random_state=42)
-
- # 数据标准化
- scaler = StandardScaler()
- X = scaler.fit_transform(X)
-
- # 数据集划分
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 未优化模型
- clf_unoptimized = SVC(kernel='rbf')
- clf_unoptimized.fit(X_train, y_train)
- y_pred_unoptimized = clf_unoptimized.predict(X_test)
-
- # 输出未优化模型的结果
- print("未优化模型的分类报告:")
- print(classification_report(y_test, y_pred_unoptimized))
- print("未优化模型的准确率:", accuracy_score(y_test, y_pred_unoptimized))
-
- # 优化后的模型
- clf_optimized = SVC(kernel='rbf', C=10, gamma=0.1)
- clf_optimized.fit(X_train, y_train)
- y_pred_optimized = clf_optimized.predict(X_test)
-
- # 输出优化后的模型的结果
- print("优化后的模型的分类报告:")
- print(classification_report(y_test, y_pred_optimized))
- print("优化后的模型的准确率:", accuracy_score(y_test, y_pred_optimized))
-
- # 可视化
- plt.figure(figsize=(12, 6))
-
- # 选取二维特征进行可视化
- X_vis = X_test[:, :2]
- y_vis = y_test
-
- # 未优化模型的可视化
- plt.subplot(1, 2, 1)
- plt.scatter(X_vis[y_vis == 0][:, 0], X_vis[y_vis == 0][:, 1], color='blue', label='Class 0')
- plt.scatter(X_vis[y_vis == 1][:, 0], X_vis[y_vis == 1][:, 1], color='red', label='Class 1')
- plt.title('未优化模型')
- plt.xlabel('Feature 1')
- plt.ylabel('Feature 2')
- plt.legend()
-
- # 优化后的模型的可视化
- plt.subplot(1, 2, 2)
- plt.scatter(X_vis[y_vis == 0][:, 0], X_vis[y_vis == 0][:, 1], color='blue', label='Class 0')
- plt.scatter(X_vis[y_vis == 1][:, 0], X_vis[y_vis == 1][:, 1], color='red', label='Class 1')
- plt.title('优化后的模型')
- plt.xlabel('Feature 1')
- plt.ylabel('Feature 2')
- plt.legend()
-
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。