Visualization - Comparison of Classifiers

Kategori: Machine Learning , 13 Aralık 2019 , JanFranco


Bu yazımızda şu ana kadar gördüğümüz sınıflandırma algoritmalarını, özel olarak hazırlanmış 3 veri seti üzerinde test edip, nasıl bir sınıflandırma yaptıklarını 2 boyutlu olarak görselleştireceğiz. Kütüphaneleri import edelim:


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
2 boyutlu grafik için bir scale parametresi belirleyelim, bu değeri h değişkenine atayalım. Algoritmaların isimlerini names listesinde, objelerini classifiers listesinde tutalım:


h = .02

names = ["Nearest Neighbors", "Linear SVM", "RBF SVM", "Decision Tree", "Random Forest", "Naive Bayes"]

classifiers = [KNeighborsClassifier(3), SVC(kernel="linear", C=0.025), SVC(gamma=2, C=1),
               DecisionTreeClassifier(max_depth=5), RandomForestClassifier(n_estimators=10), GaussianNB()]
sklearn kütüphanesindeki hazır methodları kullanarak, lineer, yin-yang, halka içinde halka verisetlerini oluşturalım:


X, y = make_classification(n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)

datasets = [make_moons(noise=0.3, random_state=0),
            make_circles(noise=0.2, factor=0.5, random_state=1),
            linearly_separable]
Figürü oluşturalım. Buradan sonraki mantığı kısaca şöyle açıklayayım: Veri setindeki değerleri scale ediyoruz, böylelikle veriler 0-1 aralığına indirgeniyor. Bu aralığı negatif pozitif olarak büyültüyoruz. meshgrid methodu kullanarak grafiğin scale ayarlarını yapıyoruz. Bunlar tamamen grafiğin normal gözükmesini sağlamak için. Veriyi train, test şeklinde bölüyoruz. Modeli train ederken train setini vereceğiz ancak test aşamasında tüm verisetini veriyoruz. Train ve test değerleri arasındaki farkı grafikte belli etmek için alpha değerleri ile oynuyoruz. (Burada 0.6 verilecek). Daha sonra modelleri eğitiyoruz. Predict sonucunu alıyoruz ve contourf ile sınırları çiziyoruz:


figure = plt.figure(figsize=(27, 9))
i = 1

for ds_cnt, ds in enumerate(datasets):
    X, y = ds
    X = StandardScaler().fit_transform(X)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

    cm = plt.cm.RdBu
    cm_bright = ListedColormap(['#FF0000', '#0000FF'])
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
    if ds_cnt == 0:
        ax.set_title("Input data")
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors='k')
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6, edgecolors='k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1

    for name, clf in zip(names, classifiers):
        ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
        clf.fit(X_train, y_train)
        score = clf.score(X_test, y_test)
        Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
        Z = Z.reshape(xx.shape)
        ax.contourf(xx, yy, Z, cmap=cm, alpha=.8)
        ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors='k')
        ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, edgecolors='k', alpha=0.6)
        ax.set_xlim(xx.min(), xx.max())
        ax.set_ylim(yy.min(), yy.max())
        ax.set_xticks(())
        ax.set_yticks(())
        if ds_cnt == 0:
            ax.set_title(name)
        ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),
                size=15, horizontalalignment='right')
        i += 1

plt.tight_layout()
plt.show()
Comparison of classifiers


Sonraki Yazı: Iris - Classification
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın