基本含义:
支持向量机(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的分享
好啦,希望能够帮助到大家!