Menyiapkan data untuk membangun model

Pelajari cara menggunakan ML.NET untuk menyiapkan data untuk pemrosesan tambahan atau membangun model.

Data seringkali tidak bersih dan jarang. ML.NET algoritma pembelajaran mesin mengharapkan input atau fitur berada dalam satu vektor numerik. Demikian pula, nilai untuk memprediksi (label), terutama ketika data kategoris, harus dikodekan. Oleh karena itu salah satu tujuan persiapan data adalah untuk memasukkan data ke dalam format yang diharapkan oleh algoritma ML.NET.

Membagi data menjadi set pelatihan & pengujian

Bagian berikut menguraikan masalah umum saat melatih model yang dikenal sebagai overfitting dan underfitting. Memisahkan data dan memvalidasi model Anda menggunakan set yang disimpan dapat membantu Anda mengidentifikasi dan mengurangi masalah ini.

Overfitting & underfitting

Overfitting dan underfitting adalah dua masalah paling umum yang Anda temui saat melatih model. Underfitting berarti pelatih yang dipilih tidak cukup mampu untuk menyesuaikan himpunan data pelatihan dan biasanya mengakibatkan kerugian tinggi selama pelatihan dan skor/metrik rendah pada himpunan data pengujian. Untuk mengatasinya, Anda perlu memilih model yang lebih kuat atau melakukan lebih banyak rekayasa fitur. Overfitting adalah sebaliknya, yang terjadi ketika model mempelajari data pelatihan dengan terlalu baik. Ini biasanya menghasilkan metrik kehilangan rendah selama pelatihan tetapi kehilangan tinggi pada himpunan data pengujian.

Analogi yang baik untuk konsep-konsep ini adalah belajar untuk ujian. Katakanlah Anda tahu pertanyaan dan jawaban sebelumnya. Setelah belajar, Anda mengikuti tes dan mendapatkan skor yang sempurna. Berita bagus! Namun, ketika Anda diberi ujian lagi dengan pertanyaan yang disusun ulang dan dengan kata-kata yang sedikit berbeda, Anda mendapatkan skor yang lebih rendah. Itu menunjukkan Anda menghafal jawabannya dan tidak benar-benar mempelajari konsep yang sedang Anda uji. Ini adalah contoh overfitting. Underfitting adalah kebalikan dari bahan studi yang Anda berikan tidak secara akurat mewakili apa yang Anda evaluasi untuk ujian. Akibatnya, Anda menggunakan untuk menebak jawaban karena Anda tidak memiliki cukup pengetahuan untuk menjawab dengan benar.

Memisahkan Data

Ambil data input berikut dan muat ke dalam yang IDataView disebut data:

var homeDataList = new HomeData[]
{
    new()
    {
        NumberOfBedrooms = 1f,
        Price = 100_000f
    },
    new()
    {
        NumberOfBedrooms = 2f,
        Price = 300_000f
    },
    new()
    {
        NumberOfBedrooms = 6f,
        Price = 600_000f
    },
    new()
    {
        NumberOfBedrooms = 3f,
        Price = 300_000f
    },
    new()
    {
        NumberOfBedrooms = 2f,
        Price = 200_000f
    }
};

Untuk membagi data menjadi kumpulan pelatihan /pengujian, gunakan TrainTestSplit(IDataView, Double, String, Nullable<Int32>) metode .

// Apply filter
TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);

Parameter testFraction digunakan untuk mengambil 0,2 atau 20% dari himpunan data untuk pengujian. Sisanya 80% digunakan untuk pelatihan.

Hasilnya adalah DataOperationsCatalog.TrainTestData dengan dua IDataViews yang dapat Anda akses melalui TrainSet dan TestSet.

Filter data

Terkadang, tidak semua data dalam himpunan data relevan untuk analisis. Pendekatan untuk menghapus data yang tidak relevan adalah pemfilteran. DataOperationsCatalog berisi sekumpulan operasi filter yang mengambil IDataView semua data yang berisi dan mengembalikan IDataView yang hanya berisi titik data yang menarik. Penting untuk dicatat bahwa karena operasi filter bukan IEstimator atau ITransformer seperti yang ada di TransformsCatalog, operasi tersebut tidak dapat disertakan sebagai bagian EstimatorChain dari alur persiapan data atau TransformerChain .

