入門機械学習1,2章

5,209 views

Published on

Published in: Technology

入門機械学習1,2章

  1. 1. 第一回入門機械学習読書会2013.04.27@kzfm
  2. 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")  
  3. 3. 私とR@kzfm (http://blog.kzfmix.com/)医療統計からテキストマイニングまで幅広くこなす
  4. 4. 0章R言語を簡単に説明入門機械学習を読むために必要最低限の知識をお届けします
  5. 5. Rとは? !   統計計算とグラフィックスのための言語・環境!   多様な統計手法 (線形・非線形モデル、古典的統計検定、時系列解析、判別分析、クラスタリング、その他) とグラフィックスを提供し、広汎な拡張が可能!   オブジェクト指向!   統計処理用の関数が豊富に用意されている!   ベクトル、行列演算のためのデータ型が存在する
  6. 6. 例)package_installer.Roptions(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  installn"))                  install.packages(p,  dependencies  =  TRUE,  type  =  "source")          }          else  {                  cat(paste(p,  "installed  OKn"))          }  }  print("###  All  required  packages  installed  ###")  代入が<- になったjavascriptだと思えばOK
  7. 7. javascriptとの違い!   function!   セミコロンは不要!   引数にデフォルトを与えることができる!   最後に評価された値が返る!   returnは関数(括弧が必要)!   集合型の添字が1からはじまる!   ココらへんに気をつければ、Rのコードは読めると思います
  8. 8. 混乱しがちなデータ構造!  ベクトル!  リスト!  データフレーム
  9. 9. ベクトル!   皆さんが想像する通りのものです!   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"    
  10. 10. リスト!   皆さんが想像するものとはちがいます!   どっちかというと辞書やハッシュ!   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"    
  11. 11. ベクトルとリストの違い!   均質か異質か!   リストがハッシュっぽいのは異質なデータ集合の添字に名前を付けられるから1 2 3 4 5 6 lst[[1]] or lst[[ name1 ]] or lst$name1lst
  12. 12. ベクトル操作と型変換!   ベクトル操作はこんな感じ!   型を調べるのは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  
  13. 13. データフレーム!   Excelでいうところのワークシート!   列の要素は均質でないといけない!   列の要素数は同じでないといけない!   行が揃っているということ!   列には名前が必要!   A,B,Cのとこ
  14. 14. データフレーム>  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  
  15. 15. データフレーム>  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  
  16. 16. データフレーム>  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  
  17. 17. データフレームは特殊なリスト!   列はリストの表記でアクセス可能!    df[[name]] or df$name!   要素がベクトルかファクタ!   要素の数が同じ -> 表形式!   列には名前が必要
  18. 18. リストの記法でアクセス>  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  
  19. 19. Rはベクトルで処理するjavascriptと思っておけば多分なんとかなります(深く知りたければリゲス本を読みましょう)
  20. 20. 1章Rを利用するUFO目撃情報を視覚化する
  21. 21. 章の目的アメリカの各州での1990-2010年におけるUFO目撃頻度を視覚化する
  22. 22. Rのインストール!   省略します!   Rstudioを使います!   ヘルプ!   ?をつける!   個人的にはCRANのpdfを
  23. 23. CRAN!   perlでいうところのCPAN!   http://cran.r-project.org/!   パッケージが登録されている!   Rstudioの場合!   Tools -> install Packagesでインストール!   対話環境の場合!   install.packages関数!   パッケージを使う!   library関数 #jsでいうrequire
  24. 24. ここからデータの処理!   本ではRで前処理していますが、他のプログラミング言語で行ったほうがいいかも!   perl,ruby,pythonでおこなってread.csvで読みこむ!   Excelで綺麗にしてread.xlsで読み込む!   一応やるけど、覚える必要はあまりないかも!   他言語のスキルとの兼ね合いで考えてください
  25. 25. Rstudioheadで中身を確認しなくてもどのくらいのデータ数と変数があるか表示されるスプレッドシートのアイコンをクリックすると中身が表示される
  26. 26. データを綺麗にする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を参考に
  27. 27. コードの説明!   TAB区切りのデータ読み込み!   ヘッダを設定!   日付のフォーマットがおかしい行を捨てる!   位置情報を綺麗にする!   目撃された場所がアメリカ(州コード)のもののみにする!   (*) 表に対する操作を意識するとより分かりやすいかも
  28. 28. lapply, do.call!   jQuery.mapみたいな!   高階関数を使ってforループを回さないのがRの作法!   lapply!   (DataFrame -> list)!   do.call!   (list -> DataFrame) lapply(iris[1:4],  mean)    
  29. 29. 描画していきます(1.1.4.5-)library(ggplot2)  library(plyr)  library(scales)    !   この章で使うパッケージは以下の3つ!   ggplot2: 綺麗な描画!   plyr: mapreduceっぽい操作用!   scales: グラフのためのスケール操作
  30. 30. ggplot2とは!   良い感じのグラフを手軽にかけるライブラリ!   オブジェクト指向っぽくグラフを作る!   Photoshopのレイヤーを重ねるようにグラフを作成していく!   ggplot2のためにRを使うとかありがち!   私とか
  31. 31. (例)IRIS
  32. 32. 散布図g  <-‐‑‒  ggplot(data=iris,  aes_̲string(x=Sepal.Length,  y=Sepal.Width,  color=Petal.Length))  g  +  geom_̲point()  
  33. 33. 種毎に分けるg  +  geom_̲point()  +  facet_̲wrap(~∼Species)  
  34. 34. ラベルを変更g  +  geom_̲point()  +  facet_̲wrap(~∼Species)  +  xlab("Length")  +  ylab("Width")  
  35. 35. 線形回帰g  +  geom_̲point()  +  facet_̲wrap(~∼Species)  +  geom_̲smooth(method=lm)  
  36. 36. (おまけ)お手軽プロットqplot(Sepal.Length,  Petal.Length,  data  =  iris,  color  =  Species,  size  =  Petal.Width)  
  37. 37. ヒストグラムlibrary(ggplot2)  library(scales)  ggplot(ufo.us,  aes(x=DateOccurred))    +  geom_̲histogram()    +  scale_̲x_̲date(breaks="50  years")  
  38. 38. 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")  
  39. 39. 時系列と頻度の処理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として追加州の要素を文字列から因子に変更する
  40. 40. 描画する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)")  
  41. 41. 一章まとめ!   可視化による分析をしました!   (考察は本を読むべし)!   Rでやるのもいいですがperl,ruby,pythonで処理してからread.csvで読み込むのが普通かなと!   Pythonistaだったらpandasという選択肢もあります!   dataframe実装してある!   joinできる!   速い(numpy)
  42. 42. 2章データの調査身長と体重
  43. 43. 本書での「データセット」!   数値と文字列からなる巨大な表データであり、それぞれの行は実世界の1つの観察結果を表す!   データベースのテーブル構造のようなもの!   確証的データ分析はやらない、探索的なデータ分析のみ
  44. 44. 要約!   行か列の圧縮!   要約統計量!   行の圧縮!   平均とか中央値とか!   次元削減!   列の圧縮!   PCA,MDS!   全部読み終わったらあらためて考えるとイイ
  45. 45. 平均、中央値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    
  46. 46. 標準偏差と分散!   データの広がりを表現したい!   バラツキを表現する>  var(heights)  [1]  14.80347  >  mean(heights)  [1]  66.36756  >  c(mean(heights)-‐‑‒var(heights),  mean(heights)+var(heights))  [1]  51.56409  81.17103  あとで
  47. 47. 探索的データの可視化!   2-9から順番にやっていく
  48. 48. 分布!   分布の種類!   正規分布!   ガンマ分布!   コーシー分布!   単峰性か否か!   双峰性の分布が重なって見かけ上単峰性になっていないか?!   ヒストグラムよりは密度推定のほうがよいとおもう!   バイオリンプロットとかbean-plotもおすすめ
  49. 49. データの可視化(plot)
  50. 50. 男女を予測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)  
  51. 51. 2章まとめ!   要約統計量の説明!   ggplot2によるグラフ描画!   ちょっと予測モデルで遊んだ

×