Model oluşturmaya yönelik verileri hazırlama

ML .net kullanarak ek işleme veya bir model oluşturmaya yönelik verileri hazırlama hakkında bilgi edinin.

Veriler genellikle temiz ve seyrek yapılır. ML .net machine learning algoritmaları, giriş veya özelliklerin tek bir sayısal vektörde olmasını bekler. Benzer şekilde, tahmin edilecek değer (etiket), özellikle de kategorik veriler, kodlanmalıdır. bu nedenle, veri hazırlama amaçlarından biri, verileri ML .net algoritmalarından beklenen biçimde almak.

Verileri filtreleme

Bazen, bir veri kümesindeki tüm veriler Analize uygun değildir. İlgisiz verileri kaldırma yaklaşımı filtreleniyor. , DataOperationsCatalog IDataView Tüm verileri içeren ve yalnızca ilgilendiğiniz veri noktalarını Içeren bir ıdataview döndüren bir filtre işlemleri kümesi içerir. Filtre işlemleri bir IEstimator veya ITransformer gibi olmadığından TransformsCatalog , bir EstimatorChain veya veri hazırlama işlem hattının parçası olarak eklenemediğinden emin olmak önemlidir TransformerChain .

Aşağıdaki giriş verilerini alın ve adlı bir öğesine yükleyin IDataView data :

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

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

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

Yukarıdaki örnek, 200000 ile 1000000 arasında bir fiyata sahip veri kümesindeki satırları alır. Bu filtreyi uygulamanın sonucu yalnızca verilerdeki son iki satırı döndürür ve fiyatı 100000 olduğundan ve belirtilen Aralık arasında olmadığından ilk satırı dışlayacak.

Eksik değerleri Değiştir

Eksik değerler veri kümelerinde yaygın bir oluşumlardır. Eksik değerlerle ilgilenmeye yönelik bir yaklaşım, veri içindeki ortalama değer gibi herhangi bir veya başka bir anlamlı değer varsa, bunları verilen türün varsayılan değeriyle değiştirecektir.

Aşağıdaki giriş verilerini alın ve adlı bir öğesine yükleyin IDataView data :

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

Listemizdeki son öğenin için değeri eksik olduğuna dikkat edin Price . Sütundaki eksik değerleri değiştirmek için Price , ReplaceMissingValues Bu eksik değeri dolduracak yöntemi kullanın.

Önemli

ReplaceMissingValue yalnızca sayısal verilerle birlikte kullanılabilir.

// 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, Mean eksik değeri bu sütunun ortalama değeriyle dolduran değiştirme modunu kullanır. Değiştirme işleminin sonucu, Price 100.000 ve 300.000 ortalaması olduğundan, 200.000 ile verilerimizin son öğesi için özelliği doldurur.

Normalleyiciler kullanma

Normalleştirme , bir makine öğrenimi algoritması tarafından daha doğru işlenebilmeleri için, özellikleri genellikle 0 ile 1 arasında olacak şekilde ölçeklendirmek için kullanılan bir veri ön işleme tekniğidir. Örneğin, yaş ve gelir aralıkları genellikle, 0-100 ve gelirin genellikle sıfır-binlerce aralığında olması bakımından yaş açısından önemli ölçüde farklılık gösterir. Daha ayrıntılı bir liste ve normalleştirme dönüştürmelerini açıklaması için dönüşümler sayfasını ziyaret edin.

Min-Max normalleştirme

Aşağıdaki giriş verilerini alın ve adlı bir öğesine yükleyin IDataView data :

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

Normalleştirme, tek bir sayısal değere ve vektörlerine sahip sütunlara uygulanabilir. PriceYöntemi ile Min-Max normalleştirmesini kullanarak sütundaki 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] [ 1, 0.5 ] MinMax 0-1 aralığında çıkış değerleri üreten normalleştirme formülünü kullanarak dönüştürülür.

Gruplama

Binme , sürekli değerleri girişin ayrı bir gösterimine dönüştürür. Örneğin, özelliklerden birinin yaş olduğunu varsayalım. Bini gerçek yaş değerini kullanmak yerine, bu değer için aralıklar oluşturur. 0-18 bir bin olabilir, diğeri 19-35 olabilir ve bu şekilde devam eder.

Aşağıdaki giriş verilerini alın ve adlı bir öğesine yükleyin IDataView data :

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

Yöntemini kullanarak verileri depo gözlerine normalleştirin NormalizeBinning . maximumBinCountParametresi, verilerinizi sınıflandırmak için gereken bölme sayısını belirtmenize olanak sağlar. Bu örnekte, veriler iki bölme içine alınacaktır.

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

Binüş 'in sonucu, öğesinin bölme sınırlarını oluşturur [0,200000,Infinity] . Bu nedenle, [0,1,1] ilk gözlemin 0-200000 arasında ve diğerleri 200000 ' den daha büyük ancak sonsuz ' dan az olduğu için ortaya çıkan depo gözleri vardır.