Ambil data input berikut dan muat ke dalam yang IDataView disebut data:

HomeData[] homeDataList = new HomeData[]
{
    new ()
    {
        NumberOfBedrooms=1f,
        Price=100000f
    },
    new ()
    {
        NumberOfBedrooms=2f,
        Price=300000f
    },
    new ()
    {
        NumberOfBedrooms=6f,
        Price=600000f
    }
};

Untuk memfilter data berdasarkan nilai kolom, gunakan FilterRowsByColumn metode .

// Apply filter
IDataView filteredData = mlContext.Data.FilterRowsByColumn(data, "Price", lowerBound: 200000, upperBound: 1000000);

Sampel di atas mengambil baris dalam himpunan data dengan harga antara 200000 dan 1000000. Hasil penerapan filter ini hanya akan mengembalikan dua baris terakhir dalam data dan mengecualikan baris pertama karena harganya adalah 100000 dan bukan di antara rentang yang ditentukan.

Mengganti nilai yang hilang

Nilai yang hilang adalah kemunculan umum dalam himpunan data. Salah satu pendekatan untuk menangani nilai yang hilang adalah menggantinya dengan nilai default untuk jenis yang diberikan jika ada atau nilai lain yang bermakna seperti nilai rata-rata dalam data.

Ambil data input berikut dan muat ke dalam yang IDataView disebut data:

HomeData[] homeDataList = new HomeData[]
{
    new ()
    {
        NumberOfBedrooms=1f,
        Price=100000f
    },
    new ()
    {
        NumberOfBedrooms=2f,
        Price=300000f
    },
    new ()
    {
        NumberOfBedrooms=6f,
        Price=float.NaN
    }
};

Perhatikan bahwa elemen terakhir dalam daftar kami memiliki nilai yang hilang untuk Price. Untuk mengganti nilai yang hilang di Price kolom, gunakan ReplaceMissingValues metode untuk mengisi nilai yang hilang tersebut.

Penting

ReplaceMissingValue hanya berfungsi dengan data numerik.

// Define replacement estimator
var replacementEstimator = mlContext.Transforms.ReplaceMissingValues("Price", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean);

// Fit data to estimator
// Fitting generates a transformer that applies the operations of defined by estimator
ITransformer replacementTransformer = replacementEstimator.Fit(data);

// Transform data
IDataView transformedData = replacementTransformer.Transform(data);

ML.NET mendukung berbagai mode penggantian. Sampel di atas menggunakan Mean mode penggantian, yang mengisi nilai yang hilang dengan nilai rata-rata kolom tersebut. Hasil penggantian mengisi Price properti untuk elemen terakhir dalam data kami dengan 200.000 karena rata-rata 100.000 dan 300.000.

Gunakan normalizer

Normalisasi adalah teknik pra-pemrosesan data yang digunakan untuk menskalakan fitur agar berada dalam rentang yang sama, biasanya antara 0 dan 1, sehingga dapat diproses dengan lebih akurat oleh algoritma pembelajaran mesin. Misalnya, rentang untuk usia dan pendapatan bervariasi secara signifikan dengan usia umumnya berada di kisaran 0-100 dan pendapatan umumnya berada di kisaran nol hingga ribuan. Kunjungi halaman transformasi untuk daftar yang lebih rinci dan deskripsi transformasi normalisasi.

Normalisasi Min-Max

Ambil data input berikut dan muat ke dalam yang IDataView disebut data:

HomeData[] homeDataList = new HomeData[]
{
    new ()
    {
        NumberOfBedrooms = 2f,
        Price = 200000f
    },
    new ()
    {
        NumberOfBedrooms = 1f,
        Price = 100000f
    }
};

Normalisasi dapat diterapkan ke kolom dengan nilai numerik tunggal serta vektor. Normalisasi data di Price kolom menggunakan normalisasi maks min dengan NormalizeMinMax metode .

// Define min-max estimator
var minMaxEstimator = mlContext.Transforms.NormalizeMinMax("Price");

