Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.58 KB | None | 0 0
  1. import csv
  2.  
  3. from numpy import mean, std, var
  4. from pandas import read_csv
  5. from pandas import DataFrame
  6. from pandas import concat
  7. from sklearn.ensemble import AdaBoostClassifier
  8. from sklearn.neighbors import KNeighborsClassifier
  9. from sklearn.model_selection import train_test_split, RepeatedKFold, KFold
  10.  
  11. ### load data ###
  12. # ładujemy dane z pliku.tab
  13. # format lini: 56(nr robota) 15(nr pomiaru) 14(siła 1) 15(siła 2) -35(siła 3) -38(moment 1) 35(moment 2) 1(moement 3) fr_collision(rezultat)
  14. from sklearn.tree import DecisionTreeClassifier
  15.  
  16. raw_data_without_headers = [] # robimy pustą listę, do której będziemy sobie wrzucać dane
  17. with open(
  18. 'data/robot_lp1_modIdTp.tab') as data_tab: # taki zapis w pythonie "jeśli otworzysz plik <jakis plik> i wrzucisz treść do <jakaś_zmienna> to wykonaj poniższe linijki",
  19. # śmiało możesz mowić, ze znalazłeś taki zapis w dokumentacji i go wykorzystałeś. Taki zapis jest wygodny bo nie trzeba psrawdzać czy udało się otworzyć plik.
  20. rows = csv.reader(data_tab, dialect='excel-tab',
  21. delimiter='\t') # opakowujemy dane w specjalny format za pomocą funkcji csv.reader(), bo wygodnie sie przechodzi do kolejnych linijek, delimiter to znak odstępu pomiędzy danymi, '\t' to tabulator
  22. for i in rows: # przechodzimy po kolejnych linijkach
  23. if len(
  24. i) == 1: # jeśli nasza linijka ma tylko jedną daną np i=["tresc"] to tylko wypisujemy ze jest to header, pewnie da sie to zrobic bardziej elegancko, no ale tak mi było szybciej bez patrzenia w dokumentacje
  25. print("header ommiting")
  26. else:
  27. i[0] = i[0].split(' ')[
  28. 1] # [id, time] -> time # jako, ze zamiasta tablulatora są też spacje (to jest jakiś błąd zapisu w pliku pewnie) to naprawiamy: dzielimy string pomiędzy spacjami i bieżemy ten z indexem 1 (czyli drugi od lewej)
  29. Mfz, res = i[6].split(
  30. ' ') # tu od razy wrzucamy do 2 zmienych, bo i[6].split(' ') to ciąg na przykład "-1 normal", więc da nam 2 ciągi: "-1" oraz "normal"
  31. i[6] = Mfz # napistdey "-1 normal" -> "-1"
  32. i.append(
  33. res) # dodajemy kolejną kolumne z rezultatami takimi jak "normal", wtedy z "-1 1 51 -4 -1 -1" zrobi sie "-1 1 51 -4 -1 -1 normal"
  34. raw_data_without_headers.append(i) # wrzucamy kolejno naprawione linijki do wczesniej utworzonej listy
  35.  
  36. # w tym miejscu mamy już naprawioną listę robotow w zmiennej o nazwie raw_data_without_headers.
  37.  
  38. data_frame = DataFrame(
  39. raw_data_without_headers) # tworzymy "ramke danych", żeby zobaczyć dane do uczenia (nie musimy tego robić w ten sposób, ale zajrzyjmy do zbioru)
  40. data_frame.columns = ['t', 'Fx', 'Fy', 'Fz', 'MFx', 'MFy', 'MFz',
  41. 'res'] # dodajemy opisy kolumn według opisu zbioru, żeby wiedzieć co jest czym
  42. del data_frame[
  43. 't'] # kasujemy daną która opisuje "kolejną informacje w czasie". Dla każdego robota jest 15 takich pomiarów, ich iteracja raczej nie jest potrzeba do uczenia.
  44. print(data_frame.head(5)) # zobaczmy pierwsze 5 // pierwszy: 0 -1 -1 63 -3 -1 0 normal
  45. print(data_frame.tail(15)) # zobaczmy ostatnie 15 // ostatni: 1319 -13 2 15 -25 -25 6 fr_collision
  46. # czyli jak widać dane udało sie naprawić i byłby gotowe do uczenia, ale ze my chcemy z nich zrobić dane agregacyjne, które za chwile będziemy generować
  47.  
  48.  
  49. iter_15 = 0 # zmienna za pomoca której będziemy sprawdzać każde 15 linijek w liście (co 15 iteracji będziemy cośtam liczyć)
  50.  
  51. # utorzymy puste listy na dane, każda na końcu powinna mieć wielkość: długość_pliku_bez_nagówka/liczba_zapisów_dla_robota
  52. # czyli dla pliku robot_lp1_modIdTp bez nagłówka: 1320/15= 88. Zatem będziemy mieli 88 danych w kazej liście (czyli 1 robot = 1 linijka w każdym zbiorze).
  53.  
  54.  
  55. # 15 wartsci
  56. Fx_15_values_arr = []
  57. Fy_15_values_arr = []
  58. Fz_15_values_arr = []
  59. MFx_15_values_arr = []
  60. MFy_15_values_arr = []
  61. MFz_15_values_arr = []
  62.  
  63. # Listy std dla każdgo z robotow
  64. Fx_std_arr = []
  65. Fy_std_arr = []
  66. Fz_std_arr = []
  67. MFx_std_arr = []
  68. MFy_std_arr = []
  69. MFz_std_arr = []
  70.  
  71. # vary std dla każdgo z robotow
  72. Fx_var_arr = []
  73. Fy_var_arr = []
  74. Fz_var_arr = []
  75. MFx_var_arr = []
  76. MFy_var_arr = []
  77. MFz_var_arr = []
  78.  
  79. # Listy średnich dla każdgo z robotow
  80. Fx_avg_arr = []
  81. Fy_avg_arr = []
  82. Fz_avg_arr = []
  83. MFx_avg_arr = []
  84. MFy_avg_arr = []
  85. MFz_avg_arr = []
  86.  
  87. # Listy minimów dla każdgo z robotow
  88. Fx_min_arr = []
  89. Fy_min_arr = []
  90. Fz_min_arr = []
  91. MFx_min_arr = []
  92. MFy_min_arr = []
  93. MFz_min_arr = []
  94.  
  95. # Listy maximow dla każdgo z robotow
  96. Fx_max_arr = []
  97. Fy_max_arr = []
  98. Fz_max_arr = []
  99. MFx_max_arr = []
  100. MFy_max_arr = []
  101. MFz_max_arr = []
  102.  
  103. # Rezultaty, tutaj pamiętamy, że dana wynikowa (np"collision" czy tam "normal") jest w zbiorze taka sama dla każdych 15 kolejnych pomiarów
  104. res_arr = []
  105.  
  106. # Przystąpmy do wygenerowania danych agregacyjnych:
  107. for i, trial in data_frame.iterrows():
  108. iter_15 = iter_15 + 1
  109.  
  110. Fx_15_values_arr.append(int(data_frame.loc[i, "Fx"]))
  111. Fy_15_values_arr.append(int(data_frame.loc[i, "Fy"]))
  112. Fz_15_values_arr.append(int(data_frame.loc[i, "Fz"]))
  113. MFx_15_values_arr.append(int(data_frame.loc[i, "MFx"]))
  114. MFy_15_values_arr.append(int(data_frame.loc[i, "MFy"]))
  115. MFz_15_values_arr.append(int(data_frame.loc[i, "MFz"]))
  116.  
  117. if iter_15 == 15: # tutaj ootraliśmy do 15 linijki danych, czyli cały robot zstdowany. Czyli co 15 linijek liczmy stdy itd
  118. print("Iteracji:", iter_15)
  119. Fx_avg_arr.append(float(mean(Fx_15_values_arr)))
  120. Fy_avg_arr.append(float(mean(Fy_15_values_arr)))
  121. Fz_avg_arr.append(float(mean(Fz_15_values_arr)))
  122. MFx_avg_arr.append(float(mean(MFx_15_values_arr)))
  123. MFy_avg_arr.append(float(mean(MFy_15_values_arr)))
  124. MFz_avg_arr.append(float(mean(MFz_15_values_arr)))
  125.  
  126. Fx_min_arr.append(float(min(Fx_15_values_arr)))
  127. Fy_min_arr.append(float(min(Fy_15_values_arr)))
  128. Fz_min_arr.append(float(min(Fz_15_values_arr)))
  129. MFx_min_arr.append(float(min(MFx_15_values_arr)))
  130. MFy_min_arr.append(float(min(MFy_15_values_arr)))
  131. MFz_min_arr.append(float(min(MFz_15_values_arr)))
  132.  
  133. Fx_max_arr.append(float(max(Fx_15_values_arr)))
  134. Fy_max_arr.append(float(max(Fy_15_values_arr)))
  135. Fz_max_arr.append(float(max(Fz_15_values_arr)))
  136. MFx_max_arr.append(float(max(MFx_15_values_arr)))
  137. MFy_max_arr.append(float(max(MFy_15_values_arr)))
  138. MFz_max_arr.append(float(max(MFz_15_values_arr)))
  139.  
  140. # Compute the standard deviation.
  141. Fx_std_arr.append(float(std(Fx_15_values_arr)))
  142. Fy_std_arr.append(float(std(Fy_15_values_arr)))
  143. Fz_std_arr.append(float(std(Fz_15_values_arr)))
  144. MFx_std_arr.append(float(std(MFx_15_values_arr)))
  145. MFy_std_arr.append(float(std(MFy_15_values_arr)))
  146. MFz_std_arr.append(float(std(MFz_15_values_arr)))
  147.  
  148. # Compute the var.
  149. Fx_var_arr.append(float(var(Fx_15_values_arr,ddof=1)))
  150. Fy_var_arr.append(float(var(Fy_15_values_arr,ddof=1)))
  151. Fz_var_arr.append(float(var(Fz_15_values_arr,ddof=1)))
  152. MFx_var_arr.append(float(var(MFx_15_values_arr,ddof=1)))
  153. MFy_var_arr.append(float(var(MFy_15_values_arr,ddof=1)))
  154. MFz_var_arr.append(float(var(MFz_15_values_arr,ddof=1)))
  155.  
  156. iter_15 = 0
  157.  
  158. # Skoro mamy juz wszystkie dane zapisane w tablicach to zerujmy dane tymczasowe
  159. Fx_15_values_arr = []
  160. Fy_15_values_arr = []
  161. Fz_15_values_arr = []
  162. MFx_15_values_arr = []
  163. MFy_15_values_arr = []
  164. MFz_15_values_arr = []
  165.  
  166. res_arr.append(str(data_frame.loc[
  167. i, "res"])) # jesze zbudujmy sobie listę wyników, Skoro dla każdych 15 warości mamy to samo, to możemy zapisywac rezulttat z 15 liniki
  168.  
  169. # A poniżej zobczmy czy wszystkie zbiory są równe (każdy ma mieć 88 wg naszych obliczeń z linijki 40, tyle ile jest robotów)
  170. print("Dlugosci kilku wybranych list:")
  171. print(len(Fx_avg_arr))
  172. print(len(Fx_max_arr))
  173. print(len(Fx_min_arr))
  174. print(len(MFx_avg_arr))
  175. print(len(res_arr))
  176.  
  177. print("Pierwsza średnia danej Fx, czyli dla robota 1")
  178. print(Fx_avg_arr[0])
  179.  
  180. data_tab = [] # nowa pusta lista, tutaj na postawie tych powyższych list zbudujemy jedną, taka która powoli na proste wygenerwanie poprawnego "DataFrame"
  181. for i in range(len(
  182. Fx_avg_arr)): # len(Fx_avg_arr),czyli długość(Fx_avg_arr) da nam 88,a range(88) sprawi, że for będzie iterować od 0 do 88
  183. data_tab.append([Fx_avg_arr[i], Fy_avg_arr[i], Fz_avg_arr[i],
  184. Fx_max_arr[i], Fy_max_arr[i], Fz_max_arr[i],
  185. Fx_min_arr[i], Fy_min_arr[i], Fz_min_arr[i],
  186. Fx_std_arr[i], Fy_std_arr[i], Fz_std_arr[i],
  187. Fx_var_arr[i], Fy_var_arr[i], Fz_var_arr[i],
  188.  
  189. MFx_avg_arr[i], MFy_avg_arr[i], MFz_avg_arr[i],
  190. MFx_max_arr[i], MFy_max_arr[i], MFz_max_arr[i],
  191. MFx_min_arr[i], MFy_min_arr[i], MFz_min_arr[i],
  192. MFx_std_arr[i], MFy_std_arr[i], MFz_std_arr[i],
  193. MFx_var_arr[i], MFy_var_arr[i], MFz_var_arr[i],
  194.  
  195. res_arr[i]])
  196.  
  197. print("Lista data_Tab") # zobaczmy jak to wygląda
  198. print(data_tab[0]) # zobaczmy jak to wygląda, iterujemy od zera
  199. print(data_tab[1])
  200. print(data_tab[2])
  201. # print(data_tab[87]) # linika ostatnia
  202.  
  203. # Dane juz mamy, teraz to opakujmy w specjalne typy żeby móc wrzucić do klasyfikatorów
  204.  
  205. df = DataFrame(
  206. data_tab) # generujemy obiekt (zbior danych) DataFrame, który jest przeznaczony do uczenia maszynowgo w bilbiotekach ktorych uzywamy.
  207. df.columns = ["Fx_avg", "Fy_avg", "Fz_avg",
  208. "Fx_max", "Fy_max", "Fz_max",
  209. "Fx_min", "Fy_min", "Fz_min",
  210. "Fx_std", "Fy_std", "Fz_std",
  211. "Fx_var", "Fy_var", "Fz_var",
  212.  
  213. "MFx_avg", "MFy_avg", "MFz_avg",
  214. "MFx_max", "MFy_max", "MFz_max",
  215. "MFx_min", "MFy_min", "MFz_min",
  216. "MFx_std", "MFy_std", "MFz_std",
  217. "MFx_var", "MFy_var", "MFz_var",
  218.  
  219. "res"] # dodajmy opisy kolumn żeby wiedzieć co jest czym
  220.  
  221. print("Ramka danych z danymi aggr:") # zobaczmy jak to wgyląda
  222. print(df.head(5))
  223. print(df.tail(5))
  224.  
  225. Y = df["res"] # zapisyjemy etykiety do uczenia, "normal" "colision" itd do osobnej zmiennej
  226. del df["res"] # wyrzucamy etykiety z wektorów cech bo to musza być w osobnmy zbiorze
  227. X = df # zapisujemy wektory cech do X
  228.  
  229. print("Split data...")
  230. kf = KFold(n_splits=10)
  231.  
  232. print("Init classifiers...")
  233. ada = AdaBoostClassifier(n_estimators=100)
  234. knn_1 = KNeighborsClassifier(n_neighbors=1)
  235. knn_10 = KNeighborsClassifier(n_neighbors=10)
  236. d_tress = DecisionTreeClassifier()
  237.  
  238. print("Init outpusts...")
  239. output_ada = []
  240. output_knn_1 = []
  241. output_knn_10 = []
  242. output_d_tress = []
  243.  
  244. class_iterator = 1
  245. for train_indexes, test_indexes in kf.split(X):
  246. print("\n\n\n################ ada ", class_iterator, '/', kf.n_splits, "################")
  247. print("train idexes:", train_indexes, "\n test indexes:", test_indexes)
  248. print("\n test Y:", Y.loc[test_indexes])
  249. print("\n test X:", X.loc[test_indexes])
  250.  
  251. X_train = X.loc[train_indexes]
  252. Y_train = Y.loc[train_indexes]
  253. X_test = X.loc[test_indexes]
  254. Y_test = Y.loc[test_indexes]
  255.  
  256. ada.fit(X_train, Y_train)
  257. knn_1.fit(X_train, Y_train)
  258. knn_10.fit(X_train, Y_train)
  259. d_tress.fit(X_train, Y_train)
  260.  
  261. score_ada = ada.score(X_test, Y_test)
  262. score_knn_1 = knn_1.score(X_test, Y_test)
  263. score_knn_10 = knn_10.score(X_test, Y_test)
  264. score_d_tress = d_tress.score(X_test, Y_test)
  265.  
  266. output_ada.append(score_ada * 100)
  267. output_knn_1.append(score_knn_1 * 100)
  268. output_knn_10.append(score_knn_10 * 100)
  269. output_d_tress.append(score_d_tress * 100)
  270.  
  271. class_iterator += 1
  272.  
  273. print("################",
  274. "ada=", score_ada * 100, "% ",
  275. "knn_1=", score_knn_1 * 100, "% ",
  276. "knn_10=", score_knn_10 * 100, "% ",
  277. "d_tress=", score_d_tress * 100, "% ",
  278. "################")
  279.  
  280. print("\n\n\n################ ############ ################")
  281. print("################ Output data ################")
  282. print("################ ################ ################")
  283.  
  284. print('Ada res:', output_ada)
  285. print('Final ada', mean(output_ada))
  286.  
  287. print('Knn-1 res:', output_knn_1)
  288. print('Final knn-1', mean(output_knn_1))
  289.  
  290. print('Knn-10 res:', output_knn_10)
  291. print('Final knn-10', mean(output_knn_10))
  292.  
  293. print('d_tress res:', output_d_tress)
  294. print('Final d_tress', mean(output_d_tress))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement