支持向量机在风控竞赛数据集上的应用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、支持向量机的参数与属性

clf = SVC(C=1.0,#C是用来控制惩罚项的惩罚力度的系数。如果C大,模型会选择边际较小,能够更好分类所有训练点的决策边界
            kernel='rbf',#选择的核函数linear, poly,sigmoid, rbf
            degree=3,#ploy多项式核函数的次数
            gamma='scale',#核函数的系数
            coef0=0.0,#poly sigmoid核函数的常数项
            shrinking=True,
            probability=True,#是否启用概率估计,SVC的接口predict_proba和predict_log_proba将生效
            tol=0.001,
            cache_size=5000,#可以使用的内存
            class_weight='balanced',#数据集是否平衡
            verbose=False,
            max_iter=-1,
            decision_function_shape='ovr',
            break_ties=False,
            random_state=None,)

#属性
#准确率得分0.7434221551868611
clf.score(x_test, y_test)
#decision_function只会生成一列到分类超平面的距离,样本类别由距离的符号确定
clf.decision_function(x_test)
#属性n_support_:调用每个类别下的支持向量的数目
clf_proba.n_support_
#属性coef_:每个特征的重要性,这个系数仅仅适合于线性核
clf_proba.coef_
#属性intercept_:查看生成的决策边界的截距
clf_proba.intercept_
#属性dual_coef_:查看生成的拉格朗日乘数
clf_proba.dual_coef_
clf_proba.dual_coef_.shape
#注意到这个属性的结构了吗?来看看查看支持向量的属性
clf_proba.support_vectors_
clf_proba.support_vectors_.shape
#注意到dual_coef_中生成的拉格朗日乘数的数目和我们的支持向量的数目一致
#注意到KKT条件的条件中的第五条,所有非支持向量会让拉格朗日乘数为0
#所以拉格朗日乘数的数目和支持向量的数目是一致的
#注意,此情况仅仅在二分类中适用!
菜菜的sklearn课堂直播间: https://live.bilibili.com/12582510
sklearn


二、使用步骤

1.导库并加载数据集

代码如下:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import RFE
import lightgbm as lgb

data = pd.read_csv(r'F:\教师培训\ppd7\df_Master_clean.csv',encoding='gb18030')
x = data[data.target.notnull()].drop(columns=['Idx', 'target', 'sample_status', 'ListingInfo'])
y = data[data.target.notnull()]['target']
x_train,x_test, y_train, y_test = train_test_split(x,y,random_state=2,test_size=0.2).sample(n=10000)

2.使用SVM进行分类

数据集是一个信用开数据集,属于不平衡的二分类问题:

没有进行特征筛选的效果


kernel = ['linear', 'poly','rbf','sigmoid']
for kernel in kernel:
    clf = SVC(C=1.0,#C是用来控制惩罚项的惩罚力度的系数。
            kernel=kernel,#linear, poly,sigmoid, rbf
            degree=3,#ploy的次数
            gamma='scale',#核函数的系数
            coef0=0.0,#poly sigmoid核函数的常数项
            shrinking=True,
            probability=True,#是否启用概率估计,SVC的接口predict_proba和predict_log_proba将生效
            tol=0.001,
            cache_size=5000,#可以使用的内存
            class_weight='balanced',#数据集是否平衡
            verbose=False,
            max_iter=-1,
            decision_function_shape='ovr',
            break_ties=False,
            random_state=None,).fit(x_train, y_train)
    acc = clf.score(x_test, y_test)
    auc = cross_val_score(clf, x_test, y_test,scoring='roc_auc', cv=3).mean()
    print('kernel=%s, acc=%f, auc=%f'% (kernel, acc, auc))
    

在这里插入图片描述

#通过REF递归消除法,进行特征筛选,并重新划分训练集测试集
clf1 = lgb.LGBMClassifier(n_estimators=800,
                          boosting_type='gbdt',
                          learning_rate=0.04,
                          min_child_samples=68,
                          min_child_weight=0.01,
                             max_depth=4,
                         num_leaves=16,
                         colsample_bytree=0.8,
                         subsample=0.8,
                         reg_alpha=0.7777777777777778,
                         reg_lambda=0.3,
                          objective='binary')