// Fit data to estimator
// Fitting generates a transformer that applies the operations of defined by estimator
ITransformer minMaxTransformer = minMaxEstimator.Fit(data);

// Transform data
IDataView transformedData = minMaxTransformer.Transform(data);

Nilai [200000,100000] harga asli dikonversi ke [ 1, 0.5 ] menggunakan MinMax rumus normalisasi yang menghasilkan nilai output dalam rentang 0-1.

Binning

Binning mengonversi nilai berkelanjutan menjadi representasi diskrit dari input. Misalnya, salah satu fitur Anda adalah usia. Alih-alih menggunakan nilai usia aktual, binning membuat rentang untuk nilai tersebut. 0-18 bisa satu bin, yang lain bisa 19-35 dan sebagainya.

Ambil data input berikut dan muat ke dalam yang IDataView disebut data:

HomeData[] homeDataList = new HomeData[]
{
    new ()
    {
        NumberOfBedrooms=1f,
        Price=100000f
    },
    new ()
    {
        NumberOfBedrooms=2f,
        Price=300000f
    },
    new ()
    {
        NumberOfBedrooms=6f,
        Price=600000f
    }
};

Menormalkan data menjadi bin menggunakan NormalizeBinning metode . Parameter maximumBinCount memungkinkan Anda menentukan jumlah bin yang diperlukan untuk mengklasifikasikan data Anda. Dalam contoh ini, data akan dimasukkan ke dalam dua bin.

// Define binning estimator
var binningEstimator = mlContext.Transforms.NormalizeBinning("Price", maximumBinCount: 2);

// Fit data to estimator
// Fitting generates a transformer that applies the operations of defined by estimator
var binningTransformer = binningEstimator.Fit(data);

// Transform Data
IDataView transformedData = binningTransformer.Transform(data);

Hasil binning membuat batas bin .[0,200000,Infinity] Oleh karena itu bin yang dihasilkan adalah [0,1,1] karena pengamatan pertama antara 0-200000 dan yang lain lebih besar dari 200000 tetapi kurang dari tak terbatas.

Bekerja dengan data kategoris

Salah satu jenis data yang paling umum adalah data kategoris. Data kategoris memiliki jumlah kategori terbatas. Misalnya, status AS, atau daftar jenis hewan yang ditemukan dalam sekumpulan gambar. Apakah data kategoris adalah fitur atau label, data tersebut harus dipetakan ke nilai numerik sehingga dapat digunakan untuk menghasilkan model pembelajaran mesin. Ada sejumlah cara bekerja dengan data kategoris dalam ML.NET, tergantung pada masalah yang Anda selesaikan.

Pemetaan nilai kunci

Dalam ML.NET, kunci adalah nilai bilangan bulat yang mewakili kategori. Pemetaan nilai kunci paling sering digunakan untuk memetakan label string ke dalam nilai bilangan bulat unik untuk pelatihan, lalu kembali ke nilai string mereka saat model digunakan untuk membuat prediksi.

Transformasi yang digunakan untuk melakukan pemetaan nilai kunci adalah MapValueToKey dan MapKeyToValue.

MapValueToKey menambahkan kamus pemetaan dalam model, sehingga MapKeyToValue dapat melakukan transformasi terbalik saat membuat prediksi.

Satu pengodean panas

Satu pengodean panas mengambil sekumpulan nilai terbatas dan memetakannya ke bilangan bulat yang representasi binernya memiliki nilai tunggal 1 dalam posisi unik dalam string. Satu pengodean panas dapat menjadi pilihan terbaik jika tidak ada urutan implisit dari data kategoris. Tabel berikut ini memperlihatkan contoh dengan kode pos sebagai nilai mentah.

Nilai mentah Satu nilai yang dikodekan panas
98052 00...01
98100 00...10
... ...
98109 10...00

Transformasi untuk mengonversi data kategoris ke angka yang dikodekan satu panas adalah OneHotEncoding.

Hashing

