import matplotlib.pyplot as plt import pandas as pd import seaborn as sns from sklearn import preprocessing from sklearn.model_selection import train_test_split from sklearn import tree from sklearn.metrics import accuracy_score, classification_report import graphviz as graphviz from os import system # Wczytanie danych bank = pd.read_csv("bank.csv") # Wyświetlenie wielkości zbioru i nagłówka print(bank.shape) print(bank.head()) print(bank.dtypes) #Typy atrybutów # Puste rekordy print(bank[bank.isnull().any(axis=1)].count()) print("Liczba pustych wartości w całym zbiorze:") # Statystyki dla rekordów numerycznych print(bank.describe()) # Wybrano do wizualizacji atrybut "age" i wykonano boxplot i histogram po dyskretyzacji na zadaną liczbę bins plt.figure(1) plt.subplot(1, 2, 1) sns.boxplot(x=bank["age"]) plt.subplot(1, 2, 2) sns.set(style="ticks", color_codes=True) sns.distplot(bank.age, bins=10) plt.show() # Wizualizacja wybranego atrybutu dyskretnego print( bank.job.value_counts()) plt.figure(2) sns.countplot(y='job', data=bank) plt.show() # Usunięcie rekordów z kategorii unknown job bank = bank[bank.job != 'unknown'] print(bank.shape) # ZADANIE: Policzyć ile rekordów zostało usuniętych sns.countplot(y='job', data=bank) plt.show() # Analiza atrybutu - skuteczność reklamy print(bank.poutcome.value_counts()) bank['poutcome'] = bank['poutcome'].replace(['other'] , 'unknown') print(bank.poutcome.value_counts()) # Analiza atrybutu contact - rodzaj medium do kontaktu (3 wartości: cellular, unknown, telephone) # Ze względu na bezużyteczność tego atrybutu zostanie usunięty print(bank.contact.value_counts()) bank.drop('contact', axis=1, inplace=True) ## Przygotowanie danych dla klasyfikatora ##Zamiana etykiet na wartości numeryczne le = preprocessing.LabelEncoder() for i in range(0,len(bank.columns)): bank.iloc[:,i] = le.fit_transform(bank.iloc[:,i]) print(bank.head()) ## Podział na dane treningowe i testowe X = bank.drop("deposit",1) #Jako zbiór próbek traktujemy wszystkie kolumny oprócz ostatniej y = bank.deposit # Target - klasa - wartość oczekiwana atrybuty = X.columns.tolist() #Lista nazw atrybutów className = ("deposit") #nazwa klasy X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) print("Liczba przykładów treningowych "+str(len(X_train.index))) print("Liczba elementów w zbiorze testowym "+str(len(X_test.index))) ##Klasyfikacja z użyciem drzewa drzewo = tree.DecisionTreeClassifier(criterion="entropy",random_state=0) drzewo.fit(X_train,y_train) prediction = drzewo.predict(X_train) accuracyScore = accuracy_score(y_train, prediction) print("Drzewo decyzyjne osiąga dokładność na zbiorze trenującym/uczącym: "+str(accuracyScore)) prediction = drzewo.predict(X_test) accuracyScore = accuracy_score(y_test, prediction) print("Drzewo decyzyjne osiąga dokładność na zbiorze testowym: "+str(accuracyScore)) print(classification_report(y_test.to_numpy(), prediction)) dot_data = tree.export_graphviz(decision_tree=drzewo, feature_names=atrybuty, class_names=["0","1"], filled=True, rounded=True) graph = graphviz.Source(dot_data, filename="test.gv", format="png") graph.view()