Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import csv
- import pandas as pd
- from sklearn.cluster import KMeans
- from sklearn.ensemble import VotingClassifier
- from sklearn.model_selection import train_test_split
- from sklearn.neighbors import KNeighborsClassifier
- # Zapiszmy któryś plik do zmiennej data
- from sklearn.neural_network import MLPClassifier
- data = [] # Tworzymy pustą listę
- headers = []
- with open("data/leukemia.tab.txt") as file: # Zapis, żeby otworzyć plik
- reader = csv.reader(file, delimiter='\t') # Ustalenie obiektu to wczytywania z ustawieniem, że w pliku dane podzielione są tabulatorem
- for row in reader: # Iteracja, czyli w pętli lecimy po kazej linijce pliku od góry do dołu
- if len(row) > 5: # Jeżeli w linijce są mniej niż 2 dane to znaczyny, że jest to nagłowek, więc pomijamy
- data.append(row) # Linijke dłuższa niż 2 dodajemy do naszej listy 'data'
- else:
- headers.append(row[0].split(" ")[0]) # odzielamy potrzebne od niepotrzebnego
- print("Headrs: ", headers)
- del headers[0] # niepotrzebne krzaki "'ATTRIBUTES 7130',"
- del headers[-1] # krzaki " 'OBJECTS 72'", -1 czyli ostatni element
- print("Linia 1 po wczytaniu:", "\n", data[0], '\n') # Zobaczmy naszą 1 linijke czy dobrze sie wczytało i czy czasem nie jest nagłowkiem
- # Przekształcamy do typu DataFrame żeby lepiej sie operowało danymi.
- # Lista nie była zła, ale jak zrobimy z tego DataFrame to się łatwiej wykonuje obliczenia na tych danych. Mamy więcej funkcji wbudowanych.
- # Na przykład transponowanie.
- print("\nPrzed obroceniem:")
- data_frame = pd.DataFrame(data, columns=headers)
- Y = data_frame.iloc[:,-1] # Zapisujemy etykiety do innej zmieneej (na potem), -1 oznacza indeks ostatniego elementu
- data_frame = data_frame.iloc[:, :-1] # Usuwamy etykiety z glownego zbioru, nie sa potrzebne obecnie.
- # Czyli zapisujemy zbiór do nowej zmiennej bez ostatniej kolumny.
- print(data_frame.head()) # Zobaczmy kilka pierwszych (5) linijek
- print(data_frame.tail()) # Zobaczmy kilka ostatnich
- X = data_frame
- print("etykiety", Y)
- #Podzielmy od razu zbiory na train i test, testowej nie ruszamy aż do waldiacji klasyfikatorow
- X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=42)
- # Transponowanie macierzy (tak to sie chyba matematycznie nazywa)
- data_frame_transposed = X_train.transpose()
- print("\nPo obroceniu:")
- print(data_frame_transposed.head())
- print(data_frame_transposed.tail(), '\n\n\n')
- # Zagregujmy dane za pomocą metody kmeans, robimy 5 klastrów
- clusters = 4 # Tyle bedziemy robic teraz klastrow
- kmeans = KMeans(n_clusters=clusters).fit_predict(data_frame_transposed)
- # traz w means mamy listę, gdzie oznaczno kolejno przynależność do zbioru
- # Dla każdego z klastrów robimy liste
- print("Lista przynależności do zbioru (0-4, bo mamy 5 zbiorów)")
- print(kmeans)
- print("Dlugosc: ", len(kmeans))
- ### Podzielmy teraz nasz cały zbirów ze względu na przenależność do danego klastru. ###
- # Teraz wiemy, która cecha najeży do danego klastra.
- # Najpierw dołączymy rezulalt do zbioru obróconego.
- data_frame_transposed['k'] = kmeans
- print(data_frame_transposed.head()) # Zobaczmy czy index "k" klastra sie dodał.
- print(data_frame_transposed.tail())
- # Teraz zróbmy 5 osobnych DataFrame, podzielimy jest według "k". Z tych zbiorów będziemy potem zrobic klasyfikatory.
- data_frames_list = [] # tutaj bedzie lsita 5 klastrow (0..4)
- for i_iter in range(clusters):
- data_frames_list.append(pd.DataFrame())
- data_frames_list[i_iter] = data_frame_transposed.loc[data_frame_transposed['k'] == i_iter]
- print("\n\n\n Rozdzielone zbiory:", data_frames_list) # W każdym klastrze sa inne cechy!
- # Obracamy zbiory jak poptrzenio, kazdy zbior, bo do uczenia trzeba odwrocic
- # No i skasowac parametr "k"
- for i, df in enumerate(data_frames_list):
- data_frames_list[i] = data_frames_list[i].iloc[:, :-1] # Usuwamy osatnią kolumne z danego zbioru czyli numer klastra "k"
- data_frames_list[i] = data_frames_list[i].transpose() # obracmy żeby mieć pierwony kształ który jest przeznacozny do uczenia
- # Zobaczmy jakis przykladowy zbior do uczenia zbudowany z klastra pierwszego, czlyi o indexie 0
- print("\n\n\nGotowy dataframe do uczenia\n", data_frames_list[0])
- ### Przystąpmy do uczenia maszynowego za pomocą klasfyikatoraa knn z głosowaniem wiekszosciowym ###
- clfs = []
- for i in range(clusters):
- clfs.append(MLPClassifier(alpha=1, max_iter=1000)) # Tu mozna wprowadzic dowoly rodzaj klasyfikatora
- # Niestety, nie znalazłem gotowej funkcji do agragacji klasfyikator z roznymi zbiorami, trzeba napisa recznie
- results = [] # tutaj będą proponowane przez klasfyikatory rozwiazania, 5 zbiorów
- print("\n\n\n\n!!!!!!!!!!!!!!!! Classification !!!!!!!!!!!!!!!!")
- for i, clf in enumerate(clfs): # czli tyle razy ile jest klastrow
- clf.fit(data_frames_list[i], y_train)
- labels_for_train = data_frames_list[i].columns
- X_test_short = X_test[labels_for_train]
- print("\n\ncolumns len:\n ",len(labels_for_train))
- print("\n\nlabels:\n",labels_for_train)
- print("\n\nlabels:\n",labels_for_train)
- print("\n\nx y_test:\n", y_test)
- pred = clf.predict(X_test_short)
- results.append(pred)
- y_test_dataframe = pd.DataFrame(y_test).transpose()
- print("Sugerowane etykiety przez kazdy z estymatorow\n")
- print(pd.DataFrame(results, columns=y_test_dataframe.columns))
- print("Powinno być\n", y_test_dataframe)
- voted_decision = pd.DataFrame(results, columns= y_test_dataframe.columns).mode(axis=0)
- voted_decision = voted_decision.head(1)
- print("\nWygłosowno:\n", voted_decision)
- print("\n\n\nSkutecznosc:")
- print("\nTablica poprawnosci:")
- true_table = voted_decision.reset_index() == y_test_dataframe.reset_index()
- print(true_table)
- print("\nWynik:")
- print(true_table.transpose()[0].value_counts(normalize=True) * 100) # Normalize=True sprawia ze dostajemy wynik w procentach, inaczej byłoby ilościwo
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement