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