了解数据集转换

了解机器学习的预处理、平衡、分层和数据集适用性。

在对 Cloud 控制台使用不同参数值时,或通过直接调用 Vertex AI API,您可以直接查询模型,并测试返回的结果。

提示Freeform

我正在进行一个机器学习项目,需要您的帮助来了解转换大型数据集的过程。以下代码用于处理缺失值、标准化值和平衡数据。您能否解释一下此代码?我需要知道这些步骤的顺序是否重要。如果训练数据稍后会进行平衡,我是否仍需要对拆分数据进行分层?此外,在评估模型性能之前,是否需要平衡测试数据?最后,请总结适合此工作流的数据类型。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTENC


df = pd.read_csv('my_dataset.csv')

# Remove duplicate rows from the dataset
df.drop_duplicates(inplace=True)

# Separate the features (X) and the target variable (y)
X = df.drop('target', axis=1)
y = df['target']

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

# Check class distribution
print(f"Original training set class distribution: {np.bincount(y_train)}")

# Identify numeric and categorical features
numeric_features = [col for col in X_train.columns if 'num_feature' in col]
categorical_features = [col for col in X_train.columns if 'cat_feature' in col]

# Preprocessing pipeline for numeric missing values and feature scaling
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())
])
# Preprocessing pipeline for categorical missing values and encoding
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# Preprocessing
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])
X_train_processed = preprocessor.fit_transform(X_train)
X_test_processed = preprocessor.transform(X_test)

# Class balancing
categorical_indices = [X_train.columns.get_loc(col) for col in categorical_features]
smote_nc = SMOTENC(categorical_features=categorical_indices, random_state=42)
X_train_resampled, y_train_resampled = smote_nc.fit_resample(X_train_processed, y_train)

print(f"Resampled training set class distribution: {np.bincount(y_train_resampled)}")

响应

此代码会在将数据集馈送到机器学习模型之前,对数据集执行几个关键的预处理步骤。我们来逐步分析代码,并在过程中解答您的疑问。

代码说明:

  1. 数据加载和重复数据移除:代码首先将 CSV 文件 (my_dataset.csv) 加载到 pandas DataFrame 中,然后移除重复行。

  2. 特征和目标分离:将数据集分为特征 (X) 和目标变量 (y)。系统会假定“target”列是目标变量。

  3. 训练-测试拆分:使用 train_test_split 将数据拆分为训练集和测试集。关键的是,stratify=y 可确保在训练集和测试集中都保持目标变量 (y) 中的类别比例。这对于防止偏差非常重要,尤其是在数据集不平衡的情况下。

  4. 类别分布检查:代码会在平衡之前输出训练集中目标变量的类别分布。

  5. 特征识别:代码会根据命名惯例(列名称中的“num_feature”和“cat_feature”)识别数值特征和分类特征。这假定您的列的命名方式能够清楚区分数值特征和分类特征。更可靠的方法可能是直接检查数据类型。

  6. 预处理流水线:系统会创建两个流水线:

    • numeric_transformer:处理数值特征。它首先使用平均值 (SimpleImputer(strategy='mean')) 来填充缺失值,然后使用 StandardScaler 对特征进行标准化。
    • categorical_transformer:处理分类特征。它使用最常见的值 (SimpleImputer(strategy='most_frequent')) 来填充缺失值,然后使用 OneHotEncoder(handle_unknown='ignore') 对特征进行独热编码。handle_unknown='ignore' 参数非常重要;它会通过为测试集中的未知类别分配零向量来处理这些类别。
  7. ColumnTransformerColumnTransformer 会合并这两个流水线,并将适当的流水线应用于每种特征类型。

  8. 数据转换:系统会对训练数据调用 fit_transform 方法,以同时适配转换器并转换数据。然后,使用 transform 对测试数据应用从训练数据中学习到的转换。为避免数据泄露,请务必仅使用训练数据。

  9. 使用 SMOTENC 进行类平衡SMOTENC(针对名义特征和连续特征的少数派过采样技术)用于对训练数据中的少数派类别进行过采样。这可以解决类不平衡问题。重要的是,它会将类别特征的索引作为输入,以便在过采样期间适当处理这些特征。

  10. 重新采样类别分布:代码会输出平衡训练集的类别分布。

解答您的疑问:

  • 步骤顺序:顺序非常重要。您必须:

    1. 拆分:在进行任何预处理或平衡之前,将数据集拆分为训练集和测试集。这样可以防止测试集的数据泄露到训练集中。
    2. 预处理:对训练集和测试集应用预处理步骤(插补和缩放/编码)。仅对训练数据拟合转换器,然后对训练数据和测试数据进行转换
    3. 平衡:仅使用 SMOTE 等技术平衡训练数据。请勿平衡测试集。
  • 在拆分中分层:由于您稍后会使用 SMOTE 平衡训练数据,因此可以train_test_split 中移除 stratify=y。不过,通常最好保留该属性。分层可确保在初始拆分中获得代表性类别分布,即使您稍后修改训练集的平衡也是如此。移除分层可能会导致测试集的代表性略微降低,但与分层抽样的好处相比,这种影响通常很小。

  • 平衡测试数据,您绝不应平衡测试数据。测试数据应反映您的数据在现实中的分布情况。平衡它会人为地夸大性能指标,并对模型的泛化能力提供误导性的评估。

  • 适当的数据:此工作流适用于以下数据集:

    • 混合使用数字特征和分类特征。
    • 数值特征和分类特征中均缺少值。
    • 目标变量中的类分布不平衡。
    • 足够多的样本,以避免在过度采样后过度拟合。SMOTE 可以创建合成样本,但仍需要有足够的原始数据点来学习有意义的模式。

总而言之,此代码提供了一种健壮且结构良好的方法来预处理机器学习数据,有效处理缺失值、缩放、编码和类不平衡问题。操作顺序对于避免数据泄露和获得可靠的模型评估至关重要。

型号: gemini-1.5-flash-002
温度: 0.2
输出令牌数量上限: 8192
TopK: 40.0
TopP: 0.95