首页 > 编程语言 >通过SVM算法使失衡数据达到最佳性能

通过SVM算法使失衡数据达到最佳性能

时间:2024-07-04 20:01:36浏览次数:3  
标签:SVM 数据 ROC 达到最佳 算法 train plt test data

   

目录

1.读取数据并预处理

2.下采样

3.数据切分

4.使用SVM算法

5.测试

6.绘制AUC-ROC曲线


  本代码所使用的数据集中,标签为1的数据仅有五千多条,而标签为0的数据有二十八万条。为了使数据集中我们最关注的标签1的预测成功的概率,即1的召回率尽量更高,本代码将采用SVM算法提高性能。由于SVM算法处理大数据集时速度过慢,并且样本数据不均衡,本代码还将采用下采样处理数据,并绘制AUC-ROC曲线评价性能。

1.读取数据并预处理

import pandas as pd
import numpy as np
 
"""
数据读取与划分
"""
data = pd.read_csv('creditcard.csv')
 
'''数据标准化: Z标准化'''
from sklearn.preprocessing import StandardScaler
 
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])
data = data.drop(['Time'] , axis=1)

2.下采样

#下采样解决样本不均衡问题
 
positive_eg= data[data['Class'] == 0]  #获取到了所有标签(class)为 0的数据
negative_eg = data[data['Class'] == 1]  #获取到了所有标签(class)为 1的数据
np.random.seed(seed=4)
positive_eg = positive_eg.sample(len(negative_eg))  #sample表示随机从参数中抽取数据
 
# #拼接数据
data_c = pd.concat([positive_eg, negative_eg])  # 把两个pandas数据组合
print(data_c)

3.数据切分

'''训练集使用下采样数据,测试集使用原始数据进行预测'''
from sklearn.model_selection import train_test_split
 
#对下采样数据划分
X = data_c.drop('Class', axis=1) #对data_c数据进行划分。
y = data_c.Class
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
 
# #对原始数据集进行切分,用于后期的测试
X_whole = data.drop('Class', axis=1)
y_whole = data.Class
x_train_w, x_test_w, y_train_w, y_test_w= train_test_split(X_whole, y_whole, test_size = 0.2, random_state = 0)

4.使用SVM算法

# svm算法
clf = svm.SVC(C=5, kernel='rbf', gamma=0.5, probability=True)
# C:惩罚因子  rbf:径向基核函数  gamma:控制核函数的标准差  
# probability=True:添加置信度,后续绘制ROC曲线
clf.fit(x_train, y_train)

5.测试

'''小训练集数据进行测试'''
from sklearn import metrics
train_predicted = clf.predict(x_train)
print(metrics.classification_report(y_train, train_predicted))  # 小数据集的训练数据集

'''使用测试集数据进行测试[小测试集]'''
test_predicted = clf.predict(x_test)
print(metrics.classification_report(y_test, test_predicted))  # 小数据集的测试数据集

'''使用测试集数据进行测试[大测试集]'''
test_predicted_big = clf.predict(x_test_w)  #大测试数据集进行预测
#绘制混淆矩阵
print(metrics.classification_report(y_test_w, test_predicted_big))
cm_plot(y_test_w, test_predicted_big).show())

大测试数据集预测的结果:

成功提高了标签为1的召回率。

6.绘制AUC-ROC曲线

'''AUC值的计算'''
y_pred_proba = clf.predict_proba(x_test_w)
a = y_pred_proba[:, 1]
auc_result = metrics.roc_auc_score(y_test_w, a)

'''绘制ROC-AUC曲线'''
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve  #得到不同阈值的ROC

#计算ROC曲线的点
fpr, tpr, thresholds = roc_curve(y_test_w, a)
#绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color= 'darkorange', lw=2, label='ROC curve(area=%0.2f)'% auc_result)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')  #函数绘制一条从点(0,0)到点(1,1)的线段。
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend()
plt.show()

AUC达到了0.99,证明分类的性能良好。

标签:SVM,数据,ROC,达到最佳,算法,train,plt,test,data
From: https://blog.csdn.net/2301_77444219/article/details/140187961

相关文章

  • 聚类算法与实现
    “物以类聚,人以群分”,所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测;也可以探究不同类之间的相关性和主要差异。聚类和上一讲分类的区别:分类是已知类别的,聚类未知。对于K-means算法与层......
  • 代码随想录算法训练营第七天| 454. 两数相加Ⅱ、383.赎金信、15.三数之和、18.四数之
    454题拆成两块各自匹配化成两个O(n^2)运算1classSolution{2public:3intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){4//四个数组拆分成两块两块5unordered_ma......
  • 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串Ⅱ、54.替换数字(卡码网
    344简单写个循环1classSolution{2public:3voidreverseString(vector<char>&s){4chartmp;5intlen=s.size();6for(inti=0;i<len/2;i++){7tmp=s[i];8s[i]=s[len-......
  • 代码随想录算法训练营第九天|151.反转字符串中的单词、55.右旋字符串、28.找出字符串
    151以前写过很呆的写法但能用嘿1classSolution{2public:3stringreverseWords(strings){4//初始化变量5vector<vector<int>>data;//存储单词的起始地址和长度6stringans;//最终结果字符串7intnum=0;......
  • 深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇
    序言反向传播(Backpropagation,简称backprop)是神经网络训练过程中最关键的技术之一,尤其在多层神经网络中广泛应用。它是一种与优化方法(如梯度下降法)结合使用的算法,用于计算网络中各参数的梯度,进而通过调整这些参数来最小化损失函数,从而提高模型的预测准确性和泛化能力。微分......
  • 一文带你入门机器学习分类算法
    专栏介绍1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。3.需要强调的是,专栏仅介绍主流、......
  • 贝塞尔曲线与de Casteljau算法
    贝塞尔曲线与deCasteljau算法贝塞尔曲线与deCasteljau算法一、简介前言在贝塞尔曲线原理、推导及Matlab实现这篇文章中,详细地介绍了贝塞尔曲线的原理、推导过程以及Matlab实现。文章中计算贝塞尔曲线所采用的方法是定义法,该方法简洁易懂,不过其中的二项式系数\(\left(\begin......
  • 社交媒体挖掘中基于项目的协同过滤推荐算法
    前言在我之前的专题文章《社交媒体挖掘中的协同过滤推荐算法》里,详细介绍了基于用户的协同过滤算法,这里我们将主要聚焦更加常用的基于项目(英文:Item)的协同过滤算法。优势基于项目的协同过滤算法(Item-BasedCollaborativeFiltering)相较于基于用户的协同过滤算法(User-Bas......
  • 代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印
    有序数组的平方。常规方法复习冒泡排序,也可以使用双指针。因为有序数组的平方,最大值一定在两侧,最小值在中间。可以两侧往中间收拢。2024年7月4日笔记:双指针法,两侧往中间逼近一定是从大到小,然后给res数组倒着填即可实现从小到大。题977.有序数组的平方classSolution{pub......
  • PHP桶排序:优化大数据集的高效算法解析与实践
    本文由ChatMoney团队出品本文将介绍一种在PHP中实现的高效排序算法——桶排序。通过使用桶排序,可以快速地对大数据集进行排序,特别是在数据分布均匀的情况下。文章将简要介绍桶排序的原理,并给出一个具体的PHP实现示例。一、桶排序原理桶排序(BucketSort)是一种将待排序数......