入門機械学習1,2章

51
第一回入門機械学習 読書会 2013.04.27 @kzfm

Upload: kazufumi-ohkawa

Post on 10-May-2015

4.171 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: 入門機械学習1,2章

第一回入門機械学習 読書会 2013.04.27 @kzfm

Page 2: 入門機械学習1,2章

準備 !   R

!   http://www.r-project.org/

!   Rstudio !   http://www.rstudio.com/

!   サンプルコード !   https://github.com/johnmyleswhite/

ML_for_Hackers !   source(“package_installer.R”)を実行

>  setwd("/Users/kzfm/lang/rcode/ML_̲for_̲Hackers/")  >  source("package_̲installer.R")  

Page 3: 入門機械学習1,2章

私とR @kzfm (http://blog.kzfmix.com/)

医療統計からテキストマイニングまで幅広くこなす

Page 4: 入門機械学習1,2章

0章 R言語を簡単に説明 入門機械学習を読むために必要最低限の知識を お届けします

Page 5: 入門機械学習1,2章

Rとは?  !   統計計算とグラフィックスのための言語・環境

!   多様な統計手法 (線形・非線形モデル、古典的統計検定、時系列解析、判別分析、クラスタリング、その他) とグラフィックスを提供し、広汎な拡張が可能

!   オブジェクト指向 !   統計処理用の関数が豊富に用意されている !   ベクトル、行列演算のためのデータ型が存在す

Page 6: 入門機械学習1,2章

例)package_installer.R options(repos=structure(c(CRAN="http://cran.stat.auckland.ac.nz/")))  

cran.packages  <-‐‑‒  c("e1071”,  "ggplot2”,  "glmnet",                                                            "Hmisc”,  "igraph”,  "lme4",                                                            "lubridate”,  "plyr”,  "RCurl",                                                            "reshape”,  "RJSONIO",                                                            "scales”,  "tm”,  "XML")  

cat("This  script  will  now  attempt  to  install  all  of  the  R  packages  used  in  'Machine  Learning  for  Hackers'")  

for(p  in  cran.packages)  {          if(!suppressWarnings(require(p,  character.only  =  TRUE,  quietly  =  TRUE)))  {                  cat(paste(p,  "missing,  will  attempt  to  install\n"))                  install.packages(p,  dependencies  =  TRUE,  type  =  "source")          }          else  {                  cat(paste(p,  "installed  OK\n"))          }  }  

print("###  All  required  packages  installed  ###")  

代入が<- になったjavascriptだと思えばOK

Page 7: 入門機械学習1,2章

javascriptとの違い !   function

!   セミコロンは不要 !   引数にデフォルトを与えることができる !   最後に評価された値が返る !   returnは関数(括弧が必要)

!   集合型の添字が1からはじまる

!   ココらへんに気をつければ、Rのコードは読めると思います

Page 8: 入門機械学習1,2章

混乱しがちなデータ構造

!  ベクトル !  リスト !  データフレーム

Page 9: 入門機械学習1,2章

ベクトル !   皆さんが想像する通りの

ものです !   c()で生成

!   均質 !   要素の種類は同じでな

いといけない

!   インデックス付けできる !   v[1]でアクセスできる

!   名前付けできる !   namesを使う

>  MLer  <-‐‑‒  c("kzfm",  "tomof",  "harumakiyukko")  >  names(MLer)  <-‐‑‒  NULL  

>  MLer  [1]  "kzfm"                    "tomof"                  "harumakiyukko"  

>  MLer[2]  [1]  "tomof"  

>  names(MLer)  <-‐‑‒  c("user1","user2","user3")  >  MLer                      user1                      user2                      user3                      "kzfm"                  "tomof"  "harumakiyukko"    

Page 10: 入門機械学習1,2章

リスト !   皆さんが想像するものとは

ちがいます !   どっちかというと辞書や

ハッシュ !   list()で生成

!   異質 !   要素の種類は異なってい

て良い

!   インデックス付けできる !   v[[1]]でアクセスできる

!   名前付けできる !   lst[[“name”]]の省略記

法としてlst$nameが使える(javascriptみたいなもん)

>shizudev  <-‐‑‒  list(title="⼊入⾨門機械学習読書会",  users=MLer)  

>  shizudev[[1]]  [1]  "⼊入⾨門機械学習読書会"  

>  shizudev[[2]]                      user1                      user2                      user3                      "kzfm"                  "tomof"  "harumakiyukko"    

>  shizudev$title  [1]  "⼊入⾨門機械学習読書会"  

>  shizudev$users                      user1                      user2                      user3                      "kzfm"                  "tomof"  "harumakiyukko"    

Page 11: 入門機械学習1,2章

ベクトルとリストの違い !   均質か異質か

!   リストがハッシュっぽいのは異質なデータ集合の添字に名前を付けられるから

1 2 3 4 5 6

lst[[1]] or lst[[‘name1’]] or lst$name1

lst

Page 12: 入門機械学習1,2章

ベクトル操作と型変換 !   ベクトル操作はこん

な感じ

!   型を調べるのはis

!   型変換はas

!   Factor !   列挙型とかEnum !   SQLだと正規化し

たイメージ

>  v  <-‐‑‒  1:5  >  v  [1]  1  2  3  4  5  >  v  +  5  [1]    6    7    8    9  10  >  v[3]  +  5  [1]  8  >  v[3]  <-‐‑‒  v[3]  +  5  >  v  [1]  1  2  8  4  5  >  v2  <-‐‑‒  1:5  >  v2  +  v2  [1]    2    4    6    8  10  

>  v3  <-‐‑‒  c("F","M","F","F")  >  v3  [1]  "F"  "M"  "F"  "F"  >  is.vector(v3)  [1]  TRUE  >  v4  <-‐‑‒  as.factor(v3)  >  v4  [1]  F  M  F  F  Levels:  F  M  

Page 13: 入門機械学習1,2章

データフレーム !   Excelでいうところの

ワークシート !   列の要素は均質でな

いといけない !   列の要素数は同じで

ないといけない !   行が揃っているということ

!   列には名前が必要 !   A,B,Cのとこ

Page 14: 入門機械学習1,2章

データフレーム >  langs  <-‐‑‒  read.csv("lang.csv",  header=TRUE)  >  langs                lang  statements  lines  1                  C                1.0  1.000  2              C++                2.5  1.000  3      Fortran                2.5  0.800  4            Java                2.5  1.500  5            Perl                6.0  6.000  6        Python                6.0  6.500  7  Smalltalk                6.0  0.625  >  langs[[1]]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  >  langs[1,]      lang  statements  lines  1        C                    1          1  >  langs[,1]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  

Page 15: 入門機械学習1,2章

データフレーム >  langs  <-‐‑‒  read.csv("lang.csv",  header=TRUE)  >  langs                lang  statements  lines  1                  C                1.0  1.000  2              C++                2.5  1.000  3      Fortran                2.5  0.800  4            Java                2.5  1.500  5            Perl                6.0  6.000  6        Python                6.0  6.500  7  Smalltalk                6.0  0.625  >  langs[[1]]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  >  langs[1,]      lang  statements  lines  1        C                    1          1  >  langs[,1]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  

Page 16: 入門機械学習1,2章

データフレーム >  langs  <-‐‑‒  read.csv("lang.csv",  header=TRUE)  >  langs                lang  statements  lines  1                  C                1.0  1.000  2              C++                2.5  1.000  3      Fortran                2.5  0.800  4            Java                2.5  1.500  5            Perl                6.0  6.000  6        Python                6.0  6.500  7  Smalltalk                6.0  0.625  >  langs[[1]]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  >  langs[1,]      lang  statements  lines  1        C                    1          1  >  langs[,1]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  

Page 17: 入門機械学習1,2章

データフレームは特殊なリスト !   列はリストの表記でアクセス可能

!    df[[name]] or df$name

!   要素がベクトルかファクタ !   要素の数が同じ -> 表形式

!   列には名前が必要

Page 18: 入門機械学習1,2章

リストの記法でアクセス >  langs  <-‐‑‒  read.csv("lang.csv",  header=TRUE)  >  langs                lang  statements  lines  1                  C                1.0  1.000  2              C++                2.5  1.000  3      Fortran                2.5  0.800  4            Java                2.5  1.500  5            Perl                6.0  6.000  6        Python                6.0  6.500  7  Smalltalk                6.0  0.625  >  langs[[1]]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  >  langs[1,]      lang  statements  lines  1        C                    1          1  >  langs[,1]  [1]  C                  C++              Fortran      Java            Perl            Python        Smalltalk  Levels:  C  C++  Fortran  Java  Perl  Python  Smalltalk  

Page 19: 入門機械学習1,2章

Rはベクトルで処理するjavascript と思っておけば多分なんとかなります (深く知りたければリゲス本を読みましょう)

Page 20: 入門機械学習1,2章

1章 Rを利用する UFO目撃情報を視覚化する

Page 21: 入門機械学習1,2章

章の目的 アメリカの各州での 1990-2010年における UFO目撃頻度を視覚化する

Page 22: 入門機械学習1,2章

Rのインストール !   省略します

!   Rstudioを使います

!   ヘルプ !   ?をつける !   個人的にはCRANのpdfを

Page 23: 入門機械学習1,2章

CRAN !   perlでいうところのCPAN

!   http://cran.r-project.org/

!   パッケージが登録されている !   Rstudioの場合

!   Tools -> install Packagesでインストール

!   対話環境の場合 !   install.packages関数

!   パッケージを使う !   library関数 #jsでいうrequire

Page 24: 入門機械学習1,2章

ここからデータの処理 !   本ではRで前処理していますが、他のプログラミ

ング言語で行ったほうがいいかも !   perl,ruby,pythonでおこなってread.csvで

読みこむ !   Excelで綺麗にしてread.xlsで読み込む

!   一応やるけど、覚える必要はあまりないかも !   他言語のスキルとの兼ね合いで考えてください

Page 25: 入門機械学習1,2章

Rstudio

headで中身を確認しなくても どのくらいのデータ数と変数があるか表示される

スプレッドシートのアイコンをクリックすると 中身が表示される

Page 26: 入門機械学習1,2章

データを綺麗にする

setwd("/Users/kzfm/lang/rcode/ML_̲for_̲Hackers/01-‐‑‒Introduction/")  ufo  <-‐‑‒  read.delim("data/ufo/ufo_̲awesome.tsv",  sep="\t",  stringsAsFactors=FALSE,  header=FALSE,  na.strings="")  names(ufo)  <-‐‑‒  c("DateOccurred",  "DateReported",  "Location",  "ShortDescription",  "Duration",  "LongDescription")  good.rows  <-‐‑‒  ifelse(nchar(ufo$DateOccurred)  !=8  |  nchar(ufo$DateReported)  !=8,  FALSE,  TRUE)  ufo  <-‐‑‒  ufo[good.rows,]  ufo$DateOccurred  <-‐‑‒  as.Date(ufo$DateOccurred,  format="%Y%m%d")  ufo$DateReported  <-‐‑‒  as.Date(ufo$DateReported,  format="%Y%m%d")  get.location  <-‐‑‒  function(l)  {      split.location  <-‐‑‒  tryCatch(strsplit(l,",")[[1]],  error=  function(e)  return(c(NA,  NA)))      clean.location  <-‐‑‒  gsub("^  ",  "",  split.location)      if(length(clean.location)  >  2)  {          return(c(NA,  NA))      }  else  {          return(clean.location)      }  }  city.state  <-‐‑‒  lapply(ufo$Location,  get.location)  location.matrix  <-‐‑‒  do.call(rbind,  city.state)  ufo  <-‐‑‒  transform(ufo,  USCity=location.matrix[,1],  USState=location.matrix[,2],stringsAsFactors=FALSE)  ufo$USState  <-‐‑‒  state.abb[match(ufo$USState,  state.abb)]  ufo$USCity[is.na(ufo$USState)]  <-‐‑‒  NA  ufo.us  <-‐‑‒  subset(ufo,  !is.na(USState))  

ML_for_Hackers/01-Introduction/ufo_sightings.R を参考に

Page 27: 入門機械学習1,2章

コードの説明 !   TAB区切りのデータ読み込み !   ヘッダを設定 !   日付のフォーマットがおかしい行を捨てる !   位置情報を綺麗にする !   目撃された場所がアメリカ(州コード)のもの

のみにする !   (*) 表に対する操作を意識するとより分かりやす

いかも

Page 28: 入門機械学習1,2章

lapply, do.call !   jQuery.mapみたいな

!   高階関数を使ってforループを回さないのがRの作法

!   lapply !   (DataFrame -> list)

!   do.call !   (list -> DataFrame) lapply(iris[1:4],  mean)    

Page 29: 入門機械学習1,2章

描画していきます(1.1.4.5-)

library(ggplot2)  library(plyr)  library(scales)    

!   この章で使うパッケージは以下の3つ !   ggplot2: 綺麗な描画 !   plyr: mapreduceっぽい操作用 !   scales: グラフのためのスケール操作

Page 30: 入門機械学習1,2章

ggplot2とは !   良い感じのグラフを手軽にかけるライブラリ

!   オブジェクト指向っぽくグラフを作る

!   Photoshopのレイヤーを重ねるようにグラフを作成していく

!   ggplot2のためにRを使うとかありがち !   私とか

Page 31: 入門機械学習1,2章

(例)IRIS

Page 32: 入門機械学習1,2章

散布図

g  <-‐‑‒  ggplot(data=iris,  aes_̲string(x='Sepal.Length',  y='Sepal.Width',  color='Petal.Length'))  g  +  geom_̲point()  

Page 33: 入門機械学習1,2章

種毎に分ける

g  +  geom_̲point()  +  facet_̲wrap(~∼Species)  

Page 34: 入門機械学習1,2章

ラベルを変更

g  +  geom_̲point()  +  facet_̲wrap(~∼Species)  +  xlab("Length")  +  ylab("Width")  

Page 35: 入門機械学習1,2章

線形回帰

g  +  geom_̲point()  +  facet_̲wrap(~∼Species)  +  geom_̲smooth(method='lm')  

Page 36: 入門機械学習1,2章

(おまけ)お手軽プロット

qplot(Sepal.Length,  Petal.Length,  data  =  iris,  color  =  Species,  size  =  Petal.Width)  

Page 37: 入門機械学習1,2章

ヒストグラム

library(ggplot2)  library(scales)  ggplot(ufo.us,  aes(x=DateOccurred))    +  geom_̲histogram()    +  scale_̲x_̲date(breaks="50  years")  

Page 38: 入門機械学習1,2章

1990-1-1以降の月ごとのヒストグラム

ufo.us  <-‐‑‒  subset(ufo.us,  DateOccurred  >=  as.Date("1990-‐‑‒01-‐‑‒01"))  ufo.us$YearMonth  <-‐‑‒  strftime(ufo.us$DateOccurred,  format="%Y-‐‑‒%m")  ggplot(ufo.us,  aes(x  =  DateOccurred))  +      geom_̲histogram(aes(fill='white',  color='red'))  +      scale_̲fill_̲manual(values=c('white'='white'),  guide="none")  +      scale_̲color_̲manual(values=c('red'='red'),  guide="none")  +      scale_̲x_̲date(breaks  =  "50  years")  

Page 39: 入門機械学習1,2章

時系列と頻度の処理 sightings.counts  <-‐‑‒  ddply(ufo.us,  .(USState,YearMonth),  nrow)  date.range  <-‐‑‒  seq.Date(from  =  as.Date(min(ufo.us$DateOccurred)),      to  =  as.Date(max(ufo.us$DateOccurred)),      by  =  "month")  date.strings  <-‐‑‒  strftime(date.range,  "%Y-‐‑‒%m")  states.dates  <-‐‑‒  lapply(state.abb,  function(s)  cbind(s,  date.strings))  states.dates  <-‐‑‒  data.frame(do.call(rbind,  states.dates),  stringsAsFactors  =  FALSE)  #  left  outer  join  all.sightings  <-‐‑‒  merge(states.dates,      sightings.counts,      by.x  =  c("s",  "date.strings"),      by.y  =  c("USState",  "YearMonth"),      all  =  TRUE)  names(all.sightings)  <-‐‑‒  c("State",  "YearMonth",  "Sightings")  all.sightings$Sightings[is.na(all.sightings$Sightings)]  <-‐‑‒  0  all.sightings$YearMonth  <-‐‑‒  as.Date(rep(date.range,  length(state.abb)))  all.sightings$State  <-‐‑‒  as.factor(all.sightings$State)  

欠けている月の目撃情報を0として追加 州の要素を文字列から因子に変更する

Page 40: 入門機械学習1,2章

描画する

ggplot(all.sightings,  aes(x  =  YearMonth,y  =  Sightings))  +      geom_̲line(aes(color  =  "darkblue"))  +      facet_̲wrap(~∼State,  nrow  =  10,  ncol  =  5)  +        theme_̲bw()  +        scale_̲color_̲manual(values  =  c("darkblue"  =  "darkblue"),  guide  =  "none")  +      scale_̲x_̲date(breaks  =  "5  years",  labels  =  date_̲format('%Y'))  +      xlab("Years")  +      ylab("Number  of  Sightings")  +      opts(title="Number  of  UFO  sightings  by  Month-‐‑‒Year  and  U.S.  State  (1990-‐‑‒2010)")  

Page 41: 入門機械学習1,2章

一章まとめ !   可視化による分析をしました

!   (考察は本を読むべし)

!   Rでやるのもいいですがperl,ruby,pythonで処理してからread.csvで読み込むのが普通かなと

!   Pythonistaだったらpandasという選択肢もあります !   dataframe実装してある !   joinできる !   速い(numpy)

Page 42: 入門機械学習1,2章

2章 データの調査 身長と体重

Page 43: 入門機械学習1,2章

本書での「データセット」 !   数値と文字列からなる巨大な表データであり、

それぞれの行は実世界の1つの観察結果を表す !   データベースのテーブル構造のようなもの

!   確証的データ分析はやらない、探索的なデータ分析のみ

Page 44: 入門機械学習1,2章

要約 !   行か列の圧縮 !   要約統計量

!   行の圧縮 !   平均とか中央値とか

!   次元削減 !   列の圧縮

!   PCA,MDS

!   全部読み終わったらあらためて考えるとイイ

Page 45: 入門機械学習1,2章

平均、中央値 setwd("/Users/kzfm/lang/rcode/ML_̲for_̲Hackers/02-‐‑‒Exploration/")  heights.weights  <-‐‑‒  read.csv("data/01_̲heights_̲weights_̲genders.csv")  heights  <-‐‑‒  with(heights.weights,  Height)  boxplot(heights)  summary(heights.weights$Height)  

Min.  1st  Qu.    Median        Mean  3rd  Qu.        Max.        54.26      63.51      66.32      66.37      69.17      79.00    

Page 46: 入門機械学習1,2章

標準偏差と分散 !   データの広がりを表現したい

!   バラツキを表現する

>  var(heights)  [1]  14.80347  >  mean(heights)  [1]  66.36756  >  c(mean(heights)-‐‑‒var(heights),  mean(heights)+var(heights))  [1]  51.56409  81.17103  

あとで

Page 47: 入門機械学習1,2章

探索的データの可視化 !   2-9から順番にやっていく

Page 48: 入門機械学習1,2章

分布 !   分布の種類

!   正規分布 !   ガンマ分布 !   コーシー分布

!   単峰性か否か !   双峰性の分布が重なって見かけ上単峰性になっていな

いか? !   ヒストグラムよりは密度推定のほうがよいとおもう !   バイオリンプロットとかbean-plotもおすすめ

Page 49: 入門機械学習1,2章

データの可視化(plot)

Page 50: 入門機械学習1,2章

男女を予測

c  <-‐‑‒  coef(logit.mode)  ggplot(height.weights,  aes(x  =  Weight,  y=Height,  color=Gender))  +  geom_̲point()  +  stat_̲abline(intercept  =  -‐‑‒c[1]/c[2],  slope=-‐‑‒c[3]/c[2],  geom='abline',  color='black')  

Page 51: 入門機械学習1,2章

2章まとめ !   要約統計量の説明

!   ggplot2によるグラフ描画

!   ちょっと予測モデルで遊んだ