Day 10 机器学习建模和评估(没到版本)

@浙大疏锦行

今天先把昨天欠下的热力图和子图的任务完成一下

心脏病的特征相关性热力图

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.read_csv('heart.csv')
print(data.info())
# 将object类型转化为数字
# 先了解每类出现的次数去确定一个特征分布的情况


# 提取连续特征,计算相关系数,绘图
continue_feature = []
for feature in data.columns:
    unique_count = data[feature].nunique()
    if unique_count > 5:
        continue_feature.append(feature)
# 计算相关系数
corr_matrix = data[continue_feature].corr()
# 绘制相关系数矩阵的热力图
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title("Correlation Matrix")
plt.show()

子图

features = ['age','trestbps','chol','thalach']

plt.rcParams.update({'font.family':'SimHei','axes.unicode_minus':False})
fig, axes = plt.subplots(2, 2, figsize=(12, 8)) 

axes = axes.flatten()
# 展平为一维数组便于循环
for i, feature in enumerate(features):
# eumerate 函数返回索引和元素
    ax = axes[i]
    if i == 0:
        sns.histplot(data[feature].dropna(),kde=True,ax=ax,color='#61BFB5')
        ax.set_title(f'{feature} 分布特征',fontsize=13,fontweight='bold')
    elif i ==1:
        sns.boxplot(data=data,x=feature,ax=ax,color='#E1CBEF')
        sns.stripplot(data=data,x=feature,ax=ax,color='black',alpha=0.3,size=3)
        ax.set_title(f'{feature} 分布与异常值',fontsize=13,fontweight="bold")
    elif i ==2:
        sns.violinplot(data=data,x=feature,ax=ax,color='#2ca02c')
        ax.set_title(f'{feature} 分布形状',fontsize=13,fontweight='bold')
    else:
        sns.histplot(data=data,x=feature,hue='target',kde=True,ax=ax,palette=['#61BFB5','#E1CBEF'])
        ax.set_title(f'{feature} 与患病关系',fontsize=13,fontweight='bold')
    ax.grid(alpha=0.3)
plt.tight_layout()
plt.suptitle('心脏病数据集关键特征分析',fontsize=16,y=1,fontweight='bold')
plt.show()

今天的内容:

  1. 数据集的划分
  2. 机器学习模型建模的三行代码
  3. 机器学习模型分类问题的评估

好好理解下这几个评估指标。

一、先读取数据,数据概况分析,根据特征选择合适的预处理方式

import pandas as pd    #用于数据处理和分析,可处理表格数据。
import numpy as np     #用于数值计算,提供了高效的数组操作。
import matplotlib.pyplot as plt    #用于绘制各种类型的图表
import seaborn as sns   #基于matplotlib的高级绘图库,能绘制更美观的统计图形。

# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

