3. 特征工程

在这部分,我们将对数据进行特征处理,以确保模型能够有效学习数据的模式。

主要步骤:

  1. 数据编码(将 diagnosis 变量转换为数值型)
  2. 特征选择(去除冗余特征,提高模型效果)
  3. 数据标准化(使不同尺度的特征具有相似的影响)
  4. 数据分割(划分训练集和测试集)

3.1 目标变量编码

diagnosis 是分类变量(M=恶性,B=良性),需要转换为数值:

# 将 'diagnosis' 转换为二进制变量(M=1,B=0)
df['diagnosis'] = df['diagnosis'].map({'M': 1, 'B': 0})

# 确保转换成功
print(df['diagnosis'].value_counts())

这样 diagnosis 变成了 0 和 1,适用于后面模型训练~

3.2 特征选择

去除高相关特征

目标: 高度相关的特征会导致冗余信息,影响模型的泛化能力。

我们使用皮尔逊相关系数 找出高相关特征,并进行降维处理:

import seaborn as sns
import numpy as np

# 计算相关性矩阵
corr_matrix = df.corr().abs()

# 设定阈值(如 0.9),高于该阈值的特征将被移除
threshold = 0.9

# 找到相关性高的特征对
high_corr_features = set()
for i in range(len(corr_matrix.columns)):
    for j in range(i):
        if corr_matrix.iloc[i, j] > threshold:
            feature_name = corr_matrix.columns[i]
            high_corr_features.add(feature_name)

print("高相关特征(将被移除):", high_corr_features)

# 删除高相关特征
df.drop(columns=high_corr_features, inplace=True)

这样可以减少数据冗余,提高训练速度,并避免模型过拟合!

选择最重要的特征

使用 SelectKBest 选择最具代表性的 K 个特征:

from sklearn.feature_selection import SelectKBest, f_classif

# 选择前 10 个最重要的特征
X = df.drop(columns=['diagnosis'])  # 特征
y = df['diagnosis']  # 目标变量

selector = SelectKBest(score_func=f_classif, k=10)
X_selected = selector.fit_transform(X, y)

# 获取被选中的特征名称
selected_features = X.columns[selector.get_support()]
print("被选中的 10 个关键特征:", selected_features)

这样,我们减少了无关特征,提高模型的效率!

3.3 数据集划分&数据标准化

为什么要标准化?

  • 机器学习模型(如逻辑回归、SVM、KNN)对特征尺度敏感
  • 标准化能提高梯度下降的收敛速度

使用 StandardScaler 进行标准化;

使用 train_test_split 划分训练集和测试集(80% 训练集,20% 测试集):

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler


# 若 X_selected 是 ndarray,则转为 DataFrame
if not isinstance(X_selected, pd.DataFrame):
    X_selected = pd.DataFrame(X_selected, columns=selected_features)

# 1. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X_selected, y, test_size=0.2, random_state=42, stratify=y
)

# 2. 标准化(只在训练集上 fit)
scaler = StandardScaler()
X_train_array = scaler.fit_transform(X_train)
X_test_array = scaler.transform(X_test)

# 3. 转换为 DataFrame,保留列名和索引
X_train_scaled = pd.DataFrame(X_train_array, columns=X_train.columns, index=X_train.index)
X_test_scaled = pd.DataFrame(X_test_array, columns=X_test.columns, index=X_test.index)

# 4. 打印数据形状
print("训练集大小:", X_train_scaled.shape)
print("测试集大小:", X_test_scaled.shape)

现在所有特征都均值为 0,方差为 1,适合训练模型!

这样,我们的模型可以使用训练集进行学习,并在测试集上评估效果!

3.4 小结

  • 编码 diagnosis 变量,转换为 0/1
  • 去除高相关特征,减少数据冗余
  • 选择最具代表性的 10 个特征
  • 进行标准化,使特征具有相同尺度
  • 划分训练集和测试集,保证模型评估的公平性
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容