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
#ucitavanje skupa
df = pd.read_csv("C:/Users/student/Desktop/ipIndustija4/vezbe7/iris.csv")
#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"]
#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)
"""
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)
GridSearchCV(cv=5, estimator=KNeighborsClassifier(), param_grid={'n_neighbors': range(3, 10), 'p': [1, 2], 'weights': ['uniform', 'distance']})
#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
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