data = pd.read_csv('heart.csv')    #读取数据
print("数据基本信息:")
print(data.info())
print("\n数据前5行预览:")
print(data.head())
数据基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 303 entries, 0 to 302
Data columns (total 14 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   age       303 non-null    int64  
 1   sex       303 non-null    int64  
 2   cp        303 non-null    int64  
 3   trestbps  303 non-null    int64  
 4   chol      303 non-null    int64  
 5   fbs       303 non-null    int64  
 6   restecg   303 non-null    int64  
 7   thalach   303 non-null    int64  
 8   exang     303 non-null    int64  
 9   oldpeak   303 non-null    float64
 10  slope     303 non-null    int64  
 11  ca        303 non-null    int64  
 12  thal      303 non-null    int64  
 13  target    303 non-null    int64  
dtypes: float64(1), int64(13)
memory usage: 33.3 KB
None

数据前5行预览:
   age  sex  cp  trestbps  chol  fbs  ...  exang  oldpeak  slope  ca  thal  target
0   63    1   3       145   233    1  ...      0      2.3      0   0     1       1  
1   37    1   2       130   250    0  ...      0      3.5      0   0     2       1  
2   41    0   1       130   204    0  ...      0      1.4      2   0     2       1  
3   56    1   1       120   236    0  ...      0      0.8      2   0     2       1  
4   57    0   0       120   354    0  ...      1      0.6      2   0     2       1  

二、进行特征分类,处理异常值,对离散特征独热编码,连续特征进行标准化


discrete_feature=[]
continue_feature=[]
# 定义标签列名称
TARGET_COLUMN = 'target'
for feature in data.columns:
    # 跳过标签列
    if feature == TARGET_COLUMN:
        continue
    
    if data[feature].dtype =='object':
        discrete_feature.append(feature)
    else:
        unique_count = data[feature].nunique()
        if unique_count<=5:
            discrete_feature.append(feature)
        else:
            continue_feature.append(feature)

print("离散特征:", discrete_feature)
print("连续特征:", continue_feature)
# 新增:单独提取标签列
target = data[TARGET_COLUMN]
print("标签列名称:", TARGET_COLUMN)
print("标签分布:", target.value_counts())

# 数值特征异常值处理
# 新增:异常值检测与处理(IQR方法)
# 1. 可视化异常值(箱线图)
plt.figure(figsize=(15, 5))
for i, feature in enumerate(continue_feature):
    plt.subplot(1, len(continue_feature), i+1)
    sns.boxplot(x=data[feature])
    plt.title(f'{feature} 异常值检测')
plt.tight_layout()
plt.show()

# 2. IQR方法处理异常值
# 创建副本避免修改原数据
data_clean = data.copy()
for feature in continue_feature:
    Q1 = data_clean[feature].quantile(0.25)
    Q3 = data_clean[feature].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    # 截断异常值(医学数据推荐,避免数据丢失)
    data_clean[feature] = data_clean[feature].clip(lower_bound, upper_bound)
    
    # 统计异常值数量
    outliers = data[(data[feature] < lower_bound) | (data[feature] > upper_bound)]
    print(f'{feature}: 检测到{len(outliers)}个异常值,已截断处理')

# 分类特征编码(独热编码)
data_encoded = pd.get_dummies(data_clean, columns=discrete_feature, drop_first=True)
print("\n独热编码后的特征数量:", data_encoded.shape[1])
data_encoded = data_encoded.astype(int)

# 数值特征标准化
scaler = StandardScaler()
data_encoded[continue_feature] = scaler.fit_transform(data_encoded[continue_feature])

# 查看处理后的数据
print("\n预处理后的数据预览:")
print(data_encoded.head())

[5 rows x 14 columns]
离散特征: ['sex', 'cp', 'fbs', 'restecg', 'exang', 'slope', 'ca', 'thal']
连续特征: ['age', 'trestbps', 'chol', 'thalach', 'oldpeak']
标签列名称: target
标签分布: target
1    165
0    138
Name: count, dtype: int64
age: 检测到0个异常值,已截断处理
trestbps: 检测到9个异常值,已截断处理
chol: 检测到5个异常值,已截断处理
thalach: 检测到1个异常值,已截断处理
oldpeak: 检测到5个异常值,已截断处理

独热编码后的特征数量: 23
新增衍生特征后连续特征集: ['age', 'trestbps', 'chol', 'thalach', 'oldpeak', 'thalach_age_ratio', 'bp_chol_risk', 'st_depression_ratio']

预处理后的数据预览:
        age  trestbps      chol   thalach  ...  thal_3  thalach_age_ratio  bp_chol_risk  st_depression_ratio
0  0.952197  0.828728 -0.255515  0.013648  ...       0           0.014333     -0.211752            88.447268
1 -1.915313 -0.077351  0.102818  1.641343  ...       0          -0.856958     -0.007953             1.326506
2 -1.474158 -0.077351 -0.866788  0.981467  ...       0          -0.665781      0.067047             0.241410
3  0.180175 -0.681403 -0.192279  1.245417  ...       0           6.912271      0.131020            -0.588736
4  0.290464 -0.681403  2.294970  0.585541  ...       0           2.015883     -1.563799            -1.252213

[5 rows x 26 columns]

来不及了,今天就先到这吧,开始的晚了,明天一定早早开始啊啊啊啊啊啊啊啊啊。先预处理好

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值