Hashing adalah cara lain untuk mengonversi data kategoris menjadi angka. Fungsi hash memetakan data dengan ukuran arbitrer (string teks misalnya) ke angka dengan rentang tetap. Hashing dapat menjadi cara yang cepat dan hemat ruang untuk vektorisasi fitur. Salah satu contoh hashing penting dalam pembelajaran mesin adalah pemfilteran spam email di mana, alih-alih mempertahankan kamus kata-kata yang diketahui, setiap kata dalam email di-hash dan ditambahkan ke vektor fitur besar. Menggunakan hashing dengan cara ini menghindari masalah lingkar pemfilteran spam berbahaya dengan penggunaan kata-kata yang tidak ada dalam kamus.

ML.NET menyediakan transformasi Hash untuk melakukan hash pada teks, tanggal, dan data numerik. Seperti pemetaan kunci nilai, output transformasi hash adalah jenis kunci.

Bekerja dengan data teks

Seperti data kategoris, data teks perlu diubah menjadi fitur numerik sebelum menggunakannya untuk membangun model pembelajaran mesin. Kunjungi halaman transformasi untuk daftar dan deskripsi transformasi teks yang lebih rinci.

Menggunakan data seperti data di bawah ini yang telah dimuat ke dalam IDataView:

ReviewData[] reviews = new ReviewData[]
{
    new ReviewData
    {
        Description="This is a good product",
        Rating=4.7f
    },
    new ReviewData
    {
        Description="This is a bad product",
        Rating=2.3f
    }
};

ML.NET menyediakan FeaturizeText transformasi yang mengambil nilai string teks dan membuat serangkaian fitur dari teks, dengan menerapkan serangkaian transformasi individual.

// Define text transform estimator
var textEstimator  = mlContext.Transforms.Text.FeaturizeText("Description");

// Fit data to estimator
// Fitting generates a transformer that applies the operations of defined by estimator
ITransformer textTransformer = textEstimator.Fit(data);

// Transform data
IDataView transformedData = textTransformer.Transform(data);

Transformasi yang dihasilkan mengonversi nilai teks dalam Description kolom menjadi vektor numerik yang terlihat mirip dengan output di bawah ini:

[ 0.2041241, 0.2041241, 0.2041241, 0.4082483, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0, 0, 0, 0, 0.4472136, 0.4472136, 0.4472136, 0.4472136, 0.4472136, 0 ]

Transformasi yang membentuk FeaturizeText juga dapat diterapkan secara individual untuk kontrol biji-bijian yang lebih halus atas pembuatan fitur.

// Define text transform estimator
var textEstimator = mlContext.Transforms.Text.NormalizeText("Description")
    .Append(mlContext.Transforms.Text.TokenizeIntoWords("Description"))
    .Append(mlContext.Transforms.Text.RemoveDefaultStopWords("Description"))
    .Append(mlContext.Transforms.Conversion.MapValueToKey("Description"))
    .Append(mlContext.Transforms.Text.ProduceNgrams("Description"))
    .Append(mlContext.Transforms.NormalizeLpNorm("Description"));

textEstimator berisi subset operasi yang dilakukan oleh FeaturizeText metode . Manfaat dari alur yang lebih kompleks adalah kontrol dan visibilitas atas transformasi yang diterapkan pada data.

Menggunakan entri pertama sebagai contoh, berikut ini adalah deskripsi terperinci tentang hasil yang dihasilkan oleh langkah-langkah transformasi yang ditentukan oleh textEstimator:

Teks Asli: Ini adalah produk yang baik

Transformasi Deskripsi Hasil
1. NormalizeText Mengonversi semua huruf menjadi huruf kecil secara default ini adalah produk yang baik
2. TokenizeWords Memisahkan string menjadi kata-kata individual ["this","is","a","good","product"]
3. RemoveDefaultStopWords Menghapus kata-kata berhenti seperti dan a. ["good","product"]
4. MapValueToKey Peta nilai ke kunci (kategori) berdasarkan data input [1,2]
5. ProduceNGrams Mengubah teks menjadi urutan kata berturut-turut [1,1,1,0,0]
6. NormalizeLpNorm Menskalakan input dengan lp-norm mereka [ 0.577350529, 0.577350529, 0.577350529, 0, 0 ]