Kategorik verilerle çalışma

En yaygın veri türlerinden biri kategorik verilerden biridir. Kategorik verilerin sınırlı sayıda kategorisi vardır. Örneğin, ABD 'nin durumları veya bir resim kümesinde bulunan hayvanlar türlerinin bir listesi. Kategorik verilerin özellikler ya da Etiketler olup olmadığı, bir makine öğrenimi modeli oluşturmak için kullanılabilmesi için bunların sayısal bir değerle eşlenmesi gerekir. ML .net 'te kategorik verilerle çalışmanın çeşitli yolları vardır ve bu sorun, çözmenize çalıştığınız soruna bağlıdır.

Anahtar değer eşleme

ML .net sürümünde, anahtar bir kategoriyi temsil eden bir tamsayı değeridir. Anahtar değeri eşleme, genellikle dize etiketlerini eğitimin benzersiz tamsayı değerleriyle eşlemek için kullanılır, ardından model bir tahmin yapmak için kullanıldığında dize değerlerine geri dönün.

Anahtar değer eşlemesini gerçekleştirmek için kullanılan dönüşümler Mapvaluetokey ve Mapkeytovalue' lardır.

MapValueToKey bir tahmine sahip MapKeyToValue olduğunuzda ters dönüştürmeyi gerçekleştirecek şekilde modeldeki eşlemelerin bir sözlüğünü ekler.

Tek bir etkin kodlama

Bir sıcak kodlama, sınırlı bir değer kümesi alır ve bunları ikili 1 temsilinin dizedeki benzersiz konumlarda tek bir değere sahip olan tamsayılara eşler. Kategorik verilerin örtük bir sıralaması yoksa, tek bir sık kullanılan kodlama en iyi seçim olabilir. Aşağıdaki tabloda, ham değerler olarak ZIP kodlarına sahip bir örnek gösterilmektedir.

Ham değer Sık kodlanmış bir değer
98052 00... 01
98100 00... 10
... ...
98109 10... 00

Kategorik verileri tek başına kodlanmış sayılara dönüştürmek için dönüşüm OneHotEncoding .

Karma

Karma oluşturma, kategorik verileri sayılara dönüştürmek için başka bir yoldur. Karma işlevi rastgele boyuttaki verileri (örneğin, metin dizesi) sabit bir aralığa göre bir sayıya eşler. Karma özellikleri, özelliklerin vektörleştirilmesi için hızlı ve verimli bir yol olabilir. Machine Learning 'de karma hale getirilmiş bir önemli örneği, bilinen sözcüklerin bir sözlüğünü tutmak yerine, e-postadaki her sözcüğün karma hale getirilmiş ve büyük bir özellik vektörüne eklendiği e-posta istenmeyen posta filtrelemedir. Bu şekilde karma kullanılması, sözlükte olmayan sözcüklerin kullanımı ile ilgili kötü amaçlı posta filtreleme sorunu yaşamasını önler.

ML .net, metin, tarih ve sayısal veriler üzerinde karma hale getirmek için karma dönüşüm sağlar. Değer anahtarı eşleme gibi, karma dönüştürmenin çıkışları anahtar türlerdir.

Metin verileriyle çalışma

Kategorik veriler gibi, metin verilerinin bir makine öğrenimi modeli oluşturmak için kullanılmadan önce sayısal özelliklere dönüştürülmesi gerekir. Daha ayrıntılı bir liste ve metin dönüştürmelerini açıklaması için dönüşümler sayfasını ziyaret edin.

Aşağıdaki verilere yüklenmiş veriler gibi verileri kullanarak 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, FeaturizeText metnin dize değerini alan ve bir dizi tekil dönüştürme uygulayarak metinden bir özellikler kümesi oluşturan dönüşümü sağlar.

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

Elde edilen dönüşüm, sütundaki metin değerlerini Description aşağıdaki çıkışa benzer bir sayısal vector öğesine 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 üretimi üzerinde daha ayrıntılı denetim için ayrı ayrı de 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 bir alt kümesini içerir FeaturizeText . Daha karmaşık bir işlem hattının avantajı, verilere uygulanan dönüşümlere göre denetim ve görünürlük sağlar.

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

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

Dönüşüm Açıklama Sonuç
1. NormalizeText Varsayılan olarak tüm harfleri 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", "dir", "a", "iyidir", "Product"]
3. Removedefaultstopkelimeleri ve gibi stopwords'leri kaldırır. ["good","product"]
4. MapValueToKey Haritalar giriş verilerine göre anahtarların (kategoriler) değerlerini seçin [1,2]
5. Üretilen Birimleri Metni ardışık sözcükler dizisine dönüştüren [1,1,1,0,0]
6. NormalizeLpNorm Girişleri lp-normlarına göre ölçeklendirme [ 0.577350529, 0.577350529, 0.577350529, 0, 0 ]