1. 机器学习项目实战:从数据预处理到模型评估全流程解析
作为一名数据科学从业者,我经常被问到:"一个完整的机器学习项目到底应该怎么做?"今天我就以心脏病预测这个经典案例,带大家走一遍从数据清洗到模型评估的全流程。这个项目特别适合刚入门机器学习的朋友,因为数据集规模适中(约300条记录),但包含了数值型、类别型、有序型等各种特征类型,能覆盖大部分实际业务场景。
在开始之前,我们需要明确几个核心目标:第一,理解数据背后的业务含义;第二,掌握特征工程的标准化流程;第三,学会用多种算法建模并客观评估模型表现。我会在讲解过程中穿插一些实际项目中容易踩的坑,比如特征缩放时容易忽略的细节、类别变量编码的陷阱等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据理解与探索性分析
2.1 数据加载与初步观察
首先我们加载数据并查看基本信息。这里我强烈建议在读取数据后立即做三件事:查看前几行样本、检查数据类型、统计缺失值情况。这些看似简单的步骤往往能发现数据中的潜在问题。
python复制import pandas as pd
import numpy as np
# 加载数据并重命名列(中文更直观)
data = pd.read_csv('heart.csv')
column_mapping = {
'age': '年龄', 'sex': '性别', 'cp': '胸痛类型',
'trestbps': '静息血压', 'chol': '血清胆固醇',
'fbs': '空腹血糖', 'restecg': '静息心电图结果',
'thalach': '最大心率', 'exang': '运动诱发心绞痛',
'oldpeak': 'ST段压低', 'slope': 'ST段斜率',
'ca': '主要血管数', 'thal': '地中海贫血',
'target': '心脏病诊断'
}
data = data.rename(columns=column_mapping)
print("数据维度:", data.shape)
print("\n前5行数据:")
print(data.head())
print("\n数据类型统计:")
print(data.dtypes.value_counts())
print("\n缺失值统计:")
print(data.isnull().sum())
注意:实际项目中经常会遇到列名不规范的情况,建议在读取数据后立即统一命名规范。中文列名虽然直观,但在团队协作时可能造成编码问题,需要权衡使用。
2.2 特征类型解析
这个数据集包含13个特征和1个目标变量,可以划分为以下几类:
-
连续型特征:
- 年龄(数值)
- 静息血压(mmHg)
- 血清胆固醇(mg/dl)
- 最大心率(bpm)
- ST段压低(mm)
-
离散型特征:
- 性别(0=女,1=男)
- 空腹血糖(>120mg/dl为1,否则为0)
- 运动诱发心绞痛(0=无,1=有)
-
有序分类特征:
- 胸痛类型(1-4表示疼痛程度)
- ST段斜率(1=上斜,2=平坦,3=下斜)
- 主要血管数(0-3)
- 地中海贫血(1=正常,2=固定缺损,3=可逆缺损)
-
目标变量:
- 心脏病诊断(0=无,1=有)
2.3 可视化分析
通过可视化可以快速发现数据分布特点和潜在异常值。我习惯使用Seaborn绘制以下几种图表:
python复制import seaborn as sns
import matplotlib.pyplot as plt
# 设置可视化风格
sns.set_style("whitegrid")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 连续变量分布
plt.figure(figsize=(12,8))
continuous_cols = ['年龄', '静息血压', '血清胆固醇', '最大心率', 'ST段压低']
for i, col in enumerate(contin
