Advertisement

基于机器学习的心脏病预测方法(9)——支持向量机(SVM)

阅读量:

目录

    • 一、支持向量机
    • 二、核心代码
    • 三、评价指标
      • 3.1 混淆矩阵
      • 3.2 预测分数
      • 3.3 召回率
      • 3.4 F分数
      • 3.5 FN(false negative)
      • 3.6 ROC曲线
      • 3.7 AUC指标

一、支持向量机

支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

SVM,SVC,SVR三者的关系:

  • SVM=Support Vector Machine 是支持向量机;
  • SVC=Support Vector Classification就是支持向量机用于分类
  • SVR=Support Vector Regression.就是支持向量机用于回归

二、核心代码

首先需要导入相应库和数据集:

复制代码
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    import warnings
    warnings.filterwarnings('ignore')
    %matplotlib inline
    data = pd.read_csv('heart.csv', sep=',')
    data.head()

运行结果:

在这里插入图片描述

然后划分训练集和测试集(训练集80%,测试集20%):

复制代码
    from sklearn.model_selection import train_test_split
    
    predictors = data.drop("target",axis=1)
    target = data["target"]
    
    X_train,X_test,Y_train,Y_test = train_test_split(predictors,target,test_size=0.20,random_state=0)
    print("Training features have {0} records and Testing features have {1} records.".\
      format(X_train.shape[0], X_test.shape[0]))

运行结果:
Training features have 242 records and Testing features have 61 records.

在这里插入图片描述

支持向量机的核心代码如下:

复制代码
    from sklearn.svm import SVC
    svm=SVC(C=5,degree=2,gamma=0.06,kernel='rbf',probability=True,random_state=0)
    model=svm.fit(X_train,Y_train)
    y_pred=model.predict(X_test)
复制代码
    from sklearn.metrics import accuracy_score
    score_svm = round(accuracy_score(y_pred,Y_test)*100,2)
    print("支持向量机的准确率时: "+str(score_svm)+"%")

运行结果:
支持向量机的准确率时: 57.38%

三、评价指标

3.1 混淆矩阵

复制代码
    from sklearn.metrics import confusion_matrix
    matrix= confusion_matrix(Y_test, y_pred)
    sns.heatmap(matrix,annot = True, fmt = "d")

运行结果:

在这里插入图片描述

3.2 预测分数

复制代码
    from sklearn.metrics import precision_score
    precision = precision_score(Y_test, y_pred)
    print("Precision: ",precision)

运行结果:
Precision: 0.576271186440678

3.3 召回率

复制代码
    from sklearn.metrics import recall_score
    recall = recall_score(Y_test, y_pred)
    print("Recall is: ",recall)

运行结果:
Recall is: 1.0

3.4 F分数

复制代码
    print((2*precision*recall)/(precision+recall))

运行结果:
0.7311827956989247

3.5 FN(false negative)

复制代码
    CM = pd.crosstab(Y_test, y_pred)
    TN=CM.iloc[0,0]
    FP=CM.iloc[0,1]
    FN=CM.iloc[1,0]
    TP=CM.iloc[1,1]
    fnr = FN*100/(FN+TP)
    fnr

运行结果:
0.0

3.6 ROC曲线

复制代码
    from sklearn.metrics import roc_curve, auc
    
    y_pred=svm.predict(X_test)
    y_proba=svm.predict_proba(X_test)
    fpr, tpr, thresholds = roc_curve(Y_test, y_proba[:,1])
    
    fig, ax = plt.subplots()
    ax.plot(fpr, tpr)
    ax.plot([0, 1], [0, 1], transform=ax.transAxes, ls="--", c=".3")
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.0])
    plt.rcParams['font.size'] = 12
    plt.title('ROC curve for diabetes classifier')
    plt.xlabel('False Positive Rate (1 - Specificity)')
    plt.ylabel('True Positive Rate (Sensitivity)')
    plt.grid(True)

运行结果:

3.7 AUC指标

复制代码
    auc(fpr, tpr)

运行结果:
0.5266884531590414

全部评论 (0)

还没有任何评论哟~