Model oluşturmak için verileri hazırlama

Verileri ek işlemeye veya model oluşturmaya hazırlamak için ML.NET kullanmayı öğrenin.

Veriler genellikle belirsiz ve seyrek olur. ML.NET makine öğrenmesi algoritmaları, girişin veya özelliklerin tek bir sayısal vektörde olmasını bekler. Benzer şekilde, özellikle kategorik veriler olduğunda tahmin edilecek değerin (etiket) kodlanması gerekir. Bu nedenle veri hazırlamanın hedeflerinden biri, verileri ML.NET algoritmalar tarafından beklenen biçime getirmektir.

Verileri eğitim ve test kümelerine bölme

Aşağıdaki bölümde, fazla uygunluk ve yetersiz uygunluk olarak bilinen bir modeli eğitirken karşılaşılan yaygın sorunlar özetlenmiştir. Verilerinizi bölmek ve modellerinizi bir tutulan küme kullanarak doğrulamak, bu sorunları belirlemenize ve azaltmanıza yardımcı olabilir.

Fazla uygunluk ve yetersiz uygunluk

Fazla uygunluk ve yetersiz uygunluk, modeli eğitirken karşılaştığınız en yaygın iki sorundandır. Yetersiz uygunluk, seçilen eğitmenin eğitim veri kümesine sığacak kapasitede olmadığı ve genellikle eğitim sırasında yüksek kayıp ve test veri kümesinde düşük puan/ölçüme neden olduğu anlamına gelir. Bu sorunu çözmek için daha güçlü bir model seçmeniz veya daha fazla özellik mühendisliği gerçekleştirmeniz gerekir. Fazla uygunluk tam tersidir ve model eğitim verilerini çok iyi öğrendiğinde gerçekleşir. Bu durum genellikle eğitim sırasında düşük kayıp ölçümüne ama test veri kümesinde yüksek kayıplara neden olur.

Bu kavramlar için iyi bir benzetme, bir sınav için çalışmaktır. Soruları ve yanıtları önceden bildiğini varsayalım. Ders çalıştıktan sonra sınava girip mükemmel bir puan alırsınız. Haberler harika! Ancak, soruların yeniden düzenlendiği ve biraz farklı ifadelerle tekrar sınava girildiğinde daha düşük bir puan alırsınız. Bu, yanıtları ezberlemenizi ve test ettiğiniz kavramları gerçekten öğrenmemenizi önerir. Bu, fazla uygunluk örneğidir. Yetersiz uygunluk, size verilen çalışma malzemelerinin sınav için değerlendirildiğiniz şeyi doğru şekilde temsil etmediğinden tam tersidir. Sonuç olarak, doğru yanıt vermek için yeterli bilgiye sahip olmadığınız için yanıtları tahmin etmeye başvurursunuz.

Verileri bölme

Aşağıdaki giriş verilerini alın ve adlı databir IDataView içine yükleyin:

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
    }
};

Verileri eğitmek/test kümelerine bölmek için yöntemini kullanın TrainTestSplit(IDataView, Double, String, Nullable<Int32>) .

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

testFraction parametresi test için veri kümesinin %0,2 veya %20'sini almak için kullanılır. Kalan %80 eğitim için kullanılır.

Sonuç, DataOperationsCatalog.TrainTestData ve TestSetaracılığıyla TrainSet erişebileceğiniz iki IDataView ile elde edilir.

Veri filtreleme

Bazen, bir veri kümesindeki tüm veriler analiz için uygun değildir. Ilgisiz verileri kaldırmaya yönelik bir yaklaşım filtrelemedir. , DataOperationsCatalog tüm verileri içeren bir IDataView dizi filtre işlemi içerir ve yalnızca ilgilendiğiniz veri noktalarını içeren bir IDataView döndürür. Filtre işlemlerinin içinde TransformsCatalogyer alan veya IEstimator benzeri olmadığından, bir veya ITransformerTransformerChain veri hazırlama işlem hattının parçası olarak eklenemeyeceklerini EstimatorChain unutmayın.

Aşağıdaki giriş verilerini alın ve adlı databir IDataView içine yükleyin:

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

Verileri bir sütunun değerine göre filtrelemek için yöntemini kullanın FilterRowsByColumn .

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

Yukarıdaki örnek, 200000 ile 1000000 arasında bir fiyatla veri kümesindeki satırları alır. Bu filtrenin uygulanması sonucunda yalnızca verilerdeki son iki satır döndürülür ve fiyatı belirtilen aralık arasında değil 100000 olduğundan ilk satırı dışlar.

