Rのこと。

R言語のことをまとめる備忘録。お仕事柄、Tableauとデータベースが主になってしまいRをほとんど使ってないので、もはやRは趣味となってしまった人のブログ。

tidymodelsパッケージ~ハイパーパラメタのチューニング~

はじめに

機械学習を行うために必要なパッケージをまとめたtidymodelsというパッケージがある。tidymodelsの主要なパッケージであるrsamplerecipeparsnipyardstickパッケージについて、何回に分けて情報をまとめていく。

f:id:AZUMINO:20200212232314p:plain

Source | A Gentle Intro To Tidymodels

サンプルデータの準備

工事中

ロジスティック回帰をRで実装する

はじめに

Twitterで「データサイエンティストは、ロジスティック回帰を説明できるかどうか」みたいな話がでていたので、私はデータサイエンティストでも機械エンジニアでもないけれども、Rで関数を書く練習になると思ったので、書いてみた。

数式とパラメタ推定関数optimの使い方は下記の書籍を参考にした。機械学習のエッセンス実装しながら学ぶPython、数学、アルゴリズムは、私のような、数学苦手な人でも、すごくわかりやすいので、おすすめ。

数理部分

下記を参照しました。パラメタを推定するところは、optim()を使いました。

Rの実装

library(tidyverse)
set.seed(1989)
df <-  tibble(y = sample(c(0, 1), 10, replace = TRUE),
              x1 = rnorm(10),
              x2 = rnorm(10))

X <- df %>% select(starts_with("x"))
y <- df %>% select(y)


# Sigmoid function
sigmoid <- function(x) {
  1.0 / (1.0 + exp(-x))
}

# Cost function
cost_func <- function(theta, X, y){
  h <- sigmoid(X %*% theta)
  cost <- -1*(t(y) %*% log(h) + t(1-y) %*% log(1-h)) 
  cost
}

# Gradient function
gradient <- function(theta, X, y){
  h <- sigmoid(X %*% theta)
  grad <- (t(X) %*% (h - y)) 
  grad
}


log_reg <- function(X, y){
  # Add intercept and convert matrix
  X <- X %>% mutate(alpha = 1) %>% select(alpha, everything()) %>% as.matrix()
  y <- y %>% as.matrix()
  # Initialize parms
  theta <- matrix(rep(0, ncol(X)), nrow = ncol(X))
  # Optimize by BFGS(準ニュートン法)
  res_opt <- optim(par = theta, fn = cost_func, gr = gradient, X = X, y = y, method = "BFGS")
  # Get parms
  return(res_opt$par)
}

実行結果はこちら。glm()の結果と一緒みたいなのでOKでしょう。

 log_reg(X = X, y = y)
           [,1]
[1,] -1.1322717
[2,] -0.4637470
[3,] -0.7010454

g <- glm(y ~ x1 + x2, data = df, family = binomial(link = "logit"))
g$coefficients %>% as.matrix()
                  [,1]
(Intercept) -1.1322713
x1          -0.4637478
x2          -0.7010468

なんとなく、このスクリプトを書きながら、数理的にも、実装力的にも、ここらへんが、私の現状の限界なんだろうなと思った。精進しないと。