Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.16 KB | None | 0 0
  1. import csv
  2. import pandas as pd
  3. from sklearn.cluster import KMeans
  4. from sklearn.ensemble import VotingClassifier
  5. from sklearn.model_selection import train_test_split
  6. from sklearn.neighbors import KNeighborsClassifier
  7.  
  8.  
  9.  
  10. # Zapiszmy któryś plik do zmiennej data
  11. from sklearn.neural_network import MLPClassifier
  12.  
  13. data = [] # Tworzymy pustą listę
  14. headers = []
  15. with open("data/leukemia.tab.txt") as file: # Zapis, żeby otworzyć plik
  16.     reader = csv.reader(file, delimiter='\t') # Ustalenie obiektu to wczytywania z ustawieniem, że w pliku dane podzielione są tabulatorem
  17.     for row in reader: # Iteracja, czyli w pętli lecimy po kazej linijce pliku od góry do dołu
  18.        if len(row) > 5: # Jeżeli w linijce są mniej niż 2 dane to znaczyny, że jest to nagłowek, więc pomijamy
  19.            data.append(row) # Linijke dłuższa niż 2 dodajemy do naszej listy 'data'
  20.        else:
  21.            headers.append(row[0].split(" ")[0]) # odzielamy potrzebne od niepotrzebnego
  22. print("Headrs: ", headers)
  23. del headers[0] # niepotrzebne krzaki "'ATTRIBUTES 7130',"
  24. del headers[-1] # krzaki " 'OBJECTS 72'", -1 czyli ostatni element
  25.  
  26. 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
  27.  
  28.  
  29. # Przekształcamy do typu DataFrame żeby lepiej sie operowało danymi.
  30. # 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.
  31. # Na przykład transponowanie.
  32. print("\nPrzed obroceniem:")
  33. data_frame = pd.DataFrame(data, columns=headers)
  34. Y = data_frame.iloc[:,-1] # Zapisujemy etykiety do innej zmieneej (na potem), -1 oznacza indeks ostatniego elementu
  35. data_frame = data_frame.iloc[:, :-1] # Usuwamy etykiety z glownego zbioru, nie sa potrzebne obecnie.
  36. # Czyli zapisujemy zbiór do nowej zmiennej bez ostatniej kolumny.
  37. print(data_frame.head())  # Zobaczmy kilka pierwszych (5) linijek
  38. print(data_frame.tail())  # Zobaczmy kilka ostatnich
  39. X = data_frame
  40. print("etykiety", Y)
  41.  
  42.  
  43. #Podzielmy od razu zbiory na train i test, testowej nie ruszamy aż do waldiacji klasyfikatorow
  44. X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=42)
  45.  
  46.  
  47. # Transponowanie macierzy (tak to sie chyba matematycznie nazywa)
  48. data_frame_transposed = X_train.transpose()
  49. print("\nPo obroceniu:")
  50. print(data_frame_transposed.head())
  51. print(data_frame_transposed.tail(), '\n\n\n')
  52.  
  53. # Zagregujmy dane za pomocą metody kmeans, robimy 5 klastrów
  54. clusters = 4 # Tyle bedziemy robic teraz klastrow
  55. kmeans = KMeans(n_clusters=clusters).fit_predict(data_frame_transposed)
  56. # traz w means mamy listę, gdzie oznaczno kolejno przynależność do zbioru
  57.  
  58. # Dla każdego z klastrów  robimy liste
  59. print("Lista przynależności do zbioru (0-4, bo mamy 5 zbiorów)")
  60. print(kmeans)
  61. print("Dlugosc: ", len(kmeans))
  62.  
  63. ### Podzielmy teraz nasz cały zbirów ze względu na przenależność do danego klastru. ###
  64. # Teraz wiemy, która cecha najeży do danego klastra.
  65. # Najpierw dołączymy rezulalt do zbioru obróconego.
  66. data_frame_transposed['k'] = kmeans
  67. print(data_frame_transposed.head())  # Zobaczmy czy index "k" klastra sie dodał.
  68. print(data_frame_transposed.tail())
  69. # Teraz zróbmy 5 osobnych DataFrame, podzielimy jest według "k". Z tych zbiorów będziemy potem zrobic klasyfikatory.
  70. data_frames_list = [] # tutaj bedzie lsita 5 klastrow (0..4)
  71. for i_iter in range(clusters):
  72.     data_frames_list.append(pd.DataFrame())
  73.     data_frames_list[i_iter] = data_frame_transposed.loc[data_frame_transposed['k'] == i_iter]
  74. print("\n\n\n Rozdzielone zbiory:", data_frames_list)  # W każdym klastrze sa inne cechy!
  75.  
  76. # Obracamy zbiory jak poptrzenio, kazdy zbior, bo do uczenia trzeba odwrocic
  77. # No i skasowac parametr "k"
  78. for i, df in enumerate(data_frames_list):
  79.     data_frames_list[i] = data_frames_list[i].iloc[:, :-1]  # Usuwamy osatnią kolumne z danego zbioru czyli numer klastra "k"
  80.     data_frames_list[i] = data_frames_list[i].transpose() # obracmy żeby mieć pierwony kształ który jest przeznacozny do uczenia
  81. # Zobaczmy jakis przykladowy zbior do uczenia zbudowany z klastra pierwszego, czlyi o indexie 0
  82. print("\n\n\nGotowy dataframe do uczenia\n", data_frames_list[0])
  83.  
  84.  
  85.  
  86. ### Przystąpmy do uczenia maszynowego za pomocą klasfyikatoraa knn z głosowaniem wiekszosciowym ###
  87. #
  88. # Dla każdego z klastrow robimy klasyfikator:
  89. # clf1 = KNeighborsClassifier()
  90. # clf2 = KNeighborsClassifier()
  91. # clf3 = KNeighborsClassifier()
  92. # clf4 = KNeighborsClassifier()
  93. # clf5 = KNeighborsClassifier()
  94. # clfs = [clf1,clf2,clf3, clf4, clf5]
  95. clfs = []
  96. for i in range(clusters):
  97.     clfs.append(MLPClassifier(alpha=1, max_iter=1000))
  98. # Niestety, nie znalazłem gotowej funkcji do agragacji klasfyikator z roznymi zbiorami, trzeba napisa recznie
  99.  
  100.  
  101. results = [] # tutaj będą proponowane przez klasfyikatory rozwiazania, 5 zbiorów
  102. print("\n\n\n\n!!!!!!!!!!!!!!!! Classification !!!!!!!!!!!!!!!!")
  103. for i, clf in enumerate(clfs): # czli tyle razy ile jest klastrow
  104.     clf.fit(data_frames_list[i], y_train)
  105.     labels_for_train = data_frames_list[i].columns
  106.     X_test_short = X_test[labels_for_train]
  107.  
  108.     print("\n\ncolumns len:\n ",len(labels_for_train))
  109.     print("\n\nlabels:\n",labels_for_train)
  110.     print("\n\nlabels:\n",labels_for_train)
  111.     print("\n\nx y_test:\n", y_test)
  112.     pred = clf.predict(X_test_short)
  113.     results.append(pred)
  114.  
  115. y_test_dataframe = pd.DataFrame(y_test).transpose()
  116. print("Sugerowane etykiety przez kazdy z estymatorow\n")
  117. print(pd.DataFrame(results, columns=y_test_dataframe.columns))
  118.  
  119. print("Powinno być\n", y_test_dataframe)
  120.  
  121.  
  122. voted_decision = pd.DataFrame(results, columns= y_test_dataframe.columns).mode(axis=0)
  123. voted_decision = voted_decision.head(1)
  124. print("\nWygłosowno:\n", voted_decision)
  125.  
  126.  
  127. print("\n\n\nSkutecznosc:")
  128. print("\nTablica poprawnosci:")
  129. true_table = voted_decision.reset_index() == y_test_dataframe.reset_index()
  130. print(true_table)
  131. print("\nWynik:")
  132. print(true_table.transpose()[0].value_counts(normalize=True) * 100) # Normalize=True sprawia ze dostajemy wynik w procentach, inaczej byłoby ilościwo
  133.  
  134. # Teraz sprawdzmy jaka osciagnelismy skutecznosc przez głosowanie
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement