In [1]:
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
import sklearn.preprocessing as prep
import sklearn.metrics as met
In [2]:
#ucitavanje skupa
df = pd.read_csv("C:/Users/student/Desktop/ipIndustija4/vezbe7/iris.csv")
In [3]:
#izdvajanje skupa sa atributima za predvidjanje
features = df.columns[:4].tolist()

#ako zelimo da izdvojimo odredjene atribute za klasifikaciju
#featurs = ["Petal_Length",  "Petal_Width"]

x_original=df[features]

#normalizacija vrednosti u atributima za predvidjanje
x=pd.DataFrame(prep.MinMaxScaler().fit_transform(x_original))

#dodeljivanje imena kolonama
x.columns = features

#izdvajanje skupa sa ciljnim atributom
y=df["Species"]
In [4]:
#podela na trening i test skup
#U primeru je zadato da 95% instanci ide u trening skup samo da bi izvestaj o
#test instancama bio kraci.
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.95, stratify=y)
In [5]:
"""
Paramerti za KNN:
n_neighbors : broj suseda
              default=5
weights : tezine suseda
              default='uniform'
              moguce:
              'uniform' : svi susedi imaju podjednak uticaj
              'distance' : blizi susedi imaju veci uticaj na odredjivanje klase
metric:  metrika
       default : 'minkowski'
p: parametar za rastojanje Minkowski (p=1 za Menhetn, p=2 za Euklidsko)
"""

#pomocu unakrsne validacije traze se najbolje vrednosti parametara
#medju zadatim vrednostima
parameters = {'n_neighbors':range(3,10),
               'p': [1, 2],
               'weights':['uniform', 'distance'] }

clf = GridSearchCV(KNeighborsClassifier(), parameters, cv=5)

#pravi se model sa najboljim vrednostima za parametre
clf.fit(x_train, y_train)
Out[5]:
GridSearchCV(cv=5, estimator=KNeighborsClassifier(),
             param_grid={'n_neighbors': range(3, 10), 'p': [1, 2],
                         'weights': ['uniform', 'distance']})
In [6]:
#primena modela na test skupu
y_pred = clf.predict(x_test)

#izvestaj o klasifikaciji test instanci
cnf_matrix = met.confusion_matrix(y_test, y_pred)
print("Matrica konfuzije", pd.DataFrame(cnf_matrix, index=clf.classes_, columns=clf.classes_), sep="\n")
print("\n")

accuracy = met.accuracy_score(y_test, y_pred)
print("Preciznost", accuracy)
print("\n")

class_report = met.classification_report(y_test, y_pred)
print("Izvestaj klasifikacije", class_report, sep="\n")
Matrica konfuzije
            setosa  versicolor  virginica
setosa           2           0          0
versicolor       0           3          0
virginica        0           0          3


Preciznost 1.0


Izvestaj klasifikacije
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00         2
  versicolor       1.00      1.00      1.00         3
   virginica       1.00      1.00      1.00         3

    accuracy                           1.00         8
   macro avg       1.00      1.00      1.00         8
weighted avg       1.00      1.00      1.00         8

In [10]:
option = input("Da li zelite informacije o klasifikaciji svake instance? (1 za da, 0 za ne)")
print(option)
if(option=="1"):
    #sa clf.best_estimator_ se pristupa klasifikatoru (u ovom primeru KNN) i
    #onda se mogu koristiti njegovi atributi i metode
    #za test instance se izdvajaju rastojanja do suseda, kao i pozicije suseda u trening skupu
    distances, indices = clf.best_estimator_.kneighbors(x_test)

    
    print(distances)
    print(indices)
    k = len(indices[0])
    for i in range(0, len(x_test)):

        #izdvajanje podataka o test instanci
        print("test instanca: ", x_test.iloc[i], sep="\n")

        #prikaz prave i dodeljene klase test instance
        print("prava klasa: ", y_test.iloc[i])
        print("dodeljena klasa: ", y_pred[i])
        print("\n")
        
        #izvestaj o susedima
        print("susedi: ")
        for j in range(0, k):
            print(x_train.iloc[indices[i][j]])
            print("class:", y_train.iloc[indices[i][j]])
            print("distance: ", distances[i][j], "\n")

        print("\n")
Da li zelite informacije o klasifikaciji svake instance? (1 za da, 0 za ne)0
0