Karar ağaçları, scikit-do gibi kütüphanelerin bina karar ağaçlarının önemsiz hale getirilmesinden biri, algoritmanın içsel çalışmalarını anlamak için mükemmel bir yoldur.Bu ders size teori ve kod aracılığıyla rehberlik edecek, böylece kendi karar ağacınızı zeminden inşa edebilirsiniz.
Bir Karar Ağacı Nedir?
Bir karar ağacı, her iç düğümün bir özellik üzerinde bir test temsil ettiği bir akış gibidir (örneğin, “Yaş > 30?”), her bir şube bu testin sonuçlarını temsil eder ve her yaprak hiçbirinin bir sınıf etiketi veya sürekli değeri yoktur.
Ağaç yeniden kullanılabilir: kökünden başlayarak, algoritma en iyi özelliği seçer ve verileri en temiz bir şekilde ayırarak bölünmüş noktası seçer.Bu işlem, bir durdurma koşulu ile her alt sette tekrarlanır.Daha fazla arka plan için Wikipedia'nınŞUDÜŞÜNDÜSÜŞÜNÜŞÜNÜŞÜNÜ: 0,0) karar ağacı öğrenme konusunda tekrarlanır.
Core Concepts You Must understand
Nodes, Branşlar ve Leaves
Kök node tüm eğitim veri kümesini içerir. İç düğümler bir özellik test eder ve verileri iki veya daha fazla çocuk düğümüne bölür.Köyücüler bir testin sonucunu temsil eden bağlantılardır. Broşür düğümleri (terminal düğümler) son tahminini yapar - sınıflandırmadaki en yaygın sınıf veya regresyonda değer.
Bölünme Kriterleri
Bir ağaç inşa etmek için, potansiyel bir bölünmenin kalitesini ölçmenin bir yolu gerekir.En yaygın kriterler şunlardır:
- [FONT:0]Gini dürtüsü[[Dönetici: 1 ) - rastgele seçilmiş bir elementin alt setteki sınıfların dağılımına göre rastgele etiketlenmiş olup olmadığını ölçmek için sınıflandırmada kullanılır.
- [FONT=0)Entropy[Dönetici:0)[Dönetici:0)[Döneticiler)) - bir sette hastalık veya belirsizlik miktarını ölçer.
- [FONT:0)Variance azaltımı[[[Dönetici:0)) - regresyon ağaçları için kullanılır.
Algoritma her özelliği üzerinde olası bölünmeyi değerlendirir ve en büyük azaltımı sağlayan kişiyi alır (veya bilgi kazanır).
Bilgi Kazan ve Oran
Bilgi kazancı, ebeveynin yetersizliği ile çocuk yetersizlikleri arasındaki farkdır. Basit olsa da, birçok değerle ilgili özellikleri lehine karşı karşıya kalır.
Adım Adımı Oluşturun
1. Verilerinizi Hazırlayın
Özellikler ve hedef etiketlerle bir veri kümesine ihtiyacınız var. Basitlik için, sayısal sınıflandırma veri kümesini sayısal özelliklerle kullanın. Örneğin:
- [FONT:0]İşler:[Dönem:[Dönem:)
- [FONT=0)Target:[[Dönemli:[Dönemli) Onaylanmış (1) veya Onaylanmamış (0) Değil
Veriler temizleyin: eksik değerleri ele alın, tekrarları çıkarın ve sayısal türleri garanti edin. Karar ağaçları karışık veri türlerini idare edebilir, ancak uygulama için sayısal olarak yapıştıracağız.
2. Bir Bölünme Criterion Fonksiyonlu Tanımlayın
Gini dürtüsü uygulayacağız. Gini indeksi bir dizi ürün için:
[0]
p i, sınıfdaki eşyaların oranıdır. ikili bir bölünme için, genel Gini çocuk düğümlerinin ağırlığıdır.
3. Split Değerlendirmesini Uygulayın
Her özellik için, eşsiz değerleri test edin. Her olası eşik (dönemli değerler arasındaki nokta). Her aday eşi için verileri sol ve sağ gruplara ayır, Gini'yi hesaplar ve en iyi bölünmeyi takip edin.
4. Ağaç Recursally'i inşa edin
Bir alt veri ve mevcut bir derinlik gerektiren bir işlev oluşturun.Bu, durdurma koşullarını kontrol eder (örneğin, en fazla derinlik, node veya bilgi kazanı). Bir koşul karşılanırsa, bir yaprak node ile en iyi bölünmeyi oluşturur ve bir iç düğüm yaratır, sonra sol ve sağ bölmelerde işlevi tekrar arar.
5. Tahminler yapın
Ağaç inşa edildiğinde, tahmin basittir: köke başlayın, yeni örnekteki özel testleri değerlendirmekle dalları takip edin ve arazinizdeki yaprak değerini geri döndürür.
Python'da Full Uygulama
Aşağıda Gini impurity kullanarak sınıflandırma için bir karar ağacının tam, minimum uygulanmasıdır. Bu kod öğrenme için kullanılır - büyük veri setleri için optimize edilmez.
import numpy as np
from collections import Counter
class DecisionTree:
def __init__(self, max_depth=None, min_samples_split=2):
self.max_depth = max_depth
self.min_samples_split = min_samples_split
self.tree = None
def fit(self, X, y):
dataset = np.column_stack((X, y))
self.tree = self._grow_tree(dataset)
def _grow_tree(self, dataset, depth=0):
X, y = dataset[:, :-1], dataset[:, -1]
n_samples, n_features = X.shape
n_labels = len(np.unique(y))
# Stopping conditions
if (n_labels == 1 or depth == self.max_depth or n_samples < self.min_samples_split):
leaf_value = Counter(y).most_common(1)[0][0]
return {'leaf': True, 'value': leaf_value}
best_feature, best_threshold = self._best_split(dataset, n_features)
if best_feature is None:
leaf_value = Counter(y).most_common(1)[0][0]
return {'leaf': True, 'value': leaf_value}
left_idx, right_idx = self._split(dataset[:, best_feature], best_threshold)
left_subtree = self._grow_tree(dataset[left_idx], depth+1)
right_subtree = self._grow_tree(dataset[right_idx], depth+1)
return {'leaf': False,
'feature': best_feature,
'threshold': best_threshold,
'left': left_subtree,
'right': right_subtree}
def _best_split(self, dataset, n_features):
best_gini = float('inf')
best_feature, best_threshold = None, None
for feature in range(n_features):
thresholds = np.unique(dataset[:, feature])
for i in range(len(thresholds)-1):
thresh = (thresholds[i] + thresholds[i+1]) / 2
left_idx, right_idx = self._split(dataset[:, feature], thresh)
if len(left_idx) == 0 or len(right_idx) == 0:
continue
gini = self._gini_gain(dataset, left_idx, right_idx)
if gini < best_gini:
best_gini = gini
best_feature = feature
best_threshold = thresh
return best_feature, best_threshold
def _split(self, values, threshold):
left_idx = np.where(values <= threshold)[0]
right_idx = np.where(values > threshold)[0]
return left_idx, right_idx
def _gini_gain(self, dataset, left_idx, right_idx):
total = len(left_idx) + len(right_idx)
gini_left = self._gini(dataset[left_idx, -1])
gini_right = self._gini(dataset[right_idx, -1])
return (len(left_idx)/total) * gini_left + (len(right_idx)/total) * gini_right
def _gini(self, labels):
_, counts = np.unique(labels, return_counts=True)
p = counts / np.sum(counts)
return 1 - np.sum(p**2)
def predict(self, X):
return np.array([self._predict_row(x, self.tree) for x in X])
def _predict_row(self, x, node):
if node['leaf']:
return node['value']
if x[node['feature']] <= node['threshold']:
return self._predict_row(x, node['left'])
else:
return self._predict_row(x, node['right'])
Ağaçları Test Etmek
Klasik iris veri setine (iki çift sınıflandırma için iki özellik) basit bir veri kümesi kullanın.TheETHFLT:0)scikit- learning Iris dataset) iyi çalışır. Ağacınızın doğruluğunu scikit-learn'in doğruluğu ile karşılaştırın:2 doğruyu doğrulamak için.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
data = load_iris()
X = data.data[:100] # take only first two classes (binary)
y = data.target[:100]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
tree = DecisionTree(max_depth=3)
tree.fit(X_train, y_train)
preds = tree.predict(X_test)
accuracy = np.mean(preds == y_test)
print(f'Accuracy: {accuracy:.2f}')
Ağaçlarınızı Geliştirmek için Gelişmiş Teknikler
Overfitting'den Kaçmak için
Tamamen yetişkin bir ağaç, eğitim verilerindeki gürültüyü ezberleyebilir. Pruning, küçük tahmin edici güce sahip olan şubeleri kaldırmaktadır. Ortak yöntemler önceden varsayılır (daha önce büyümeyi erkenden 444DÜye kadar durdurur) veya [[DÜye Olmayanlar) ve post-pruning (tüm ağaç, doğrulanmış bir şekilde, uygulamamız için şubeleri kaldırmaktadır.
Sürekli ve Categorical Özellikler
Sürekli özellikler için, eşler olarak sıralanan değerler arasında orta noktalar kullandık.For categorical features (e.g., “Renk = kırmızı / yeşil / mavi), her kategori ayrı bir şube haline gelebilir (multi-way bölünmüş) veya ikili kodlayabilirsin (örneğin scikit learning) tüm alt kümeleri değerlendirmek için ikili bölünmüşleri kullanır.
Eksik Değerlerle Anlaşma
Gerçek dünya verileri genellikle eksik değerlere sahiptir. Basit bir yaklaşım, özelliği olan eğitim örnekleri arasında en sık şubeye eksik değer atamaktır. C4.5 bir olasılıksal yöntem kullanır.Bu bir öğretici başlangıç olduğundan, verilerin tam olduğunu varsayıyoruz.
Kütüphanelerle ve daha fazla okuma ile karşılaştırma
Sıfırdan inşa etmek eğitim olsa da, üretim sistemleri, Hastie tarafından optimize edilen C uygulamalarını sağlayan scikit-tösterler olarak kütüphaneleri kullanıyor.Resimsiz bir kaynaktır. başka bir mükemmel referans Breiman et al.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Makine öğrenimindeki en temel algoritmaların birini çizerek karar ağacı inşa edin.Regresyon desteği, prömülme prosedürünün güçlü bir model üretebileceğini öğrendiniz.Buraya geliştirdiğiniz beceriler, daha karmaşık bir yaklaşıma ve değişkenliğe yol açan yöntemlere de hizmet edersiniz.