Yazar: Jason Brownlee
Çeviri: Chen Chao
Düzeltme: Feng Yu
Bu makale hakkında 3500 kelime , Okumanız tavsiye edilir 10+ dakika
Bu makale, dengesizlik sınıflandırmasında maliyete duyarlı karar ağacı algoritmasını tanıtmaktadır.
Karar ağacı algoritması dengeli sınıflandırma için etkilidir, ancak dengesiz veri setlerinde iyi performans göstermez.
Karar ağacı bölünme noktası, tüm örnekleri minimum kafa karışıklığı ile iki gruba ayırabilmektir. İki gruba sırasıyla kategorilerden birinin örnekleri hakim olduğunda, bölünme noktası ayarını seçmek için kullanılan kriterler mantıklıdır.Aslında, azınlık kategorisindeki örnekler göz ardı edilecektir.
Bu sorun, bölünmüş noktaları değerlendirme kriterlerini değiştirerek ve genellikle ağırlıklı bölme noktaları veya ağırlıklı karar ağaçlarına atıfta bulunan her kategorinin önemi dikkate alınarak çözülebilir.
Bu kılavuzda, dengesiz sınıflandırma için ağırlıklı karar ağaçları göreceksiniz.
Bu kılavuzu tamamladıktan sonra şunları öğreneceksiniz:
SMOTE algoritması, tek kategorili sınıflandırma, maliyete duyarlı öğrenme, eşik kayması ve daha fazlası, lütfen 30 adım adım öğretici ve eksiksiz Python kaynak kodunu içeren yeni kitabımda arama yapın.
Yeni kitap bağlantısı:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/
Tamam, başlayalım.
Dengesizlik sınıflandırması için ağırlıklı karar ağacı nasıl yapılır
Fotoğraf, Bonnie Moreland, bazı hakları saklıdır.
Kılavuza genel bakış
Bu kılavuz dört bölüme ayrılmıştır, bunlar:
1. Dengesiz sınıflandırma veri seti
İki, dengesiz sınıflandırma karar ağacı
Üç, Scikit-Learn'de ağırlıklı karar ağacı kullanın
4. Ağırlıklı karar ağacının ızgara araması
Dengesizlik sınıflandırmasının karar düzeltmesine dalmadan önce, bir dengesizlik veri seti tanımlayalım.
Kullanabiliriz make_classification () işlevi Sentetik, dengesiz iki kategorili bir sınıflandırma veri seti tanımlamak için. Azınlık sınıfının çoğunluk sınıfına oranının 1: 100 olduğu 10.000 örnek oluşturacağız.
make_classification () işlevi:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/
... # veri kümesini tanımlayınX, y = sınıflandırma yap (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters_per_class = 1, weight =, flip_y = 0, random_state = 3)Oluşturulduktan sonra, oluşturulan veri setinin beklediğimiz gibi olduğunu doğrulamak için sınıfların dağılımını özetleyebiliriz.
... # özet sınıf dağılım sayacı = Sayaç (y) baskı (sayaç)Son olarak, bu veri kümesindeki örnek sınıflandırmasının karşılaştığı zorlukları anlamamıza yardımcı olmak için örneklerin dağılım grafiğini oluşturabilir ve bunları sınıf etiketlerine göre renklendirebiliriz.
... # etiket için sınıfa göre örneklerin dağılım grafiği, _ counter.items (): row_ix = burada (y == etiket) pyplot.scatter (X, X, etiket = str (etiket)) pyplot.legend () pyplot.show ()Sentetik veri kümelerinin ve çizim örneklerinin eksiksiz örneklerini oluşturmak için bu kodları bir araya getirin.
# Koleksiyonlardan sentetik dengesiz bir sınıflandırma veri kümesi oluşturun ve grafiğini içe aktarın Sklearn.datasets'den gelen sayaç, matplotlib'den içe_geri_ sınıflandırma içe aktarma, numpy içe aktarımdan # tanımlı veri kümesiX, y = yapma_ sınıflandırma (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters, weper_ flip_y = 0, random_state = 3) # özet sınıf dağılım sayacı = Sayaç (y) baskı (sayaç) # etiket için sınıf etiketine göre örnek dağılım grafiği, sayaç.items () içinde _: row_ix = burada (y == etiket) pyplot. scatter (X, X, label = str (etiket)) pyplot.legend () pyplot.show ()Bu örneği çalıştırmak önce bir veri kümesi oluşturacak ve ardından sınıfların dağılımını özetleyecektir.
Bu veri kümesinin dağılımının 1: 100'e yakın olduğunu görebiliriz. Çoğunluk sınıfında 10.000'den biraz daha az örnek ve azınlık sınıfında 100 örnek vardır.
Sayaç ({0: 9900, 1: 100})Daha sonra, sınıfın bazı çakışan değerleri ile çoğunluk sınıfının (mavi) çok sayıda örneğini ve azınlık sınıfının (turuncu) az sayıda örneğini gösteren veri kümesinin bir dağılım grafiği vardır.
Dengesizlik ile iki kategorili veri kümesinin 1: 100 dağılım grafiği
Ardından, bu veri setine standart bir karar ağacı modeli sığdırabiliriz. Karar ağacı scikit-learn araç setini kullanabilir Karar ağacı sınıflandırıcı oluşturmak.
Karar ağacı sınıflandırıcı:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/
... # define modelmodel = DecisionTreeClassifier ()Bu modeli değerlendirmek için tekrarlanan çapraz doğrulama kullanacağız, toplamda üç tekrarlı 10 katmanlı çapraz doğrulama . Modelin performansı, tüm tekrarlarda eğrinin altındaki ROC alanı (ROC AUC) ve tüm katmanların ortalaması ile elde edilecektir.
10 katmanlı çapraz doğrulama:
https://machinelearningmastery.com/k-fold-cross-validation/
... # değerlendirme prosedürünü tanımlayıncv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # model puanlarını değerlendirin = cross_val_score (model, X, y, skorlama = 'roc_auc', cv = cv, n_jobs = -1) # performans baskısını özetler ('Ortalama ROC AUC:% .3f' ortalama (puanlar))Dengesiz sınıflandırma problemlerine ilişkin standart bir karar ağacı modelinin tanımlanmasına ve değerlendirilmesine ilişkin eksiksiz bir örnek aşağıdaki gibidir.
Karar ağaçları, kendileri dengesiz sınıflandırma problemleri için verimli olmasalar da ikili sınıflandırma görevleri için etkili bir modeldir.
# sklearn.datasets'den numpy import ortalamasından dengesiz bir sınıflandırma veri kümesine bir karar ağacı yerleştir sklearn.model_selection öğesinden make_classification'ı import cross_val_scorefrom sklearn.model_selection import RepeatedStratifiedKFoldfromfrom sklearn.tree import DecisionTreeClassifier # make datasetX = make datasetX = 0, n_clusters_per_class = 1, ağırlıklar =, flip_y = 0, random_state = 3) # model modelini tanımla = DecisionTreeClassifier () # değerlendirme prosedürünü tanımlacv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # model_değerini değerlendir (çapraz_değer = model, X, y, puanlama = 'roc_auc', cv = cv, n_jobs = -1) # performans baskısını özetle ('Ortalama ROC AUC:% .3f'% ortalama (puanlar))Dengesiz veri kümeleri üzerindeki standart karar ağacı modelinin performansını değerlendirmek ve ROC AUC'yi rapor etmek için bu örneği çalıştırın.
Özel sonuçlarınız, öğrenme algoritmasının doğasında bulunan rastgeleliğe bağlı olarak değişebilir. Birkaç kez daha çalıştırmayı deneyin.
Bu modelin 0.5'ten daha büyük ROC AUC'ye ulaşabildiğini ve 0.746 ortalama değerine ulaşabildiğini görebiliriz.
Ortalama ROC AUC: 0.746Bu, herhangi bir standart karar ağacı algoritması iyileştirmesi için karşılaştırmalı bir temel sağlar.
Karar ağacı algoritmasına ayrıca Sınıflandırma ve regresyon ağacı (CART) , Ağaçları kapsayan ve eğitim setinden örneklerin sınıflandırılması dahil.
Sınıflandırma ve regresyon ağaçları:
https://machinelearningmastery.com/classification-and-regression-trees-for-machine-learning/
Ağaç, eğitim setini ayırmak için kullanılabilir ve örnek, ağacın karar noktası üzerinden yaprak düğüme ulaşabilir ve sınıf etiketleri ile iliştirilebilir.
Ağaç, eğitim setini ayırmak için veri setindeki değişkenlerin değerleri kullanılarak oluşturulabilir. Her noktada, verilerin ayrılması, en saf (en az karışık) örnek grubunun en açgözlü şekilde seçilmesine izin verir.
Burada saflık, örneklerin temiz bir şekilde ayrıldığı anlamına gelir.Sadece 0 ve yalnızca 1 içeren örneklerden oluşan sınıf en saf, 50-50 karışık sınıf en az saftır. Ortak saflık genellikle Gini safsızlığı ile hesaplanır, ancak entropi ile de hesaplanabilir.
Bilgi entropisi:
https://machinelearningmastery.com/information-gain-and-mutual-information/
Saflık ölçümü, belirli bir sınıfın bir örneğinin yanlış sınıflandırılma olasılığının hesaplanmasını içerir. Bu olasılıkların hesaplanması, her bir gruptaki her sınıfın örnek sayısının toplanmasını içerir.
Ayırma kriterleri, yalnızca ayırmanın saflığını dikkate alacak şekilde değil, aynı zamanda her bir sınıfın önemini ağırlıklandıracak şekilde güncellenebilir.
"Maliyete duyarlı bir karar ağacını içe aktarma amacımız, bir örnek yanlış sınıflandırmasının kaybıyla orantılı olarak ağırlığı değiştirmektir ..."
- "Kayba duyarlı karar ağaçlarını içe aktarmak için bir örnek ağırlıklandırma yöntemi", 2002
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/
Bu, katsayıların ağırlıklı toplam için kullanıldığı, her gruptaki örneklerin sayısı ağırlıklı bir toplamla değiştirilerek elde edilebilir.
Daha büyük ağırlıklar daha önemli sınıflara atanır ve daha küçük ağırlıklar daha az önemli sınıflara atanır.
Çoğunluk sınıfa küçük ağırlıklar atanabilir, bu da düğümün saflık puanını artırabilir (azaltabilir), aksi takdirde bu düğüm
Görünüşe göre sıralama o kadar iyi değil. Bu, çoğunluk sınıfından daha fazla örneklemin azınlık sınıfında sınıflandırılmasına ve azınlık sınıfındaki örneklere daha iyi uyum sağlamasına olanak sağlayabilir.
"Daha yüksek yanlış sınıflandırma maliyetleri olan sınıflardan örneklere daha yüksek ağırlıklar atanır."
- "Dengesiz Veri Kümelerinden Öğrenme", 2018, sayfa 71
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/
Bu nedenle, karar ağacı algoritmasındaki bu değişikliğe ağırlıklı karar ağacı, ağırlıklı karar ağacı veya maliyete duyarlı karar ağacı adı verilir.
Sınıfın dengesizliğine daha iyi uyum sağlamak için karar ağacı yapım algoritmasını değiştiren birçok çalışma olmasına rağmen, ayırma noktası hesaplamasının değiştirilmesi en yaygın olanıdır.
Scikit-Learn Python makine öğrenimi araç seti, sınıf ağırlıklandırmayı destekleyen bir karar ağacı algoritması uygulama yöntemi sağlar.
Karar ağacı algoritması, bir model hiper parametresi olarak belirtilebilen bir class_weight parametresi sağlar. sınıf_ağırlığı, her bir sınıf etiketini (örneğin, 0 ve 1) ve uydurma modeline uygulandığında karar ağacındaki ayırma grubu saflık hesaplamasının ağırlığını tanımlayan bir sözlüktür.
Örneğin, her kategori 0 ve 1 için 1'e 1 ağırlık şu şekilde tanımlanabilir:
... # model ağırlıklarını tanımlayın = {0: 1.0, 1: 1.0} model = DecisionTreeClassifier (sınıf_ağırlığı = ağırlıklar)Sınıf ağırlıklarını tanımlamanın birçok yolu vardır, örneğin:
Sınıf ağırlıklandırmasını kullanmak için en iyi uygulama, eğitim setindeki sınıf dağılımının tersini kullanmaktır.
Örneğin, test seti sınıf dağılımı bir azınlık sınıfıdır: çoğunluk sınıfı 1: 100 oranına sahiptir. Bu oranın karşılıklılığı 1 çoğunluk ve 100 azınlıktır. Örneğin:
... # model ağırlıklarını tanımlayın = {0: 1.0, 1: 100.0} model = DecisionTreeClassifier (sınıf_ağırlığı = ağırlıklar)Aynı oranı tanımlamak ve aynı sonucu elde etmek için kesirleri de kullanabiliriz. Örneğin:
... # model ağırlıklarını tanımlayın = {0: 0.01, 1: 1.0} model = DecisionTreeClassifier (sınıf_ağırlığı = ağırlıklar)Buluşsal yöntem, class_weight 'i doğrudan' dengelenmiş 'olarak ayarlayarak ayarlanabilir. Örneğin:
... # define modelmodel = DecisionTreeClassifier (class_weight = 'dengeli')Sınıf ağırlıklı karar ağacı algoritmasını, önceki bölümde tanımlanan değerlendirme prosedürünü kullanarak değerlendirebiliriz.
Sınıf ağırlıklı karar ağacı sürümünün, sınıf ağırlıklandırması olmadan standart karar ağacı algoritmasından daha iyi performans göstermesini bekliyoruz.
Tam örnek aşağıdaki gibidir:
# dengesiz bir sınıflandırma veri kümesindeki sınıf ağırlığına sahip karar ağacı, sklearn.datasets'den numpy import ortalamasından sklearn.model_selection'dan make_classification içe aktarın sklearn.model_selection'dan import cross_val_score import RepeatedStratifiedKFoldfoldfrom sklearn.tree import DecisionTreeClassifier # make datasetX n_redundant = 0, n_clusters_per_class = 1, agırlıklar =, flip_y = 0, random_state = 3) # model modelini tanımla = DecisionTreeClassifier (class_weight = 'dengeli') # değerlendirme prosedürünü tanımlacv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 1), random_state # model puanlarını değerlendirin = cross_val_score (model, X, y, puanlama = 'roc_auc', cv = cv, n_jobs = -1) # performans baskısını özetleyin ('Ortalama ROC AUC:% .3f' ortalama (puanlar))Sentetik bir dengesiz sınıflandırma veri kümesi hazırlamak için bu örneği çalıştırın ve ardından karar ağacı algoritmasının ağırlıklı versiyonunu değerlendirmek için tekrarlanan çapraz doğrulamayı kullanın.
Sonuçlarınız, algoritmanın rastgeleliğinden etkilenebilir, birkaç kez daha çalıştırmayı deneyin.
ROC AUC'nin ortalama puanı rapor edilir ve karar ağacı algoritmasının ağırlıksız versiyonundan daha iyi bir puan alır: 0.759 vs. 0.746.
Ortalama ROC AUC: 0.759Eğitim setinin karşılıklı oranını kullanan sınıf ağırlıklandırma bir tür sezgiseldir.
Farklı sınıf ağırlıklarının kullanılması daha iyi performansla sonuçlanabilir ve bu da değerlendirme modeli performans ölçütlerinin seçimine fazlasıyla bağlıdır.
Bu bölümde, ağırlıklı karar ağacı için farklı ağırlıklarda bir dizi ızgara araştırması gerçekleştirecek ve en iyi ROC AUC'yi elde edebilecek sonuçları inceleyeceğiz.
Sınıf 0 ve sınıf 1 için aşağıdaki ağırlıkları deneyeceğiz:
GridSearchCV sınıfı olarak tanımlanabilen bu grid arama parametreleri aşağıdaki gibidir:
GridSearchCV sınıfı:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/
... # gridbalance = param_grid = dict (class_weight = balance) tanımlayınBu parametrelerde ızgara taraması yapmak için tekrarlanan çapraz doğrulama kullanabilir ve modelin performansını tahmin etmek için ROC AUC kullanabiliriz:
... # değerlendirme prosedürünü tanımlayıncv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # grid searchgrid = GridSearchCV (tahminci = model, param_grid = param_grid, n_jobs = -1, cv = cv, puanlama = 'roc_auc ')Bir kez yürütüldüğünde, en iyi yapılandırmayı özetleyebiliriz ve tüm sonuçlar aşağıdaki gibidir:
... # en iyi konfigürasyon baskısını rapor edin ("En iyi:% s kullanarak% f"% (grid_result.best_score_, grid_result.best_params _)) # tüm konfigürasyonları rapor et = grid_result.cv_results_stds = grid_result.cv_results_params = grid_result.cv_results, params_result.cams_result. zip olarak (ortalama, std, parametreler): print ("% f (% f) ile:% r"% (ortalama, stdev, param))Aşağıdaki örnek, beş farklı sınıf ağırlığı üzerinde bir ızgara araması gerçekleştiren, dengesiz bir veri kümesinde bir karar ağacı algoritmasıdır.
Sezgisel sınıf ağırlıklarının en iyi yapılandırma olmasını bekleyebiliriz.
# dengesizlik sınıflandırması için karar ağacına sahip ızgara arama sınıfı ağırlıkları sklearn.datasets'den numpy import ortalamasından sklearn.model_selection'dan make_classification içe aktarın sklearn.model_selection import GridSearchCV import RepeatedStratifiedKFoldfrom sklearn.tree import DecisionTreeClassifier # make datasetX = make datasetX n_redundant = 0, n_clusters_per_class = 1, weights =, flip_y = 0, random_state = 3) # define modelmodel = DecisionTreeClassifier () # define gridbalance = param_grid = dict (class_weight = balance) #_re Evaluation procedurecv = Repe defineStratifiedKFold, n_lits = 3, random_state = 1) # grid searchgrid tanımla = GridSearchCV (estimator = model, param_grid = param_grid, n_jobs = -1, cv = cv, scoreing = 'roc_auc') # grid searchgrid_result = grid.fit (X, y ) # en iyi yapılandırma baskısını rapor edin ("En iyi:% f kullanarak% f"% (grid_result.best_score_, grid_result.best_params _)) # tüm konfigürasyonları raporla = grid_result.cv_results_stds = grid_result.cv_results_params = grid_result.cv_results_for mean, stdev, zip cinsinden param (ortalama, stds, parametreler): print ("% f (% f) ile:% r"% (ortalama, stdev, param))Bu örneği çalıştırmak, her bir sınıf ağırlığını değerlendirmek için tekrarlanan k-katmanı çapraz doğrulama kullanır ve en iyi konfigürasyonu ve ilişkili ortalama ROC AUC puanını bildirir.
Sonuçlarınız öğrenme algoritmasının rastgeleliğine göre değişebilir, birkaç kez daha çalıştırmayı deneyin.
Bu durumda, 1: 100 bir çoğunluk görebiliriz: analog ağırlıklandırmanın azınlığı en iyi ortalama ROC puanını elde edebilir. Bu, genel sezgisel yapılandırmayla eşleşir.
ROC AUC ortalama puanı üzerindeki etkisini görmek için daha katı sınıf ağırlıklarını keşfetmek ilginç olabilir.
En İyi: 0,752643 {'sınıf_ağırlığı': {0: 1, 1: 100}} 0,737306 (0,080007) kullanımıyla: {'sınıf_ağırlığı': {0: 100, 1: 1}} 0,747306 (0,075298) ile: {'sınıf_ağırlığı' : {0: 10, 1: 1}} 0,740606 (0,074948) ile: {'sınıf_ağırlığı': {0: 1, 1: 1}} 0,747407 (0,068104) ile: {'sınıf_ağırlığı': {0: 1, 1: 10}} 0,752643 (0,073195) ile: {'sınıf_ağırlığı': {0: 1, 1: 100}}Daha fazla oku
Daha fazlasını öğrenmek istiyorsanız, bu bölüm daha fazla ilgili kaynak sağlar.
sonuç olarak
Bu kılavuzda, dengesiz sınıflandırma için ağırlıklı karar ağaçlarını incelediniz. Özellikle şunları öğrendiniz:
Orjinal başlık:
Dengesiz Sınıflandırma için Maliyete Duyarlı Karar Ağaçları
Orijinal bağlantı:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification
Editör: Huang Jiyan
Düzeltme: Yang Xuejun
Çevirmen Profili
Chen Chao , Pekin Üniversitesinde Uygulamalı Psikoloji Yüksek Lisansı. Lisans derecesi bir kez bilgisayar ana dalındaydı ve sonra amansız bir şekilde psikoloji yolunda araştırma yapıyordu. Giderek daha fazla veri analizi ve programlamanın iki zorunlu hayatta kalma becerisi haline geldiğini keşfediyor, bu nedenle günlük hayatımda ilgili bilgilere daha iyi erişmek ve anlamak için her türlü çabayı gösteriyorum, ancak önümdeki yol uzun ve hala yoldayım.
-Bitiş-
Tsinghua-Qingdao Veri Bilimi Enstitüsü'nün resmi WeChat kamu platformunu takip edin " THU Veri Pastası "Ve kız kardeş numarası" Veri Pastası THU "Daha fazla ders avantajı ve kaliteli içerik elde edin.