Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Megre pbiecek -> mechelewskim #1

Merged
merged 44 commits into from
Oct 21, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
d8b77a6
Create magdalena_baracz
MagdalenaBaracz Oct 12, 2017
52518a4
Removed wrong file
magdafm Oct 13, 2017
04784d5
Project1 files
magdafm Oct 13, 2017
067b59a
proj01 Łukasz Ławniczak
Oct 13, 2017
f01ea39
Projekt 1 - Artur Minorczyk
Oct 13, 2017
07133cf
Project1_AntonLenartovich
Oct 15, 2017
c6aaaad
Projekt 1 raport,wyniki
czajkowskaa Oct 15, 2017
af753db
Projekt 1 - Anna Niznik
Oct 15, 2017
c8194e8
Projekt 1
franiis Oct 15, 2017
2384489
Projekt 1
ppollakr Oct 15, 2017
bd88947
raport+wyniki
bondyra Oct 15, 2017
75fb6ab
Projekt 1
magda-tatarynowicz Oct 16, 2017
a585a49
Merge pull request #1 from MagdalenaBaracz/master
pbiecek Oct 16, 2017
b7c084e
Merge pull request #2 from UZamkniete/master
pbiecek Oct 16, 2017
d912930
Merge pull request #3 from minorczyka/master
pbiecek Oct 16, 2017
c9d9f0a
Merge pull request #4 from alenartovich/lenartovicha
pbiecek Oct 16, 2017
ed4fd81
Merge pull request #5 from czajkowskaa/master
pbiecek Oct 16, 2017
cd03e7d
Merge pull request #6 from niznikan/master
pbiecek Oct 16, 2017
3fa11ec
Merge pull request #7 from franiis/master
pbiecek Oct 16, 2017
f859aef
Merge pull request #8 from ppollakr/master
pbiecek Oct 16, 2017
3adb7c5
Merge pull request #9 from mechelewskim/master
pbiecek Oct 16, 2017
02d2f01
Merge pull request #10 from JakubBondyra/master
pbiecek Oct 16, 2017
7e34081
Kamil Romaszko projekt 1
kromash Oct 16, 2017
0fbd031
Projekt 1 Karol Prusinowski
Karol-14 Oct 16, 2017
b30b350
Projekt1
Oct 16, 2017
ee5cb1f
Merge pull request #11 from magda-tatarynowicz/master
pbiecek Oct 16, 2017
f005d63
Raport + txt results
Matiszak Oct 16, 2017
9a2ce48
Merge pull request #12 from Irbis3/master
pbiecek Oct 16, 2017
2a62843
Merge pull request #13 from Karol-14/master
pbiecek Oct 16, 2017
43e75dd
Merge pull request #14 from Matiszak/master
pbiecek Oct 16, 2017
fa063be
Merge pull request #15 from szczawinskik/master
pbiecek Oct 16, 2017
a0fd5d7
Add files via upload
Alkuerissa Oct 16, 2017
205e1ef
Add files via upload
Alkuerissa Oct 16, 2017
beeee2b
Merge pull request #1 from Alkuerissa/Alkuerissa-patch-1
Alkuerissa Oct 16, 2017
5b66685
Delete aleksandra_hernik.pdf
Alkuerissa Oct 16, 2017
02ec164
Add files via upload
Alkuerissa Oct 16, 2017
2cd9930
Delete aleksandra_hernik.txt
Alkuerissa Oct 16, 2017
29a519c
Merge pull request #16 from Alkuerissa/master
pbiecek Oct 16, 2017
9d63bcf
Merge pull request #1 from pbiecek/master
franiis Oct 16, 2017
16283bf
krotka wersja
franiis Oct 16, 2017
ddfac1a
Executive report
ppollakr Oct 16, 2017
41f1729
Merge pull request #17 from franiis/master
pbiecek Oct 16, 2017
1dd6c2d
Merge pull request #18 from ppollakr/master
pbiecek Oct 16, 2017
c28d17d
dane i skrypt generujacy dane dla projektu 1
pbiecek Oct 20, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added Projekty/Anna Niznik/Anna Niznik.pdf
Binary file not shown.
50,001 changes: 50,001 additions & 0 deletions Projekty/Anna Niznik/anna_niznik.txt

Large diffs are not rendered by default.

Binary file not shown.
Binary file added Projekty/Anton Lenartovich/Projekt1.pdf
Binary file not shown.
50,001 changes: 50,001 additions & 0 deletions Projekty/Anton Lenartovich/anton_lenartovich.txt

Large diffs are not rendered by default.

138 changes: 138 additions & 0 deletions Projekty/Kamil Romaszko/kamil_romaszko.Rmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
---
title: "Projekt 1"
author: "Kamil Romaszko"
date: "14 października 2017"
output: pdf_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(gbm)
library(glmnet)
library(randomForest)
library(caret)
library(xgboost)
library(dplyr)
library(tidyr)
library(reshape)
library(DiagrammeR)
```

```{r echo=FALSE}
set.seed(7)
data_train <- read.csv("zbior_uczacy.txt", header=TRUE, sep=";")
k <- 5
```

## Analiza zmiennych
Analizowane dane zawierają 50 zmiennych niezależnych oraz 1 zmienną zależną od reszty - informację o przynależności do klasy "+" lub "-". Co ważne, klasy są zrównoważone. Moim pierwszym krokiem była selekcja najbadziej istotnych zmiennych objaśniających. W tym celu użyłem metody drzew losowych oraz fukncji _importance_ wywołanej na wygenerowanym modelu. Zaletą użytej metody jest to, że jest ona w stanie wykryć nieliniowe zależności pomiędzy zmiennymi.

```{r cache=TRUE}
randomForest_fit <- randomForest(y~., data=data_train)
varImpPlot(randomForest_fit)

importance_fit <- importance(randomForest_fit)
```

Powyższy wykres przedstawia istotność zmiennych. Na jego podstawie możemy stwierdzić, że tylko kilka pierwszych zmiennych jest istotna. Możemy zatem uprościć dane - ja do dalszych rozważać wybrałem 10 najbardziej istotnych zmiennych.


```{r echo=FALSE, fig.height = 5, fig.width = 8, fig.align = "center"}
plot(y~M1,data_train)
plot(y~W1,data_train)
```
Powyższy wykres przedstawia zależność zmiennej objaśnienaj od najistotniejszej zmiennych "_M1_" i "_W1_". Widać, że zależność nie jest liniowa.


\newpage
## Testowanie modeli

Po analizie danych przetestowałem, które metody najlepiej się sprawdzają. Aby przetestować wybrane metody, dane podzieliłem na zbiór treningowy i testowy w stosunku 4:1.

Każdy model wyznacza prawdopodobieństwo przynależności do klasy "+". Do oceny modelu, dokonujemy predykcji na zbiorze testowym, a następnie wybieramy 20% najabrdziej prawdopodobnych obserwacji i mierzymy procent obserwacji, które faktycznie należą do klasy "+". Im więcej poprawnie przydzielonych obserwacji tym lepiej.

```{r echo=FALSE}
slices <- createFolds(data_train$y, k=5)
train <- data_train[unlist(slices[-1]),]
test <- data_train[unlist(slices[1]),]

importance_order <- order(importance_fit, decreasing=TRUE)
selected_variables <- 1 + importance_order[1:10]
train_selected <- train[,c(1,selected_variables)]
test_selected <- test[,c(1,selected_variables)]
```

## Model xgboost

Wybrana przeze mnie metoda klasyfikacji to eXtreme Gradient Boosting. Polega ona budowaniu sekwencji drzew optymalizowanych na klasyfikacje przypadków z którymi nie radziły sobie wcześniejsze drzewa. Metoda ta, tak jak inne modele oparte na drzewach, dobrze nadaje się do wykrywania nieliniowych zależności, dlatego postanowiłej jej użyć dla zadanego problemu.

Funkcja budująca model posiada jeden wymagany parametr _nround_ który określa maksymalną liczbę iteracji. W moich testach przyjąłem _nround=500_ co daje dostatecznie złożony model, a jednocześnie sprawia, że wyliczany jest on stosunkowo szybko.

Metoda przyjmuje także opcjonalnie parametry od których zależy dokładność modelu. Postanowiłem zbadać jak wpływają one na dokładność.

_max_depth_ - określa maksymalną głębokość drzewa. Im większa głębokość, tym bardziej złożony będzie model.

_eta_ - określa krzywą uczenia. Stosowany, żeby zapobiegać przeuczeniu modelu. Im mniejszy, tym model będzie bardziej uogólniony.


## Dobór parametrów

```{r cache=TRUE, echo=FALSE}
matrix_train <- data.matrix(train_selected)
matrix_train[,1] <- matrix_train[,1] - 1
matrix_test <- data.matrix(test_selected)
matrix_test[,1] <- matrix_test[,1] - 1

depth <- c(1, 2, 3, 4)
eta <- seq(0.1, 0.3, 0.05)
C <- matrix(nrow=length(depth),ncol=length(eta))
for(i in 1:length(depth)) {
for(j in 1:length(eta)) {
boost_model <- xgboost(data=matrix_train[,-1], label=matrix_train[,1],objective="binary:logitraw", nrounds = 500,
max_depth=depth[i], eta = eta[j], verbose=0)
prob <- predict(boost_model, matrix_test[,-1])
ordered_selected <- order(prob, decreasing = TRUE)
C[i,j] <- mean(matrix_test[ordered_selected,1][1:nrow(matrix_test)/5])
}

}

colnames(C) <- eta

melted <- melt(C)
colnames(melted) <- c("depth", "eta", "precision")

ggplot(melted, aes(eta,depth)) +
geom_tile(aes(fill = precision)) +
geom_text(aes(label = round(precision, 3))) +
scale_fill_gradient(low = "white", high = "red") +
scale_x_continuous(breaks = melted$eta)
```

Dla wybranych wartości parametrów wygenerowałem modele oraz wyznaczyłem ich dokładność. Powyższa heatmapa pokazuje zależność jakości modelu od przyjętych parametrów. Na jego podstawie wybrałem _max_depth=1_ oraz _eta=0.15_. Dla tak wybranych parametrów model osiągnął wynik 85.5% co daje najlepszy z uzyskanych wyników.

## Podsumowanie
Dla tak wybranych parametrów dokonałem predykcji dla zbioru testowego.
```{r echo=FALSE}
data_train <- read.csv("zbior_uczacy.txt", header=TRUE, sep=";")
data_test <- read.csv("zbior_testowy.txt", header=TRUE, sep=";")

importance_order <- order(importance_fit, decreasing=TRUE)
selected_variables <- importance_order[1:10]
train_selected <- data_train[,c(1,1 + selected_variables)]
test_selected <- data_test[,selected_variables]

matrix_train <- data.matrix(train_selected)
matrix_train[,1] <- matrix_train[,1] - 1
matrix_test <- data.matrix(test_selected)
```

```{r}
boost_model <- xgboost(data=matrix_train[,-1], label=matrix_train[,1],
objective="binary:logistic", nrounds = 500,
max_depth=1, eta = 0.15, verbose=0)
score <- predict(boost_model, matrix_test)
ordered <- order(score, decreasing = TRUE)
result <- cbind(data_test, score)
write.table(result, file = "kamil_romaszko.txt", sep=";")
```
Binary file added Projekty/Kamil Romaszko/kamil_romaszko.pdf
Binary file not shown.
Loading