Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.00 KB | None | 0 0
  1.  
  2. library(Boruta)
  3. library(funModeling)
  4. library(arules)
  5. library(rpart)
  6. library(datasets)
  7.  
  8. # Ładujemy pliki
  9. data_row = read.csv(file = 'r/b2.csv')
  10. data_all = data_row[2:(length(data_row))]
  11.  
  12. # Pobieramy nazyw kolumn
  13. cols = colnames(data_all)
  14.  
  15. # Tworzmy obiekt data.frame
  16. df = data.frame(data_all)
  17. # Odzielamy cechy
  18. X = df[,1:ncol(df)-1]
  19. # Oraz nazwy cech
  20. X_cols = colnames(X)
  21. # Odzielamy etykiety próbek
  22. y = df[,ncol(df)]
  23.  
  24. #Tutaj korzystam z zadanego algortmu do ustalenia wag cech
  25. boruta_train <- Boruta(y~.,data=X)
  26. print(boruta_train)
  27.  
  28. # Tablica wag (bedziemy ja rysować)
  29. importance_table = attStats(boruta_train)
  30. plot(boruta_train)
  31.  
  32. # Interesuja nas same średnie z powyższych tablic
  33. importance_mean_list = attStats(boruta_train)[,1]
  34. print(attStats(boruta_train))
  35.  
  36. # Uporządkujmy co mamy, czyli połączmy waga cechy + nazwa cechy
  37. cols_importance = data.frame(importance=importance_mean_list, feature=X_cols)
  38.  
  39.  
  40. print(cols_importance) # - tablica ze dokumentu ręcznego
  41. # Dyskretyzacja
  42. discretized_features = discretizeDF(cols_importance, default = list(method = "cluster", breaks = 2)) # dykretyzacja,
  43. # Sortowanie (tylko w celach etetycznych)
  44. discretized_features = discretized_features[order(discretized_features$importance),]
  45. print(discretized_features)
  46.  
  47.  
  48. ### Grupowanie ###
  49. # Będzimy rozdzielać cechy wg przedziałów,
  50. groups = list()
  51. intervals = unique(discretized_features[1])
  52. for (i in 1:nrow(intervals)){
  53. # lista dla i-przedzialu
  54. single_interval_values = subset( discretized_features,importance==intervals[i,1] )
  55. print(single_interval_values)
  56. str = single_interval_values[,2]
  57. groups[[i]] = str
  58. }
  59.  
  60. print(groups)
  61.  
  62. # Dla kazdej grupy policzymy nowa liste cech, cech będzie tyle ile powstałych grup
  63. new_X = data.frame(V1 = 1:length(y)) # tworzymy liste o dlugosc ilosci danych
  64. for (i in 1:length(groups)){
  65. ### sortowanie po kolumnahc - > X[ , order(names(X))]
  66. group = groups[[i]] # wezmy grupe cech np WC.TA i S.TA
  67. #paste( unlist(group), collapse=',')
  68. #
  69.  
  70. str = paste( unlist(group), collapse=',')
  71. str_list = strsplit(str,',')
  72. old_features = X[unlist(str_list)] # weźmy pierwotne cechy które przydzielono do tej grupy
  73. weights = cols_importance$importance[cols_importance$feature %in% group] #weźmy obliczone wagi dla tych cech
  74. weights_matrix = data.frame(id=1:length(y), data.frame(t(weights)) ) #utwórzmy macierz mnoznikow
  75. weights_matrix = weights_matrix[1:length(old_features)+1] #odrzućmy iterator (licznik), bo nie jest potrzebny
  76. colnames(weights_matrix) = group
  77.  
  78. # Dane w old_features zmieniły kolejnośc, wiec wszystko wysortujmy po kolumnach.
  79. # Nigdy nie bedzie 2x tego same atrybutu wiec tym sie nie martwimy
  80. old_features = old_features[ , order(names(old_features))]
  81. weights_matrix= weights_matrix[ , order(names(weights_matrix))]
  82. weighted_features = data.frame(old_features * weights_matrix) # pomnózmy cechy * waga
  83. new_feature = rowSums(weighted_features) # zsumujmy pomnożone cechy
  84. new_X[i] = new_feature # i tak powstała nowa cecha która leci do listy new_X
  85. }
  86.  
  87.  
  88. ### TESTOWANIE ###
  89. # podsumujmy co mamy:
  90. # X to cechy originalne
  91. # new_X to cechy wygenerowane wzorem
  92. # y to etykiety (klasa próbki) wspólne dla X oraz new_X.
  93. # To wszystko co nam potrzebne, żeby sprawdzić, czy generowanie cech miało sens czy nie.
  94.  
  95. #dzielenie cech X i new_X na train-test
  96. s_value = sample(1:10, length(y), replace = TRUE) # losujemy liczby od 1-10
  97. #Na przyklad tam gdzie wylosowalismy 1 to bęZdzie testowy zbior, tam gdzie inne to treningowy
  98. #Ale ze mamy mały zbior to zrobmy 2:10, czyli tam gdzie wylosowano 1 i 2 to bedzie testowy.
  99.  
  100. # s_value %in% 3:10 powie nam, gdzie wylosowano liczby np. od 3 do 10
  101. X_train = X[s_value %in% 3:10,]
  102. new_X_train = new_X[s_value %in% 3:10,]
  103. y_train = y[s_value %in% 3:10]
  104.  
  105. X_test = X[s_value %in% 1:2,]
  106. new_X_test = new_X[s_value %in% 1:2,]
  107. y_test = y[s_value %in% 1:2]
  108.  
  109. length(y_train) + length(y_test) == length(y) # musi dac true, wtedy wiemy ze korzystamy ze wszystkich dostepnych danych
  110.  
  111. # uczenie 1 drzewa decyzyjnego (rpart https://www.rdocumentation.org/packages/rpart/versions/4.1-15/topics/rpart ):
  112. tree <- rpart(y_train~., X_train, method="class") # “class” argument tells it is a classification tree
  113. set_1_predict = predict(tree, X_test, type = "class") # predykcja klas
  114. # uczenie 2:
  115. tree2 <- rpart(y_train~., new_X_train, method="class")
  116. set_2_predict = predict(tree2, new_X_test, type = "class") # predykcja klas dla nowego wektora cech
  117.  
  118. #p Prownanie czy etykety dobrze zostały przewidziane
  119. output_matrix1 = (y_test == set_1_predict)
  120. single_output1 = table(output_matrix1)[["TRUE"]]/ length(y_test)*100 # obliczenie skuteczności ilość poprawnych / ilość ogólna * 100%
  121. print("WYNIK bez modyfikacji:")
  122. print(single_output1)
  123.  
  124. #porownanie czy etykety dobrze zostały przewidziane
  125. output_matrix2 = (y_test == set_2_predict)
  126. single_output2 = table(output_matrix2)[["TRUE"]]/ length(y_test)*100
  127. print("WYNIK po modyfikacji:")
  128. print(single_output2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement