CS-7863-Sci-Stat-Proj-6/Schrick-Noah_Homework-6.R

139 lines
4.5 KiB
R

# Project 6 for the University of Tulsa's CS-7863 Sci-Stat Course
# Penalized Machine Learning
# Professor: Dr. McKinney, Spring 2023
# Noah L. Schrick - 1492657
# 1. Penalized Regression and Classification
## a. Modified Ridge classification for LASSO penalties
### Add cross-validation to tune penalty param
### Use npdro simulated data to test
### Compare with Ridge
### Compare with Random Forest
if (!require("randomForest")) install.packages("randomForest")
library(randomForest)
if (!require("ranger")) install.packages("ranger")
library(ranger)
rf_comp <- function(train){
rf<-randomForest(as.factor(train$class) ~ .,data=train, ntree=5000,
importance=T)
print(rf) # error
rf_imp<-data.frame(rf_score=importance(rf, type=1))
#dplyr::arrange(rf_imp,-MeanDecreaseAccuracy)
dplyr::slice_max(rf_imp,order_by=MeanDecreaseAccuracy, n=20)
rf2<-ranger(as.factor(train$class) ~ ., data=train, num.trees=5000,
importance="permutation")
print(rf2) # error
rf2_imp<-data.frame(rf_score=rf2$variable.importance)
#dplyr::arrange(rf_imp,-MeanDecreaseAccuracy)
dplyr::slice_max(rf2_imp,order_by=rf_score, n=20)
#rftest <- predict(rf, newdata=test, type="class")
#confusionMatrix(table(rftest,test$class))
}
rf_comp(train)
### Compare with glmnet
if (!require("glmnet")) install.packages("glmnet")
library(glmnet)
glm_fcn <- function(train.X, train.y, alpha_p){
glmnet.class.model<-cv.glmnet(as.matrix(train.X), train.y, alpha=alpha_p,
family="binomial", type.measure="class")
glmnet.class.model$lambda.1se
glmnet.class.model$lambda.min
plot(glmnet.class.model)
glmnet.class.coeffs<-predict(glmnet.class.model,type="coefficients")
#glmnet.cc.coeffs # maybe 3 is most important, Excess kurtosis
model.class.terms <- colnames(train.X) # glmnet includes an intercept but we are going to ignore
#nonzero.glmnet.qtrait.coeffs <- model.qtrait.terms[glmnet.qtrait.coeffs@i[which(glmnet.qtrait.coeffs@i!=0)]] # skip intercept if there, 0-based counting
glmnet.df <- data.frame(as.matrix(glmnet.class.coeffs))
glmnet.df$abs_scores <- abs(glmnet.df$lambda.1se)
dplyr::slice_max(glmnet.df,order_by=abs_scores,n=21)
}
#### Alpha = 0
glm_fcn(train.X, train.y, 0)
#### Alpha = 1
glm_fcn(train.X, train.y, 1)
## b. Repeat comparison using a graph with clusters
if (!require("igraph")) install.packages("igraph")
library(igraph)
if (!require("Matrix")) install.packages("Matrix")
library(Matrix) # bdiag
npc <-25 # nodes per cluster
n_clust <- 4 # 4 clusters with 25 nodes each
# no clusters
g0 <- erdos.renyi.game(npc*n_clust, 0.2)
plot(g0)
matlist = list()
for (i in 1:n_clust){
matlist[[i]] = get.adjacency(erdos.renyi.game(npc, 0.2))
}
# merge clusters into one matrix
mat_clust <- bdiag(matlist) # create block-diagonal matrix
## the following two things might not be necessary
# check for loner nodes, connected to nothing, and join them to something
k <- rowSums(mat_clust)
node_vector <- seq(1,npc*n_clust)
for (i in node_vector){
if (k[i]==0){ # if k=0, connect to something random
j <- sample(node_vector[-i],1)
mat_clust[i,j] <- 1
mat_clust[j,i] <- 1
}
}
node_colors <- c(rep("red",npc), rep("green",npc), rep("blue",npc), rep("orange",npc))
g1 <- graph_from_adjacency_matrix(mat_clust, mode="undirected", diag=F)
plot(g1, vertex.color=node_colors)
## c. Use npdro and igraph to create knn
my.k <- 3 # larger k, fewer clusters
npdr.nbpairs.idx <- npdro::nearestNeighbors(t(train.X),
# transpose does dist between predictors
# without transpose does dist between samples
#nbd.method="multisurf", k=0,
nbd.method = "relieff",
nbd.metric="manhattan",
k=my.k)
knn.graph <- graph_from_edgelist(as.matrix(npdr.nbpairs.idx),
directed=F)
knn.graph <- simplify(knn.graph)
### Plot network
plot.igraph(knn.graph,layout=layout_with_fr(knn.graph),
vertex.color="red",
vertex.size=3,vertex.label=NA,
main="Manhattan, knn-graph")
## d. Add Laplace graph penalty
### Find resulting beta coeffs
### Optimize or choose value for lambda2
### Compare to a) and b)
# 2. Gradient Descent
## Write fn with learning param
## Solve Rosenbrock function minimum
## Add momentum term