Mamy zmienną X, która jest pewnym badanym zbiorem. Jest ona charakteryzowana przez trzy parametry :
X = [[181, 80, 44], [177, 70, 43], [160, 60, 38], [154, 54, 37],[166, 65, 40],
[190, 90, 47],[175, 64, 39],[177, 70, 40], [159, 55, 37],
[171, 75, 42], [181, 85, 43], [168, 75, 41],[168, 77, 41],
[190, 70, 43],[154, 75, 38],[181,65,40]]
Mamy zmienną dychotomiczną Y, która jest zbiorem odpowiadającym zmiennej X :
Y = ['x', 'x', 'y', 'y', 'x', 'x', 'y', 'y', 'y', 'x', 'x', 'y', 'y', 'x','y','x']
Na podstawie powyższych danych, należy zbudować model, który pozwoli nam zaklasyfikować dane, które możemy otrzymać.
Rozwiązanie:
Zmienna Y posłuży nam do uczenia naszego modelu.
Ze zbioru X i Y należy wyodrębnić dane testowe. Zbiory te zostaną pomniejszone o wyodrębnione elementy. Dane testowe jak sama nazwa mówi, posłużą nam do przetestowania, czy otrzymane przez nas wyniki są prawidłowe. Do testu należy wyodrębnić 25% danych:
X = [[181, 80, 44], [177, 70, 43], [160, 60, 38], [154, 54, 37],[166, 65, 40], [190, 90, 47], [175, 64, 39],
[177, 70, 40], [159, 55, 37], [171, 75, 42],
[181, 85, 43], [168, 77, 41]]
Y = ['x', 'x', 'y', 'y', 'x', 'x', 'y', 'y', 'y', 'x', 'x', 'y']
test_data = [[190, 70, 43], [154, 75, 38], [181, 65, 40], [168, 75, 41]]
test_labels = ['x', 'y', 'x', 'y']
Czyli zasada jest taka, że na podstawie danych X, Y testujemy nasze modele, następnie testujemy dane 'test_data’ i wynik porównujemy z danymi 'test_labels’.
Do naszego badania wykorzystamy najbardziej standardowe modele (klasyfikatory):
- Drzewa decyzyjne
- Decyzyjny las losowy
- Regresja logistyczna (działa lepiej na większych danych)
- SVC – metoda wektorów podporowych (lub wspierających)
- k-najbliższych sąsiadów
Używamy bibliotek:
from sklearn import tree
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
import numpy as np
from sklearn.metrics import accuracy_score
Należy ustawić wstępne parametry klasyfikatorów na zero:
dtc_tree_acc = 0
rfc_acc = 0
l_acc = 0
s_acc = 0
kNB_acc = 0
Budując model na początku tworzymy instancję niektórych przypadkach konieczne jest podanie parametrów). Następnie korzystamy z metody fit. Na końcu robimy predykcję
Dla każdego z modeli wykonujemy 100 iteracji testu. Jest to konieczne, ponieważ nasz model nie zawsze przewidzi taki sam wynik. Otrzymane wyniki dodajemy do siebie za pomocą funkcji, która porównuje poszczególne elementy i zwróci procent w postaci ułamka elementów które są zgodne :
for i in range(100):
# Drzewa decyzyjne
dtc_clf = tree.DecisionTreeClassifier()
dtc_clf = dtc_clf.fit(X, Y)
dtc_prediction = dtc_clf.predict(test_data)
# print(dtc_prediction)
# Decyzyjny las losowy
rfc_clf = RandomForestClassifier(n_estimators=100)
rfc_clf.fit(X, Y)
rfc_prediction = rfc_clf.predict(test_data)
# print(rfc_prediction)
# Regresja logistyczna
l_clf = LogisticRegression(solver='lbfgs')
l_clf.fit(X, Y)
l_prediction = l_clf.predict(test_data)
# print(l_prediction)
SVC
#
s_clf = SVC(gamma='scale')
s_clf.fit(X, Y)
s_prediction = s_clf.predict(test_data)
# print(s_prediction)
# k- najblizszych sasiadow
kNB_clf = KNeighborsClassifier()
kNB_clf.fit(X, Y)
kNB_prediction = kNB_clf.predict(test_data)
# print(kNB_prediction)
# Dokładnosc
dtc_tree_acc += accuracy_score(dtc_prediction, test_labels)
rfc_acc += accuracy_score(rfc_prediction, test_labels)
l_acc += accuracy_score(l_prediction, test_labels)
s_acc += accuracy_score(s_prediction, test_labels)
kNB_acc += accuracy_score(kNB_prediction, test_labels)
Wyświetlamy wyniki, oraz porównanie dla poszczególnych klasyfikatorów:
print('Drzewo decyzyjne', dtc_tree_acc, '\nDecyzyjny las losowy', rfc_acc, '\nRegresja logistyczna',
l_acc, '\nSVC', s_acc,
'\nNajbliżsi sąsiedzi', kNB_acc)
klasyfikatory = ['Drzewo decyzyjne', 'Decyzyjny las losowy', 'Regresja logistyczna','SVC',
'Najbliżsi sąsiedzi']
dokładnosc = np.array([dtc_tree_acc, rfc_acc, l_acc, s_acc, kNB_acc])
max_acc = np.argmax(dokładnosc)
print('\n' + klasyfikatory[max_acc] + ' jest najlepszym klasyfikatorem problemu.\n')
Uzyskany wynik:
Drzewo decyzyjne 81.75
Decyzyjny las losowy 89.75
Regresja logistyczna 50.0
SVC 100.0
Najbliżsi sąsiedzi 75.0
SVC jest najlepszym klasyfikatorem problemu. Przewidział za każdym razem prawidłowy wynik.