svm支持向量机python代码实现

from sklearn import svm  # 引入svm包
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from sklearn.model_selection import train_test_split
# 定义字典,将字符与数字对应起来\
from sklearn.utils import shuffle
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
from sklearn.model_selection import ShuffleSplit
import pandas as pd
from ground import n_s


plt.rcParams['font.sans-serif'] = 'SimHei'  # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False  # 解决负号无法显示的问题
pd.set_option('expand_frame_repr', False)  # 禁止换行
# pd.set_option('display.max_columns', 20)  # 显示所有行
pd.set_option('display.max_rows', 10)  # 设置Dataframe数据的显示长度,默认为50

score_train = []
score = []
r2_train = []
r2 = []
filename = '聚类划分结果.xlsx'
data = pd.DataFrame(pd.read_excel(filename)).values  # 输入特征
Y = data[:, -1]
X = data[:, 2:-1]
'''利用sklearn中的SVC()创建分类器对象,其中常用的参数有C(惩罚力度)、kernel(核函数)、gamma(核函数的参数设置)
C越大代表惩罚程度越大,越不能容忍有点集交错的问题,但有可能会过拟合(defaul C=1);
kernel常规的有‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ ,默认的是rbf;
gamma是核函数为‘rbf’, ‘poly’ 和 ‘sigmoid’时的参数设置,其值越小,分类界面越连续,其值越大,分类界面越“散”,分类效果越好,但有可能会过拟合,默认的是特征个数的倒数;
decision_function_shape='ovr'时,为one v rest(一对多),即一个类别与其他类别进行划分,等于'ovo'时,为one v one(一对一),即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。
'''
model = svm.SVC(C=10, kernel='rbf', gamma=20, decision_function_shape='ovo')
ss = ShuffleSplit(n_splits=n_s, train_size=0.7, test_size=0.3, random_state=3)  # 训练集和测试集的比例为7:3。
X, Y = shuffle(X, Y, random_state=1337)
for train_index, test_index in ss.split(X, Y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = Y[train_index], Y[test_index]
    # print(X_test, y_test)
    model.fit(X_train, y_train.astype('int'))
    y_pred_train = model.predict(X_train)
    y_pred = model.predict(X_test)

    print("Confusion Matrix:", confusion_matrix(y_test, y_pred))  # 混淆矩阵,3*3某行某列代表把某物归为此类的数量
    print("Classification Report:", classification_report(y_test, y_pred))  # 输出分类结果矩阵
    print("train_Accuracy:", accuracy_score(y_train, y_pred_train))  # 准确度
    print("test_Accuracy:", accuracy_score(y_test, y_pred))
    score.append(accuracy_score(y_test, y_pred))
    score_train.append(accuracy_score(y_train, y_pred_train))

    print('训练集R^2:', model.score(X_train, y_train))  # R^2回归平方和与总平方和的比值
    print('测试集R^2:', model.score(X_test, y_test))
    r2_train.append(model.score(X_train, y_train))
    r2.append(model.score(X_test, y_test))


plt.plot(range(len(score)), score, c="green")
plt.xlabel('测试次数')
plt.ylabel('准确度(%)')
plt.legend(['测试集准确度'])
plt.show()
df = pd.DataFrame(score)
df.to_csv("svm_score.xlsx")
# # plt.plot(range(len(r2_train)), r2_train, c="blue")
plt.plot(range(len(r2)), r2, c="green")
plt.xlabel('测试次数')
plt.ylabel('r2决定系数')
plt.legend(['训练集决定系数', '测试集决定系数'])
plt.show()
df = pd.DataFrame(score)
df.to_csv(str(filename)+"svm_score.xlsx")

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值