使用SVM支持向量机实现二分类问题

基本含义:

支持向量机(SVM)是一种强大的监督学习算法,主要用于解决分类问题。

实现步骤:

步骤:

(1)数据准备

首先,需要有一组已标记的训练样本,每个样本都有一组特征和对应的类别 标签。这些样本将被用来构建 SVM 模型。

(2)寻找最优超平面

SVM 的目标是找到一个最优的超平面,将不同类别的样本分隔开。 超平面是一个( d-1 )维的线性子空间,其中 d 是特征的维度。 SVM 通过寻找具有最大间隔的超平面来实现分类。

(3)核函数转换

如果数据不是线性可分的, SVM 可以通过使用核函数将样本从原始特征 空间映射到一个高维特征空间中,使得样本在高维空间中线性可分。常用的核函数包括线性 核、多项式核、高斯核等。

(4)求解优化问题

通过求解一个凸优化问题, SVM 找到一个最优的超平面。 优化问题的目标是最大化间隔,并且要求正确分类的样本与超平面的距离最大化。

(5)输出结果

对于一个待分类的样本,根据超平面的位置,判断样本所属的类别。如果样 本在超平面的一侧,则属于一个类别;如果在另一侧,则属于另一个类别。

代码实现:

示例:

现在我以"电信银行卡诈骗的数据分析"为例,通过使用“精确率”,“准确率”,“召回率”和“F1分数”来评估。

①训练模型

模型保存为:svm_model.joblib

import numpy as np
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.preprocessing import StandardScaler
import joblib

# 生成模拟数据
np.random.seed(42)
n_samples = 1000
n_features = 6  # Distance1, Distance2, Ratio, Repeat, Card, Pin, Online
X = np.random.rand(n_samples, n_features)
y = np.random.randint(0, 2, n_samples)  # 0 for non-fraud, 1 for fraud

# 分割数据集
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
X_test = scaler.transform(X_test)

# 创建并训练SVM模型
svm = SVC(kernel='rbf', random_state=42)
svm.fit(X_train, y_train)


# 定义评估函数
def evaluate(model, X, y, dataset_name):
    y_pred = model.predict(X)
    accuracy = accuracy_score(y, y_pred)
    precision = precision_score(y, y_pred)
    recall = recall_score(y, y_pred)
    f1 = f1_score(y, y_pred)
    specificity = recall_score(y, y_pred, pos_label=0)

    print(f"SVM - {dataset_name}:")
    print(f"Accuracy: {accuracy:.5f}")
    print(f"Precision: {precision:.5f}")
    print(f"Recall: {recall:.5f}")
    print(f"F1 Score: {f1:.5f}")
    print(f"Specificity: {specificity:.5f}")
    print()


# 评估模型
evaluate(svm, X_train, y_train, "训练集")
evaluate(svm, X_val, y_val, "验证集")
evaluate(svm, X_test, y_test, "测试集")

# 保存模型
joblib.dump(svm, 'svm_model.joblib')

# 保存标准化器
joblib.dump(scaler, 'scaler.joblib')

print("模型和标准化器已保存")

# 演示如何加载模型(可选)
loaded_model = joblib.load('svm_model.joblib')
loaded_scaler = joblib.load('scaler.joblib')

②测试

import joblib
import numpy as np


# 定义测试函数
def test_model(input_data):
    # 加载模型和标准化器
    svm_model = joblib.load('svm_model.joblib')
    scaler = joblib.load('scaler.joblib')

    # 标准化输入数据
    input_data = np.array(input_data).reshape(1, -1)  # 转换成2D数组
    input_data = scaler.transform(input_data)

    # 进行预测
    prediction = svm_model.predict(input_data)

    # 输出结果
    if prediction == 0:
        print("预测结果:非欺诈")
    else:
        print("预测结果:欺诈")


# 示例测试数据(你可以替换成真实的数据)
test_data = [0.5, 0.7, 0.3, 1, 0, 1]  # Distance1, Distance2, Ratio, Repeat, Card, Pin, Online
test_model(test_data)

资源获取:

上述使用的表格如下:

通过网盘分享的文件:电信银行卡诈骗的数据分析.zip
链接: https://pan.baidu.com/s/1w6OrRLrpUeb7SL1XYEgR3g?pwd=capu 提取码: capu
--来自百度网盘超级会员v5的分享

好啦,希望能够帮助到大家!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值