/ Makine Öğrenmesine Giriş /
Spark MLlib'i derinlemesine tanıtmadan önce makine öğrenimini anlayın. Wikipedia'ya göre makine öğrenimi aşağıdaki tanımlara sahiptir:
* Kalın anahtar noktadır / Kalın anahtar noktadır / Kalın anahtar noktadır
Aslında, "Meitu Veri Teknik Ekibi" nden önceki popüler bilim makalesi Bayes olasılık modellerinin listesi Makine öğreniminin dar anlamda istatistiksel makine öğrenimi anlamına geldiği ortaya çıkmıştır.İstatistiksel öğrenme, görev türlerine göre denetimli öğrenme, yarı denetimli öğrenme, denetimsiz öğrenme ve gelişmiş öğrenme olarak ikiye ayrılabilir.
Makine öğreniminde yaygın olarak kullanılan algoritmalar aşağıdaki kategorilere ayrılabilir:
1. Yapısal aralık teorisi dağılımı: Yapay sinir ağı, karar ağacı, algılayıcı, destek vektör makinesi, entegre öğrenme AdaBoost, boyutluluk azaltma ve metrik öğrenme, kümeleme, Bayes sınıflandırıcı;
2. Koşullu olasılık oluşturun: Gauss süreci regresyonu, doğrusal diskriminant analizi, en yakın komşu yöntemi, radyal temel fonksiyon çekirdeği;
3. Yenileme modeli aracılığıyla olasılık yoğunluk işlevini oluşturun: Maksimum beklenti algoritması, olasılık grafiği modeli (Bayes ağı ve Markov rasgele alanı), Üretken Topografik Haritalama;
4. Yaklaşık çıkarım teknolojisi: Markov zinciri, Monte Carlo yöntemi, varyasyon yöntemi;
5. Optimizasyon algoritması.
/ Spark MLlib /
Yukarıda, makine öğreniminin kilit noktalarından birinin "deneyim" olduğunu belirtmiştik. Bilgisayarlar için, deneyimin genellikle birden fazla yinelemeli hesaplama turu yoluyla elde edilmesi gerekir. Spark, makine öğreniminin özelliklerine uyan yinelemeli hesaplamalarda iyidir. Spark ve Hadoop üzerindeki lojistik regresyon algoritmalarının performans karşılaştırması Spark resmi web sitesinde gösterilmektedir.Aşağıdaki şekilden MLlib'in MapReduce'tan 100 kat daha hızlı olduğunu görebiliriz.
Spark MLlib esas olarak aşağıdaki hususları içerir:
Yukarıdaki tablo Spark MLlib tarafından desteklenen fonksiyonel yapıyı özetlemektedir.Sağladığı algoritmaların zengin olduğu ancak algoritma türlerinin daha az ve eski olduğu görülmektedir.Bu nedenle Spark MLlib'in algoritma desteği kylin projesi ile bir nebze temas dışıdır.Ana fonksiyonları daha fazladır. Özelliklerle ilgili.
ML Boru Hatları
Spark 2.0'dan başlayarak, RDD tabanlı API'ler bakım moduna girmiştir. Spark'ın ana makine öğrenimi API'si artık Scikit-Learn'ün tasarımından ödünç alan ve makine öğrenimi iş akışları oluşturmak için bir Pipeline paketi sağlayan DataFrame API spark.ml'yi temel almaktadır. ML Pipelines, kullanıcıların pratik makine öğrenimi süreçleri oluşturmasına ve ayarlamasına yardımcı olabilecek, DataFrame'e dayalı birleşik bir üst düzey API kümesi sağlar.
* "Spark ML" resmi bir ad değildir ve zaman zaman MLlib DataFrame'e dayalı API'lere atıfta bulunmak için kullanılır
Öncelikle ML Pipelines'daki birkaç önemli bileşeni anlayın.
Veri çerçevesi
DataFrame, Spark'a büyük ölçekli yapılandırılmış verileri işleme yeteneği sağlar.
RDD, dağıtılmış Java nesnelerinin bir koleksiyonudur ve nesnelerin dahili veri yapısı RDD tarafından bilinmemektedir. DataFrame, RDD'ye dayalı dağıtılmış bir veri kümesidir. Satır nesneleri RDD'de depolanır. Satır nesneleri ayrıntılı yapısal bilgiler, yani DataFrame'i yapılandırılmış verileri yapabilen şema sağlar.
Dönüşüm
Transformer genellikle bir veri / özellik dönüştürme sınıfı veya eğitimli bir modeldir.
Her Transformer, bir DataFrame'i başka bir DataFrame'e dönüştürmek için kullanılan bir dönüştürme işlevine sahiptir. Genel dönüştürme işlemi, DataFrame girişine bir veya daha fazla sütun eklemektir. Transformer.transform ayrıca tembel olarak yürütülür. Yalnızca yeni DataFrame değişkenleri oluşturur ve DataFrame içeriğini hesaplamak için işi göndermez.
Tahmincisi
Tahminci, giriş verilerinden bir model öğrenme sürecini özetler.Her Tahminci, uygun yöntemini uygular.Belirli bir Veri Çerçevesi ve Parametrelerden sonra, bir Transformatör (yani eğitilmiş bir model) oluşturulur. Estimator.fit () her çağrıldığında, Modeli eğitmek ve model parametrelerini almak için işler oluşturulacaktır.
Param
Transformer veya Estimator örneğinin parametrelerini ayarlayarak model parametrelerini ayarlayabilir veya bir ParamMap nesnesi geçirerek model parametrelerini ayarlayabilirsiniz.
Boru hattı
Pipeline, bir dizi veri işleme prosedürünü tanımlar, Pipeline'a Transformer, Estimator veya başka bir Pipeline ekleyebilirsiniz. Pipeline, Estimator'dan miras alır. Pipeline.fit yöntemini çağırdıktan sonra, bir Transformer PipelineModel; PipelineModel, son çıktıyı elde etmek için her bir Pipeline Transformer'ı aracılığıyla girişi dönüştürmek için kullanılan Transformer'dan miras alır.
Spark MLlib'in tipik süreci aşağıdaki gibidir:
Bir Ardışık Düzen metin sınıflandırması örneği aracılığıyla anlayışınızı derinleştirin:
org.apache.spark.ml dosyasını içe aktarın. {Pipeline, PipelineModel} import org.apache.spark.ml.classification.LogisticRegression org.apache.spark.ml.feature. {HashingTF, Tokenizer} içe aktarın org.apache.spark.ml.linalg.Vector'ı içe aktar org.apache.spark.sql.Row'u içe aktar // (id, metin, etiket) demetlerinden oluşan bir listeden eğitim belgeleri hazırlayın. val eğitimi = spark.createDataFrame (Seq ( (0L, "a b c d e spark", 1.0), (1 L, "b d", 0,0), (2L, "kıvılcım f g h", 1.0), (3L, "hadoop mapreduce", 0.0) )). toDF ("id", "metin", "etiket") // Üç aşamadan oluşan bir ML ardışık düzeni yapılandırın: jetonlaştırıcı, karmaTF ve lr. val tokenizer = new Tokenizer () .setInputCol ("metin") .setOutputCol ("kelimeler") val hashingTF = new HashingTF () .setNumFeatures (1000) .setInputCol (tokenizer.getOutputCol) .setOutputCol ("özellikler") val lr = new LogisticRegression () .setMaxIter (10) .setRegParam (0,001) val boru hattı = yeni Boru Hattı () .setStages (Array (tokenizer, hashingTF, lr)) // İşlem hattını eğitim belgelerine uydurun. val model = pipeline.fit (eğitim) // Artık isteğe bağlı olarak takılan boru hattını diske kaydedebiliriz model.write.overwrite (). save ("/ tmp / spark-logistic-regression-model") // Bu uygun olmayan ardışık düzeni diske de kaydedebiliriz pipeline.write.overwrite (). save ("/ tmp / unfit-lr-model") // Ve üretim sırasında geri yükleyin val sameModel = PipelineModel.load ("/ tmp / spark-logistic-regression-model") // Etiketsiz (id, metin) demetler olan test dokümanları hazırlayın. val testi = spark.createDataFrame (Seq ( (4L, "kıvılcım i j k"), (5L, "l m n"), (6L, "kıvılcım hadoop kıvılcımı"), (7L, "apache hadoop") )). toDF ("id", "metin") // Test belgeleri üzerinde tahminlerde bulunun. model.transform (test) .select ("id", "metin", "olasılık", "tahmin") .toplamak() .foreach {case Row (id: Long, text: String, prob: Vector, tahmin: Double) = > println (s "($ id, $ metin) - > prob = $ prob, tahmin = $ tahmin ") }Model seçimi ve ayarlama
Spark MLlib, CrossValidator ve TrainValidationSplit olmak üzere iki model seçimi ve parametre ayarlama aracı sağlar. Model seçimi ve ayarlamasının üç temel bileşeni Tahminci, ParamGrid ve Değerlendiricidir. Tahmin Aracı bir algoritma veya Boru Hattı içerir; ParamGrid, bir parametre arama alanı sağlayan bir ParamMap koleksiyonudur; Değerlendirici bir değerlendirme dizinidir.
CrossValidator
https://github.com/JerryLead/blogs/blob/master/BigDataSystems/Spark/ML/Introduction%20to%20MLlib%20Pipeline.md aracılığıyla
CrossValidator, veri setini çapraz doğrulama numarasına göre n parçaya böler, her seferinde n-1 parça eğitim seti olarak kullanılır ve geri kalanı test seti olarak kullanılır. Modeli eğitin ve değerlendirin, n kez tekrarlayın, n değerlendirme sonucunu alın ve n kez ortalamasını bulun Değer, bu çapraz doğrulamanın sonucu olarak kullanılır. Ardından, her aday ParamMap için yukarıdaki işlemi tekrarlayın, optimum ParamMap'i seçin ve optimum parametrelerin model çıktısını elde etmek için modeli yeniden eğitin.
?Örneğin:
// Aramak için bir parametre ızgarası oluşturmak için bir ParamGridBuilder kullanıyoruz. // hashingTF.numFeatures için 3 değer ve lr.regParam için 2 değerle, // bu ızgara, CrossValidator'ın seçim yapabileceği 3 x 2 = 6 parametre ayarına sahip olacaktır. val paramGrid = new ParamGridBuilder () .addGrid (hashingTF.numFeatures, Array (10, 100, 1000)) .addGrid (lr.regParam, Array (0.1, 0.01)) .inşa etmek() // Artık Ardışık Düzeni bir Tahminci olarak ele alıyoruz ve onu bir CrossValidator örneğine sarıyoruz. // Bu, tüm Boru Hattı aşamaları için birlikte parametreleri seçmemize izin verecektir. // Bir CrossValidator, bir Tahminciye, bir Tahminci ParamMap setine ve bir Değerlendiriciye ihtiyaç duyar. // Buradaki değerlendiricinin bir BinaryClassificationEvaluator olduğunu ve onun varsayılan metriğini unutmayın // fieldUnderROC. val cv = new CrossValidator () .setEstimator (boru hattı) .setEvaluator (yeni BinaryClassificationEvaluator) .setEstimatorParamMaps (paramGrid) .setNumFolds (2) // Pratikte 3+ kullanın .setParallelism (2) // 2 parametre ayarını paralel olarak değerlendirin // Çapraz doğrulamayı çalıştırın ve en iyi parametre kümesini seçin. val cvModel = cv.fit (eğitim) // Etiketsiz (id, metin) demetler olan test dokümanları hazırlayın. val testi = spark.createDataFrame (Seq ( (4L, "kıvılcım i j k"), (5L, "l m n"), (6L, "kıvılcımı azalt"), (7L, "apache hadoop") )). toDF ("id", "metin") // Test belgeleri üzerinde tahminler yapın. CvModel, bulunan en iyi modeli kullanır (lrModel). cvModel.transform (test) .select ("id", "metin", "olasılık", "tahmin") .toplamak() .foreach {case Row (id: Long, text: String, prob: Vector, tahmin: Double) = > println (s "($ id, $ metin) - > prob = $ prob, tahmin = $ tahmin ") }TrenValidationSplit
TrainValidationSplit, eğitim setini oranlara göre eğitim ve doğrulama setlerine ayırmak için trainRatio parametresini kullanır. TrainRatio oranının örnekleri eğitim için kullanılır ve kalan örnekler doğrulama için kullanılır.
CrossValidator'dan farklı olarak TrainValidationSplit, n 2 olduğunda CrossValidator'ın özel bir sürümü olarak kabul edilebilecek tek bir doğrulama sürecine sahiptir.
?Örneğin:
import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.regression.LinearRegression import org.apache.spark.ml.tuning. {ParamGridBuilder, TrainValidationSplit} // Eğitim ve test verilerini hazırlayın. val data = spark.read.format ("libsvm"). load ("data / mllib / sample_linear_regression_data.txt") val Dizi (eğitim, test) = data.randomSplit (Array (0.9, 0.1), seed = 12345) val lr = new LinearRegression () .setMaxIter (10) // Aramak için bir parametre ızgarası oluşturmak için bir ParamGridBuilder kullanıyoruz. // TrainValidationSplit, tüm değer kombinasyonlarını deneyecek ve en iyi modeli belirleyecektir. // değerlendirici. val paramGrid = new ParamGridBuilder () .addGrid (lr.regParam, Array (0.1, 0.01)) .addGrid (lr.fitIntercept) .addGrid (lr.elasticNetParam, Array (0.0, 0.5, 1.0)) .inşa etmek() // Bu durumda tahminci basitçe doğrusal regresyondur. // Bir TrainValidationSplit, bir Tahminciye, bir Tahminci ParamMap kümesine ve bir Değerlendiriciye ihtiyaç duyar. val trainValidationSplit = new TrainValidationSplit () .setEstimator (lr) .setEvaluator (yeni RegressionEvaluator) .setEstimatorParamMaps (paramGrid) // Verinin% 80'i eğitim için ve kalan% 20'si doğrulama için kullanılacak. .setTrainRatio (0.8) // 2 parametre ayarını paralel olarak değerlendirin .setParallelism (2) // Tren doğrulama bölmesini çalıştırın ve en iyi parametre kümesini seçin. val model = trainValidationSplit.fit (eğitim) // Test verileriyle ilgili tahminler yapın. Model, parametrelerin kombinasyonuna sahip modeldir // en iyi performans gösteren. model.transform (test) .select ("özellikler", "etiket", "tahmin") .göstermek()Özel bir Transformer uygulayın
Transformer sınıfından devralın ve genellikle DataFrame girişine bir veya daha fazla sütun ekleyerek dönüştürme yöntemini uygulayın.
Tek bir giriş sütunu için, tek bir çıktı sütununa sahip bir Transformer, UnaryTransformer sınıfından miras alabilir ve giriş sütununun her satırını işlemek ve karşılık gelen çıktıyı döndürmek için createTransformFunc yöntemini bu sınıfta uygulayabilir.
/ Kendi geliştirdiği makine öğrenimi çerçevesi /
Makine öğrenimi teknolojisi günden güne değişiyor, ancak yeni teknolojilerin araştırma maliyetini düşürmek için verimli ve esnek çerçeveler eksikliği var. Deneyim ve teknolojinin genellikle çerçeveler ve araçlar aracılığıyla biriktirilmesi gerekir ve algoritma personeli genellikle bilgi işlem gücü ile sınırlandırılır ve bu da çevrimdışı olarak kanıtlanmış etkili modellere yol açar. Tahmini zaman karmaşıklığı çevrimiçi olamayacak kadar yüksek.
Buna dayanarak Meitu veri teknik ekibi, "basit ve esnek bir makine öğrenimi iş akışı geliştirme, algoritma personeli için yeni algoritma araştırmasının maliyetini ve mühendislik personelinin bakım maliyetini düşürme ve alanda deneyim biriktirmek için ortak çözümler sağlama" hedefini oluşturdu. Özellikle öneri algoritması ile ilgili görevlerde karşılaşılan sorunları çözmek için yukarıdaki problemleri çözmek için özel bir makine öğrenimi çerçevesi kullanılır. Çerçeve toplamda 3 bileşen içerir: Spark Feature, Bamboo ve Online Scorer.
Spark Özelliği: Eğitim örneği üretimi
Bu bileşen esas olarak eğitim örneklerinin üretimi için kullanılır ve esnek ve verimli örnek özellik kodlamasını gerçekleştirir.Aynı alanda rastgele özellik kümelerinin kodlamasını gerçekleştirebilir ve farklı özellik kümeleri kodlama alanını paylaşır; bunun için iki kavram öneriyoruz: Biri, aynı modelleme sürecini paylaşan bir dizi özelliği tanımlamak için kullanılan "alan", ikincisi ise aynı kodlama alanını paylaşan bir dizi alanı tanımlamak için kullanılan "alan" tır.
Yukarıdaki örnekte "Eski", "alan" ve "boşluk" kavramları olmadan örnek özellik kodunu gösterir, tüm özellikler 1'den başlayarak numaralandırılır; "Yeni" ise sırasıyla yaş ve cinsiyet alanlarına yerleştirildiğini gösterir. Bundan sonra, iki alan sırasıyla 1'den kodlanır ve birbirini etkilemez.
Spark Feature sonunda eğitim örneklerinin depolama formatı olarak TFRecords'u kullanır.
Bamboo: Model tanımı ve eğitimi
Bu bileşenin temel amacı, ölçeklenebilir, verimli, basit ve hızlı model tanımlama ve eğitim uygulamaktır. Bu nedenle Bamboo'ı tasarlarken aşağıdaki ilkeleri takip ettik:
1. Katmanlar tensör yoluyla etkileşir, katmanın girişi tensördür ve çıktı da tensördür;
2. Çevrimdışı ve çevrimiçi verimliliği en üst düzeye çıkarmak için, keras gibi pek çok gelişmiş API kullanılmaz. Çoğu model ve bileşen Tensorflow'un temel API'sine göre geliştirilir ve kod, Tensorflow'un resmi performans optimizasyon kılavuzuna göre optimize edilir;
3. Karmaşık hesaplamaların çevrimdışı olarak yerleştirildiği ve yalnızca hafif hesaplamaların çevrimiçi olarak gerçekleştirildiği bir çevrimiçi-çevrimdışı modelleme çerçevesi sağlar ve karmaşık modellerin çevrimiçi olmasını kolaylaştırır;
4. Veri yüklemeyi, model eğitimini ve dışa aktarımı kapsüller ve çeşitli yardımcı araçlar sağlar.Kullanıcıların yalnızca ileri çıkarım ağını tanımlamaları gerekirken, çok sayıda yaygın olarak kullanılan katmanı kapsülleyerek model tanımını hızlandırır.
Çevrimiçi golcü: çevrimiçi tahmin hizmeti
Online Scorer'ın amacı, tensorflow, pytorch ve xgboost gibi çeşitli ana akım modelleme çerçevelerinden türetilen modelleri aynı anda destekleyebilen birleşik ve verimli bir çevrimiçi muhakeme hizmeti sağlamaktır. Şu anda, bu çalışma halen devam etmektedir ve özel uygulama ayrıntıları aşağıdaki özel makalelerde tanıtılacaktır.
Orijinal metin WeChat Resmi Hesabı-Meitu Veri Teknik Ekibi'nde yayınlandı (gh_feb1d206d92b)