基于机器学习的心脏病预测方法(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)
还没有任何评论哟~