Eksik değerleri değiştirme

Eksik değerler, veri kümelerinde sık karşılaşılan bir durumdur. Eksik değerlerle ilgilenmeye yönelik yaklaşımlardan biri, verilerdeki ortalama değer gibi anlamlı bir değer veya varsa bunları verilen tür için varsayılan değerle değiştirmektir.

Aşağıdaki giriş verilerini alın ve adlı databir IDataView içine yükleyin:

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

Listemizdeki son öğenin için Priceeksik bir değere sahip olduğuna dikkat edin. Sütundaki Price eksik değerleri değiştirmek için yöntemini kullanarak ReplaceMissingValues bu eksik değeri doldurun.

Önemli

ReplaceMissingValue yalnızca sayısal verilerle çalışır.

// 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 çeşitli değiştirme modlarını destekler. Yukarıdaki örnek, eksik değeri bu sütunun ortalama değeriyle dolduran değiştirme modunu kullanır Mean . Değiştirme sonucu, verilerimizdeki son öğenin özelliğini 100.000 ve 300.000 ortalaması olduğundan 200.000 ile doldurur Price .

Normalleştiricileri kullanma

Normalleştirme , bir makine öğrenmesi algoritması tarafından daha doğru işlenebilmeleri için özellikleri aynı aralıkta (genellikle 0 ile 1 arasında) ölçeklendirmek için kullanılan bir veri ön işleme tekniğidir. Örneğin yaş ve gelir aralıkları, yaş genel olarak 0-100 aralığında, gelir ise genellikle sıfır ile bin aralığında olmak üzere önemli ölçüde farklılık gösterir. Normalleştirme dönüşümlerinin daha ayrıntılı bir listesi ve açıklaması için dönüşümler sayfasını ziyaret edin.

Min-Max normalleştirme

Aşağıdaki giriş verilerini alın ve adlı databir IDataView içine yükleyin:

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

Normalleştirme, vektörlerin yanı sıra tek sayısal değerlere sahip sütunlara da uygulanabilir. yöntemiyle min-max normalleştirmesini kullanarak sütundaki Price verileri normalleştirin NormalizeMinMax .

// 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);

Özgün fiyat değerleri[200000,100000], 0-1 aralığında çıkış değerleri oluşturan normalleştirme formülü kullanılarak MinMax dönüştürülür[ 1, 0.5 ].

Binn

Bölme, sürekli değerleri girişin ayrık bir gösterimine dönüştürür. Örneğin, özelliklerinizden birinin yaş olduğunu varsayalım. Gruplandırma, gerçek yaş değerini kullanmak yerine bu değer için aralıklar oluşturur. 0-18 bir bölme, diğeri 19-35 ve benzeri olabilir.

Aşağıdaki giriş verilerini alın ve adlı databir IDataView içine yükleyin:

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

yöntemini kullanarak verileri bölmeler halinde normalleştirin NormalizeBinning . maximumBinCount parametresi, verilerinizi sınıflandırmak için gereken bölme sayısını belirtmenizi sağlar. Bu örnekte veriler iki bölmeye yerleştirilecektir.

// 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);

Gruplamanın sonucu, öğesinin [0,200000,Infinity]bin sınırlarını oluşturur. Bu nedenle sonuçta elde edilen bölmelerin [0,1,1] nedeni, ilk gözlemin 0-200000 arasında olması ve diğerlerinin 200000'den büyük ancak sonsuzdan küçük olmasıdır.

Kategorik verilerle çalışma

En yaygın veri türlerinden biri kategorik verilerdir. Kategorik verilerin sınırlı sayıda kategorisi vardır. Örneğin, ABD durumları veya bir dizi resimde bulunan hayvan türlerinin listesi. Kategorik verilerin özellikler veya etiketler olması fark etmeksizin, makine öğrenmesi modeli oluşturmak için kullanılabilmesi için bunların sayısal bir değere eşlenmesi gerekir. Çözdüğün soruna bağlı olarak, ML.NET kategorik verilerle çalışmanın çeşitli yolları vardır.

Anahtar değeri eşleme

ML.NET anahtar, kategoriyi temsil eden bir tamsayı değeridir. Anahtar değer eşlemesi çoğunlukla dize etiketlerini eğitim için benzersiz tamsayı değerlerine eşlemek için kullanılır ve model tahminde bulunmak için kullanıldığında dize değerlerine geri döner.

Anahtar değer eşlemesi gerçekleştirmek için kullanılan dönüşümler MapValueToKey ve MapKeyToValue'dır.

MapValueToKey modele eşlemeler sözlüğü ekler, böylece MapKeyToValue tahmin yaparken ters dönüşümü gerçekleştirebilir.

Bir sık erişimli kodlama

Sık erişimli kodlama, sonlu bir değer kümesi alır ve bunları, ikili gösterimi dizedeki benzersiz konumlarda tek 1 bir değere sahip olan tamsayılarla eşler. Kategorik verilerin örtük sıralaması yoksa, en iyi seçenek bir etkin kodlama olabilir. Aşağıdaki tabloda, ham değerler olarak posta kodları içeren bir örnek gösterilmektedir.

Ham değer Çalışırken kodlanmış bir değer
Kategori 98052 00...01
98100 00...10
... ...
98109 10...00

Kategorik verileri tek sık kodlanmış sayılara dönüştürme dönüştürme işlemidir OneHotEncoding.

Karma

Karma, kategorik verileri sayılara dönüştürmenin başka bir yoludur. Karma işlevi, rastgele boyuttaki (örneğin metin dizesi) verileri sabit aralıklı bir sayıya eşler. Karma oluşturma, özellikleri vektörleştirmenin hızlı ve alan açısından verimli bir yolu olabilir. Makine öğrenmesinde karma oluşturmanın önemli örneklerinden biri, e-posta istenmeyen posta filtrelemedir. Burada, bilinen sözcüklerden oluşan bir sözlüğü korumak yerine e-postadaki her sözcük karma olarak eklenir ve büyük bir özellik vektöre eklenir. Karmayı bu şekilde kullanmak, sözlükte olmayan sözcüklerin kullanılmasıyla kötü amaçlı istenmeyen posta filtreleme atlatma sorununu önler.

ML.NET metin, tarih ve sayısal veriler üzerinde karma oluşturma gerçekleştirmek için Karma dönüştürme sağlar. Değer anahtarı eşlemesi gibi karma dönüştürmenin çıkışları da anahtar türleridir.

Metin verileriyle çalışma

Kategorik veriler gibi metin verilerinin de makine öğrenmesi modeli oluşturmak için kullanmadan önce sayısal özelliklere dönüştürülmesi gerekir. Metin dönüşümlerinin daha ayrıntılı bir listesi ve açıklaması için dönüşümler sayfasını ziyaret edin.

aşağıdaki gibi bir IDataViewiçine yüklenen verileri kullanma:

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, tek tek bir dönüşüm serisi uygulayarak bir metnin dize değerini alan ve metinden bir dizi özellik oluşturan dönüşümü sağlar FeaturizeText .

// 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);

Sonuçta elde edilen dönüştürme, sütundaki Description metin değerlerini aşağıdaki çıkışa benzer bir sayısal vektöre dönüştürür:

[ 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 ]

Oluşturan dönüşümler FeaturizeText , özellik oluşturma üzerinde daha ayrıntılı denetim için ayrı ayrı da uygulanabilir.

// 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 yöntemi tarafından gerçekleştirilen işlemlerin FeaturizeText bir alt kümesini içerir. Daha karmaşık bir işlem hattının avantajı, verilere uygulanan dönüştürmelerin denetimi ve görünürlüğüdür.

Örnek olarak ilk girdiyi kullanarak, aşağıda tarafından textEstimatortanımlanan dönüştürme adımları tarafından oluşturulan sonuçların ayrıntılı bir açıklaması verilmiştir:

Özgün Metin: Bu iyi bir üründür

Dönüşüm Açıklama Sonuç
1. NormalizeText Tüm harfleri varsayılan olarak küçük harfe dönüştürür bu iyi bir üründür
2. TokenizeWords Dizeyi tek tek sözcüklere böler ["this","is","a","good","product"]
3. RemoveDefaultStopWords vegibi durdurma sözcüklerini kaldırır. ["good","product"]
4. MapValueToKey Giriş verilerine göre anahtarlara (kategoriler) değerleri Haritalar [1,2]
5. ProduceNGrams Metni ardışık sözcükler dizisine dönüştürür [1,1,1,0,0]
6. NormalizeLpNorm Girişleri lp normlarına göre ölçeklendirme [ 0.577350529, 0.577350529, 0.577350529, 0, 0 ]