x_rfe = RFE(clf1, n_features_to_select=113, step=50).fit_transform(x, y)
x_rfe_stand = StandardScaler().fit_transform(x_rfe)
x_train,x_test, y_train, y_test = train_test_split(x_rfe_stand,y,random_state=2,test_size=0.2)

#训练模型,一般来说高斯径向基核函数效果不错
clf = SVC(C=1.0,#C是用来控制惩罚项的惩罚力度的系数。
            kernel='rbf',#linear, poly,sigmoid, rbf
            degree=3,#ploy的次数
            gamma='scale',#核函数的系数
            shrinking=True,
            probability=True,#是否启用概率估计,SVC的接口predict_proba和predict_log_proba将生效
            tol=0.001,
            cache_size=5000,#可以使用的内存
            class_weight='balanced',#数据集是否平衡
            verbose=False,
            max_iter=-1,
            decision_function_shape='ovr',
            break_ties=False,
            random_state=None,).fit(x_train, y_train)
#准确率得分0.7434221551868611
clf.score(x_test, y_test)
#原始交叉验证roc_auc面积0.6944635255477508
cross_val_score(clf, x_test, y_test,scoring='roc_auc', cv=3).mean()
#decision_function只会生成一列到分类超平面的距离,样本类别由距离的符号确定
clf.decision_function(x_test)
#会生成两个类别分别对应的概率
pre = clf.predict_proba(x_test)
#此时的threshold就不是一个概率值,而是距离值中的阈值了,所以它可以大于1,也可以为负
fpr, tpr, thresholds = roc_curve(y_test, pre[:,1])
area = roc_auc_score(y_test, pre[:,1])#计算auc分数0.7124797801856899

#画图
plt.plot(fpr, tpr, color='red', label='roc_curve(area=%0.2f)' % area, linestyle='--')
plt.plot([0,1],[0,1],color='b',linestyle='-')
plt.xlabel('fpr')
plt.ylabel('tpr')
plt.title('Receiver operating characteristic example')
plt.legend(loc='lower right')
plt.show()

#此数据集调参太耗时,就没有进行下一步,调参后效果应该好些。

在这里插入图片描述

最后介绍下线性支持向量机
#线性支持向量机类LinearSVC

‘’’
class sklearn.svm.LinearSVC (penalty=’l2’, loss=’squared_hinge’, dual=True, tol=0.0001, C=1.0, multi_class=’ovr’,fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0, random_state=None, max_iter=1000)

线性支持向量机其实与SVC类中选择"linear"作为核函数的功能类似,但是其背后的实现库是liblinear而不是libsvm,这使得在线性数据上,linearSVC的运行速度比SVC中的“linear”核函数要快,不过两者的运行结果相似。在现实中,许多数据都是线性的,因此我们可以依赖计算得更快得LinearSVC类。除此之外,线性支持向量可以很容易地推广到大样本上,还可以支持稀疏矩阵,多分类中也支持ovr方案。

from sklearn.svm import LinearSVC
'''
loss  在求解决策边界过程中使用的损失函数,可以输入"hinge"或者“squared_hinge”,默认为“square_hinge”
当输入“hinge",表示默认使用和类SVC中一致的损失函数,使用”squared_hinge“表示使用SVC中损失函数的平方作为损失函数。
dual布尔值,默认为True
选择让算法直接求解原始的拉格朗日函数,或者求解对偶函数。当选择为True的时候,表示求解
对偶函数,如果样本量大于特征数目,建议求解原始拉格朗日函数,设定dual = False
'''
lsvc = LinearSVC(penalty='l2',
                loss='squared_hinge',
                dual=False,#当选择为True的时候,表示求解对偶函数,如果样本量大于特征数目,建议求解原始拉格朗日函数,设定dual = False
                tol=0.0001,
                C=1.0,
                multi_class='ovr',
                fit_intercept=True,
                intercept_scaling=1,
                class_weight='balanced',
                verbose=0,
                random_state=None,
                max_iter=1000,).fit(x_train, y_train)


总结

本节是用支持向量机在我们自己的数据上的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sunnuan01

一起学习,共同进步

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

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

打赏作者

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

抵扣说明:

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

余额充值