Pelajari transformasi set data

Pahami pemrosesan awal, penyeimbangan, stratifikasi, dan kesesuaian set data untuk machine learning.

Anda dapat membuat kueri model secara langsung dan menguji hasil yang ditampilkan saat menggunakan parameter value yang berbeda dengan Konsol Cloud, atau dengan memanggil Vertex AI API secara langsung.

Perintah Format Bebas

Saya sedang mengerjakan project machine learning dan memerlukan bantuan Anda untuk memahami proses transformasi set data besar. Berikut adalah kode yang menangani nilai yang hilang, menstandarkan nilai, dan menyeimbangkan data. Dapatkah Anda menjelaskan kode ini? Saya perlu mengetahui apakah urutan langkah-langkah ini penting. Jika data pelatihan diseimbangkan nanti, apakah saya masih perlu mengelompokkan data dalam pemisahan? Selain itu, apakah data pengujian perlu diseimbangkan sebelum mengevaluasi performa model? Terakhir, ringkas jenis data yang sesuai untuk alur kerja ini.

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)}")

Respons

Kode ini melakukan beberapa langkah prapemrosesan penting pada set data sebelum memasukkannya ke model machine learning. Mari kita uraikan kode tersebut langkah demi langkah, dengan menjawab pertanyaan Anda di sepanjang prosesnya.

Penjelasan Kode:

  1. Pemuatan Data dan Penghapusan Duplikasi: Kode dimulai dengan memuat file CSV (my_dataset.csv) ke dalam DataFrame pandas dan menghapus baris duplikat.

  2. Pemisahan Fitur dan Target: Pemisahan ini membagi set data menjadi fitur (X) dan variabel target (y). Kolom 'target' diasumsikan sebagai variabel target.

  3. Pemisahan Pelatihan-Pengujian: Data dibagi menjadi set pelatihan dan pengujian menggunakan train_test_split. Yang terpenting, stratify=y memastikan bahwa proporsi kelas dalam variabel target (y) dipertahankan dalam set pelatihan dan pengujian. Hal ini penting untuk mencegah bias, terutama jika Anda memiliki set data yang tidak seimbang.

  4. Pemeriksaan Distribusi Kelas: Kode ini mencetak distribusi kelas variabel target dalam set pelatihan sebelum melakukan penyeimbangan.

  5. Identifikasi Fitur: Kode mengidentifikasi fitur numerik dan kategoris berdasarkan konvensi penamaan ('num_feature' dan 'cat_feature' dalam nama kolom). Hal ini mengasumsikan bahwa kolom Anda diberi nama dengan cara yang membedakan dengan jelas antara fitur numerik dan kategoris. Metode yang lebih andal mungkin melibatkan pemeriksaan jenis data secara langsung.

  6. Pipeline Prapemrosesan: Dua pipeline dibuat:

    • numeric_transformer: Menangani fitur numerik. Pertama, impute mengisi nilai yang tidak ada menggunakan nilai rata-rata (SimpleImputer(strategy='mean')), lalu menstandarkan fitur menggunakan StandardScaler.
    • categorical_transformer: Menangani fitur kategori. Metode ini mengimputasi nilai yang tidak ada menggunakan nilai yang paling sering (SimpleImputer(strategy='most_frequent')), lalu mengenkode fitur menggunakan OneHotEncoder(handle_unknown='ignore'). Parameter handle_unknown='ignore' sangat penting; parameter ini menangani kategori yang tidak terlihat dalam set pengujian dengan menetapkan vektor nol.
  7. ColumnTransformer: ColumnTransformer menggabungkan kedua pipeline, menerapkan pipeline yang sesuai ke setiap jenis fitur.

  8. Transformasi Data: Metode fit_transform dipanggil pada data pelatihan untuk menyesuaikan dengan transformer dan mengubah data secara bersamaan. transform kemudian digunakan pada data pengujian untuk menerapkan transformasi yang sama yang dipelajari dari data pelatihan. Anda harus memastikan model hanya sesuai dengan data pelatihan untuk menghindari kebocoran data.

  9. Class Balancing dengan SMOTENC: SMOTENC (Synthetic Minority Over-sampling Technique for Nominal and Continuous features) digunakan untuk melakukan oversampling pada class minoritas dalam data pelatihan. Hal ini mengatasi ketidakseimbangan class. Yang penting, metode ini menggunakan indeks fitur kategoris sebagai input untuk menanganinya dengan tepat selama oversampling.

  10. Distribusi Kelas yang Diambil Sampelnya: Kode ini mencetak distribusi kelas set pelatihan setelah penyeimbangan.

Jawaban atas pertanyaan Anda:

  • Urutan Langkah: Urutan sangatlah penting. Anda harus:

    1. Split: Memisahkan menjadi set pelatihan dan pengujian sebelum prapemrosesan atau penyeimbangan. Hal ini mencegah kebocoran data dari set pengujian ke set pelatihan.
    2. Pra-pemrosesan: Terapkan langkah-langkah pra-pemrosesan (imputasi dan penskalaan/enkode) ke set pelatihan dan pengujian. Sesuaikan transformer hanya pada data pelatihan, lalu transformasikan data pelatihan dan pengujian.
    3. Seimbang: Seimbangkan data pelatihan hanya menggunakan teknik seperti SMOTE. Jangan pernah menyeimbangkan set pengujian.
  • Stratifikasi dalam Pemisahan: Karena Anda akan menyeimbangkan data pelatihan nanti menggunakan SMOTE, Anda dapat menghapus stratify=y dari train_test_split. Namun, sebaiknya Anda tetap menyimpannya. Stratifikasi memastikan distribusi kelas yang representatif dalam pemisahan awal, meskipun Anda nanti mengubah keseimbangan set pelatihan. Menghapus stratifikasi dapat menyebabkan set pengujian yang sedikit kurang representatif, tetapi dampaknya biasanya kecil dibandingkan dengan manfaat sampling bertingkat.

  • Menyesuaikan Data Pengujian: Tidak, Anda tidak boleh menyeimbangkan data pengujian. Data pengujian harus mencerminkan distribusi data Anda di dunia nyata. Menyeimbangkannya akan secara artifisial meningkatkan metrik performa dan memberikan evaluasi yang menyesatkan tentang kemampuan generalisasi model Anda.

  • Data yang Sesuai: Alur kerja ini cocok untuk set data dengan:

    • Campuran fitur numerik dan kategoris.
    • Nilai tidak ada dalam fitur numerik dan kategoris.
    • Distribusi kelas yang tidak seimbang dalam variabel target.
    • Jumlah sampel yang memadai untuk menghindari overfitting setelah oversampling. SMOTE dapat membuat sampel sintetis, tetapi Anda tetap harus memiliki cukup titik data asli untuk mempelajari pola yang bermakna.

Singkatnya, kode ini memberikan pendekatan yang andal dan terstruktur dengan baik untuk prapemrosesan data untuk machine learning, menangani nilai yang hilang, penskalaan, encoding, dan ketidakseimbangan class secara efektif. Urutan operasi sangat penting untuk menghindari kebocoran data dan mendapatkan evaluasi model yang andal.

Model: gemini-1.5-flash-002
Suhu: 0,2
Token output maks: 8192
TopK: 40,0
TopP: 0,95