3.4.1 数据集说明
Heart Disease数据集https://www.kaggle.com/datasets/johnsmith88/heart-disease-dataset。
- 年龄:连续值
- 性别:0-女,1-男
- 胸痛类型:0-典型心绞痛,1-非典型心绞痛,2-非心绞痛,3-无症状
- 静息血压:连续值,单位mmHg
- 胆固醇:连续值,单位mg/dl
- 空腹血糖:1-大于120mg/dl,0-小于等于120mg/dl
- 静息心电图结果:0-正常,1-ST-T异常,2-可能左心室肥大
- 最大心率:连续值
- 运动性心绞痛:1-有,0-无
- 运动后的ST下降:连续值
- 峰值ST段的斜率:0-向上,1-水平,2-向下
- 主血管数量:0到3
- 地中海贫血:一种先天性贫血,0-正常,1-固定缺陷,2-可逆缺陷
- 是否患有心脏病:标签,0-否,1-是
3.4.2 加载数据集
mport pandas as pd
# 加载数据集
heart_disease = pd.read_csv("data/heart_disease.csv")
# 处理缺失值
heart_disease.dropna()
heart_disease.info()
heart_disease.head()
![图片[1]-3.4 案例:心脏病预测-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-78.png)
3.4.3 数据集划分
from sklearn.model_selection import train_test_split
# 划分特征和标签
X = heart_disease.drop("是否患有心脏病", axis=1) # 特征
y = heart_disease["是否患有心脏病"] # 标签
# 将数据集按7:3划分为训练数据与测试数据
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=100)
3.4.4 特征工程
- 特征转换
数据集中包含多种类型的特征:
- 类别型特征(需要特殊处理)
- 胸痛类型:4种分类(名义变量)
- 静息心电图结果:3种分类(名义变量)
- 峰值ST段的斜率:3种分类(有序变量)
- 地中海贫血:4种分类(名义变量)
- 数值型特征(可直接标准化):年龄、静息血压、胆固醇、最大心率、运动后的ST下降、主血管数量
- 二元特征(保持原样):性别、空腹血糖、运动性心绞痛
对于类别型特征,直接使用整数编码的类别特征会被算法视为有序数值,导致错误的距离计算(例如:会认为 胸痛类型=1 和 胸痛类型=2 之间的差异比 胸痛类型=1和 胸痛类型=3之间差异更小,而实际上它们都是类别)。使用 独热编码(One-Hot Encoding)可将类别特征转换为二元向量,消除虚假的顺序关系。
![图片[2]-3.4 案例:心脏病预测-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-79.png)
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
# 数值型特征
numerical_features = ["年龄", "静息血压", "胆固醇", "最大心率", "运动后的ST下降", "主血管数量"]
# 类别型特征
categorical_features = ["胸痛类型", "静息心电图结果", "峰值ST段的斜率", "地中海贫血"]
# 二元特征
binary_features = ["性别", "空腹血糖", "运动性心绞痛"]
# 创建列转换器
preprocessor = ColumnTransformer(
transformers=[
# 对数值型特征进行标准化
("num", StandardScaler(), numerical_features),
# 对类别型特征进行独热编码,使用drop="first"避免多重共线性
("cat", OneHotEncoder(drop="first"), categorical_features),
# 二元特征不进行处理
("binary", "passthrough", binary_features),
]
)
# 执行特征转换
x_train = preprocessor.fit_transform(x_train) # 计算训练集的统计信息并进行转换
x_test = preprocessor.transform(x_test) # 使用训练集计算的信息对测试集进行转换
2.避免多重共线性
![图片[3]-3.4 案例:心脏病预测-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-80.png)
![图片[4]-3.4 案例:心脏病预测-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-81.png)
虽然KNN不直接受多重共线性影响(不像线性模型),但使用drop=”first”也能够减少冗余特征,提升计算效率。
3.4.5 模型训练与评估
from sklearn.neighbors import KNeighborsClassifier
# 使用K近邻分类模型,K=3
knn = KNeighborsClassifier(n_neighbors=3)
# 模型训练
knn.fit(x_train, y_train)
# 模型评估,计算准确率
knn.score(x_test, y_test)
3.4.6 模型的保存
可以使用Python的joblib库保存训练好的模型:
import joblib
joblib.dump(knn, "knn_heart_disease")
加载先前保存的模型:
# 加载模型
knn_loaded = joblib.load("knn_heart_disease")
# 预测
y_pred = knn_loaded.predict(x_test[10:11])
# 打印真实值与预测值
print(y_test.iloc[10], y_pred)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















请登录后查看评论内容