一、数据说明
该心脏病数据集是通过组合 5 个已经独立可用但以前未合并的流行心脏病数据集来策划的。在这个数据集中,5 个心脏数据集结合了 11 个共同特征,使其成为迄今为止可用于研究目的的最大心脏病数据集。
该数据集由 1190 个实例和 11 个特征组成。这些数据集被收集并组合在一个地方,以帮助推进与CAD相关的机器学习和数据挖掘算法的研究,并希望最终推进临床诊断和早期治疗。
二、导入包
import numpy as np # 线性代数
import pandas as pd # 数据处理, CSV file I/O (e.g. pd.read_csv)
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from IPython.core.display import display, HTML
三、数据集基本信息
1、导入数据
df = pd.read_csv("./data/heart_statlog_cleveland_hungary_final.csv")
df.shape
2、数据处理
df.head()
df.describe()
df.isna().sum()
四 、类别统计
categoricals = ["sex", "chest pain type", "fasting blood sugar", "resting ecg", "exercise angina", "ST slope", "target"]
fig, axes = plt.subplots(nrows=1, ncols=7, figsize=(12, 5))
五、分类参数对心脏病诊断的影响
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(12, 7))
index = 0
六、配对图显示诊断标记的患者之间的数值数据分布
sns.pairplot(df, vars=numericals, hue=df.columns[-1])
七、显示心脏病患者和非心脏病患者数值均值的条形图
fig, axes = plt.subplots(nrows=1, ncols=5, figsize=(10, 7))
for i, j in enumerate(numericals):
plots(df, df.columns[-1], j, axes[i])
八、显示心脏病患者和非心脏病患者的数值分布和异常值的箱线图
fig, axes = plt.subplots(nrows=1, ncols=5, figsize=(10, 7))
for i, j in enumerate(numericals):
九、Kdeplots、条形图、箱线图显示无心脏病患者的数值分布
for i in df[df.columns[-1]].unique():
if i == 0:
display(HTML(
"<h1>柱状图,条形图,箱形图显示了无心脏病患者的数值分布</h1>"))
else:
display(HTML(
"<h1>柱状图,柱状图,箱形图显示了心脏病患者的数值分布</h1>"))
temp_df = df[df[df.columns[-1]] == i]
1、Kdeplot显示性别、胸痛类型、空腹血糖、静息心电图、运动性心绞痛、峰值运动ST段的斜率组患者的数值密度
2、显示性别、胸痛类型、空腹血糖、静息心电图、运动性心绞痛、峰值运动ST段的斜率群体患者的数值平均值的条形图
3、箱形图显示了数值异常值和性别、胸痛类型、空腹血糖、静息心电图、运动性心绞痛、峰值运动ST段的斜率的患者之间的数据分布
4、kdeploy显示了性别、胸痛类型、空腹血糖、静息心电图、运动性心绞痛、峰值运动ST段的斜率的群体患者的数字密度
5、显示性别、胸痛类型、空腹血糖、静息心电图、运动性心绞痛、峰值运动ST段的斜率的群体患者的数值平均值的条形图
6、箱形图显示了数值异常值和不同性别、胸痛类型、空腹血糖、静息心电图、运动性心绞痛、峰值运动ST段的斜率的患者之间的数据分布
十、缩放值并拆分为训练和测试批次
x = df.iloc[:, :-1].values
y = df.iloc[:, -1].values
scaler = MinMaxScaler()
x = scaler.fit_transform(x)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42, test_size=0.2)
十一、模型
rfc = RandomForestClassifier()
gbc = GradientBoostingClassifier()
etc = ExtraTreesClassifier()
abc = AdaBoostClassifier()
lgr = LogisticRegression()
svc = SVC()
xgb = XGBClassifier()
lgb = LGBMClassifier()
十二、培训和评估
scores, reports, matrices = [], dict(), dict()
for i, j in zip(models, names):
score, report, matrix = training(i, j)
scores += [score]
reports[j] = report
matrices[j] = matrix
dt = pd.DataFrame({"score": scores}, index=names)
fig, axes = plt.subplots()
dt = dt.sort_values("score", ascending=False)
dt["score"] = round(dt["score"], 2)
sns.barplot(x=dt.index, y=dt.iloc[:, 0], ax=axes)
fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(11, 7))
index = 0
for i in range(2):
for i in dt.index:
print("*"*30)
print(i)
print(reports[i])
print("\n\n")