Untitled
unknown
plain_text
9 months ago
2.6 kB
6
Indexable
import pandas
import numpy as np
import statistics as st
class NaiveBayes:
@staticmethod
def classify(set, sample):
probabilityList = []
irisNameList = set['variety'].unique().tolist()
for irisName in irisNameList:
# Utworzenie listy wszystkich nazw kolumn ze zbioru
# z wyjątkiem ostatniej ('varietiy'), ponieważ już ją mamy
columnsNamesList = set.columns.tolist()[:4]
probability = 1
flowers = set[set['variety'] == irisName] # Rozdzielenie zbioru według poszczególnych kwiatów
for columnName in columnsNamesList:
columnData = flowers.loc[:,columnName]
mu = st.mean(columnData)
stDev = st.stdev(columnData)
probability *= 1/(stDev*np.sqrt(np.pi*2))*np.exp(-0.5*((sample[columnName]-mu)/stDev)**2)
probabilityList.append(probability)
maxProbability = max(probabilityList)
return (irisNameList[probabilityList.index(maxProbability)])
df = pandas.read_csv(r"C:\SSI\iris.csv") # !!! <-- Należy pamiętać o zmianie ścieżki na odpowiednią do bazy danych w systemie
# Tasowanie wierszy w bazie danych:
df = df.sample(frac = 1)
def normalize(data):
values = data.select_dtypes(exclude=["object"])
for column in values.columns.tolist():
d = data.loc[:,column]
dMax = d.max()
dMin = d.min()
for i in range(len(data)):
data.at[i, column] = (data.at[i, column] - dMin) / (dMax - dMin)
return data
# Funkcja dzieląca bazę danych na zestaw treningowy i testowy w proporcji 70%/30%
def splitTrainTest(database):
index = int(len(database) * 0.7)
return database[:index], database[index:]
def calculateAccuracy():
counter = 0
for index in range(len(testDB)):
currentRow = NaiveBayes.classify(trainDB, testDB.iloc[index])
if currentRow == testDB.iloc[index]['variety']:
counter += 1
accuracy = (counter/len(testDB)) * 100
return accuracy
normalize(df)
# Przypisujemy wyniki podziału bazy danych do nowych
# zmiennych zbioru danych, których będziemy mogli użyć później
trainDB, testDB = splitTrainTest(df)
print("--- T E S T ---")
print(testDB.iloc[0])
print("---------------")
result = NaiveBayes.classify(trainDB, testDB.iloc[0])
print(f"Wynik: {result}, prawdziwy wynik: {testDB.iloc[0]['variety']}")
print(f"Dokładność: {round(calculateAccuracy(),2)}%")Editor is loading...
Leave a Comment