見出し画像

R言語学習 #03:ロジスティック回帰でスパム判定を実装

前回「Rによるデータマイニング」という本を参考に説明変数から目的変数を予測する単回帰・重回帰の手法を学びました。
今回はデータマイニングの練習の一環として、目的変数が0・1の場合に適用できるロジスティック回帰について学習していきます。ロジスティック回帰はニューラルネットワークで回帰分析をする際のアルゴリズムにも応用されています。

今回はUCI Machine Learningより、スパムメールの分類に用いられるデータセットを利用します。

1変数のロジスティック回帰

library(ggplot2)
library(dplyr)
library(MASS)
setwd("C:/Users/user/Desktop/統計学習用資料")
spambase <- read.csv("spambase.data", header=F)
head(spambase)

#説明変数はspambaseに登録されている単語の出現頻度を表す。
colnames(spambase) <- read.table("spambase.names", skip=33, sep=":", comment.char ="")[ ,1]
colnames(spambase)[ncol(spambase)] <- "spam"
qplot(word_freq_your, spam, data=spambase, alpha=I(0.03))
メールごとの単語の出現頻度・目的変数の対応
Your”という単語・スパム判定の分布図
#“Your”という単語のみでスパム判定のロジスティック回帰モデルを作る
#回帰直線の代わりに、ロジスティック回帰ではシグモイド関数をフィルターとして用いる
spam.your.lst <- glm(spam~word_freq_your, data=spambase, family="binomial")
spam.your.lst
a <- coef(spam.your.lst)[2]
b <- coef(spam.your.lst)[1]
lst.fun <- function(x){1/ (1+exp(-(a*x+b)))}
qplot(word_freq_your, spam, data=spambase, alpha=I(0.03), xlim = c(-5,15)) + stat_function(fun=lst.fun, geom = "line")

#”Your”という単語からどれだけスパム判定ができるかを検証
 spam.your.pred <- predict(spam.your.lst, type="resp")
(tb <- table(spam=spambase$spam, pred=round(spam.your.pred)))
1-sum(diag(tb))/sum(tb)

"Your"という単語のみを使う場合だと、誤ってスパム判定されたのが約11%、誤ってスパム判定されなかったのが約55%。1単語のみではスパム判定に有効な情報獲得はできません。

そこで、57単語全てを使ってロジスティック回帰モデルを作る場合を考えます。これは重回帰分析をした際に直線をフィッティングしたのに対し、シグモイド関数をフィッティングすると考えるとわかりやすいです。

#57単語全ての出現頻度を用いてスパム判定のロジスティック回帰モデルを作る
spam.glm <- glm(spam~., data=spambase, family="binomial")
summary(spam.glm)
(spam.glm.best <- stepAIC(spam.glm))
summary(spam.glm.best)

#分類精度を検証
spam.best.pred <- predict(spam.glm.best, type="resp")
(tb.best <- table(spam=spambase$spam, pred=round(spam.best.pred)))
1-sum(diag(tb.best))/sum(tb.best)

57単語をロジスティック回帰に用いたところ、
誤ってスパム判定されたのが約4.3%、誤ってスパム判定されなかったのが約11%。全体の誤判別率は約6.8%と、判定制度が格段に向上しました。
実用目的で更に精度を高めるには、100-1000以上の単語をスパム判定に用いるのが理想と考えられます。

次回はSVM、クラスター分析について書きたいと思います。お楽しみに!

この記事が気に入ったらサポートをしてみませんか?