提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、支持向量机的参数与属性
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)
总结
本节是用支持向量机在我们自己的数据上的应用。