Rで機械学習する
|
Topic path:
Top
/
機械学習
/ Rで機械学習する
-- 雛形とするページ --
BracketName
ChatGPTを使って英語論文を読む
ColabでCUDAとPyTorchとPythonをダウングレードする
FormattingRules
FrontPage
Help
InterWiki
InterWikiName
InterWikiSandBox
MenuBar
PHP
PukiWiki
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
その他
その他/GnuplotでKeynote風のグラフを作成する
その他/Javaの参考文献
その他/LaTeXの参考文献
その他/MacでGnuplotを使う
その他/MacでLEGO MINDSTORMSの開発環境NXCを使う
その他/MacでLet's Encryptを使う
その他/MacでPython 3を使う
その他/MacでRuby 1.9を使う
その他/MacでTeXを使う
その他/MacでTeXを使う(旧)
その他/MacでWindowsを使う
その他/Macでパスを通す
その他/Macで実験結果をまとめる
その他/Mailmanのメーリング・リストをバーチャル・ホストに移行する
その他/PostfixでSMTP AUTH over TLSを使う
その他/Prologの参考文献
その他/PukiWikiで一部のページへのアクセスを制限する
その他/PukiWikiで日本語で始まるページのタイトルが表示できない問題を解決する
その他/Rubyの参考文献
その他/Rの参考文献
その他/Snow LeopardでGnuplotを使う
その他/VBAの参考文献
その他/WindowsでLEGO MINDSTORMSの開発環境NXCを使う
その他/patchファイルの作り方とpatchの当て方
その他/アルゴリズムの参考文献
その他/プレゼンテーションの参考文献
その他/人工知能の参考文献
その他/卒業研究を始める前に読んでおくべき3つのマンガ
その他/臨床工学に関するTEDプレゼンテーション
その他/論文執筆の参考文献
テキスト・マイニング
テキスト・マイニング/MacでHyper Estraierを使う
テキスト・マイニング/MacでMeCabを使う
テキスト・マイニング/MacでMySQLを使う
テキスト・マイニング/MacでNamazuを使う
テキスト・マイニング/MacでSennaを使う
テキスト・マイニング/MacでTermExtractを使う
テキスト・マイニング/MacでTokyo Dystopiaを使う
テキスト・マイニング/SennaのRubyバインディングを使う
テキスト・マイニング/テキスト分類による市場予測
テキスト・マイニング/テキスト回帰分析
テキスト・マイニング/参考文献
テキスト・マイニング/国際会議
データ・マイニング
データ・マイニング/Macでpandasとscikit-learnとJupyter Notebookを使う
データ・マイニング/Rでグラフを重ねる
データ・マイニング/Rでネットワーク構造を可視化する
データ・マイニング/TEDプレゼンテーション
データ・マイニング/データ・マイニングに関するTEDプレゼンテーション
データ・マイニング/参考文献
データ・マイニング/国際会議
バイオ・データ・マイニング
バイオ・データ・マイニング/BLASTで相同性検索を行う
バイオ・データ・マイニング/ClustalWでペアワイズ・アラインメントを行う
バイオ・データ・マイニング/ClustalWで多重アラインメントを行う
バイオ・データ・マイニング/DNAマイクロアレイ・データを解析する
バイオ・データ・マイニング/FASTAフォーマット
バイオ・データ・マイニング/HMMERで相同性検索を行う
バイオ・データ・マイニング/MacでBioPythonを使う
バイオ・データ・マイニング/MacでClustalWを使う
バイオ・データ・マイニング/MacでHMMERを使う
バイオ・データ・マイニング/RでNaïve Bayesを使う
バイオ・データ・マイニング/RでRandom Forestを使う
バイオ・データ・マイニング/RでSVMを使う
バイオ・データ・マイニング/Rでk平均法を使う
バイオ・データ・マイニング/Rでスペクトラル・クラスタリングを使う
バイオ・データ・マイニング/Rでデータを読み込む
バイオ・データ・マイニング/Rでマイクロアレイ・データを使う
バイオ・データ・マイニング/Rでロジスティック回帰を使う
バイオ・データ・マイニング/Rで主成分分析する
バイオ・データ・マイニング/Rで回帰分析する
バイオ・データ・マイニング/Rで検定する
バイオ・データ・マイニング/Rで決定木を使う
バイオ・データ・マイニング/Rで混合ガウス分布推定を使う
バイオ・データ・マイニング/Rで独立成分分析する
バイオ・データ・マイニング/Rで相関分析する
バイオ・データ・マイニング/Rで統計分析する
バイオ・データ・マイニング/Rで階層クラスタリングを使う
バイオ・データ・マイニング/Rで非線形回帰分析する
バイオ・データ・マイニング/Rの基本
バイオ・データ・マイニング/アミノ酸の条件付き生起確率を調べる
バイオ・データ・マイニング/アミノ酸の生起確率を調べる
バイオ・データ・マイニング/バイオ・データ・マイニングの参考文献
バイオ・データ・マイニング/人工的なたんぱく質データを生成する
人工知能
人工知能/TEDプレゼンテーション
人工知能/人工知能に関するTEDプレゼンテーション
人工知能/人工知能の参考文献
医療データ・マイニング
医療データ・マイニング/Rで心電図データを解析する
医療データ・マイニング/医療データ・マイニングの参考文献
医療データ・マイニング/医療データ・マイニングの論文
強化学習
強化学習/ColaboratoryでOpenAI Gymを使う
強化学習/ICML 2010 ワークショップ「強化学習と大規模探索」
強化学習/LEGO MINDSTORMS EV3でPythonを使う
強化学習/LEGO MINDSTORMS EV3で強化学習する
強化学習/MLJ Special Issue on Empirical Evaluations in Reinforcement Learning
強化学習/MacでOpenAI Gymを使う
強化学習/MacでRL-Glueを使う
強化学習/Pythonで強化学習する
強化学習/WindowsでOpenAI Gymを使う
強化学習/ファイナンスへの応用
強化学習/リスク回避強化学習
強化学習/人工知能における不確実性国際会議 UAI 2009
強化学習/人工知能合同国際会議 IJCAI-09
強化学習/安全な強化学習
強化学習/平均報酬強化学習
強化学習/強化学習
強化学習/強化学習における知識の転移
強化学習/強化学習に関する総合的(学際的・分野横断的)シンポジウム MSRL
強化学習/強化学習のプログラムを作るときの注意点
強化学習/強化学習の参考文献
強化学習/強化学習の論文
強化学習/強化学習の論文を探す
強化学習/強化学習コンペ RL Competition 2009
強化学習/機械学習国際会議 ICML
強化学習/機械学習国際会議 ICML 2009
強化学習/機械学習国際会議 ICML 2010
強化学習/機械学習研究ジャーナル JMLR
強化学習/神経情報処理システム国際会議 NIPS
強化学習/神経情報処理システム国際会議 NIPS 2009
強化学習/自律型エージェントとマルチエージェント・システム国際会議 AAMAS 2009
強化学習/複利型強化学習
強化学習/計算言語学会年次会議・自然言語処理合同国際会議 ACL-IJNLP 2009
授業
授業/C言語基礎
授業/C言語基礎/C言語の構文
授業/C言語基礎/Linuxコマンドの復習
授業/C言語基礎/do-while文
授業/C言語基礎/for文
授業/C言語基礎/for文/練習問題
授業/C言語基礎/for文/練習問題/05A-1
授業/C言語基礎/for文/練習問題/05A-2
授業/C言語基礎/for文/練習問題/05A-3
授業/C言語基礎/for文/練習問題/05A-4
授業/C言語基礎/for文/練習問題/05A-5
授業/C言語基礎/if文
授業/C言語基礎/if文/練習問題
授業/C言語基礎/if文/練習問題/03A-1
授業/C言語基礎/if文/練習問題/03A-2
授業/C言語基礎/if文/練習問題/03A-3
授業/C言語基礎/switch文
授業/C言語基礎/while文
授業/C言語基礎/while文/練習問題
授業/C言語基礎/while文/練習問題/06A-1
授業/C言語基礎/while文/練習問題/06A-2
授業/C言語基礎/while文/練習問題/06A-3
授業/C言語基礎/while文/練習問題/06A-4
授業/C言語基礎/じゃんけんゲーム
授業/C言語基礎/キーボードからの入力
授業/C言語基礎/キーボードからの入力/練習問題
授業/C言語基礎/キーボードからの入力/練習問題/04B-1
授業/C言語基礎/キーボードからの入力/練習問題/04B-2
授業/C言語基礎/コンパイルとリンク
授業/C言語基礎/コンパイルと実行
授業/C言語基礎/スピード計算ゲーム
授業/C言語基礎/タイピング・ゲーム
授業/C言語基礎/プログラミングを学ぶための心構え
授業/C言語基礎/プログラムの作成と実行
授業/C言語基礎/プロトタイプ宣言
授業/C言語基礎/プロトタイプ宣言/練習問題
授業/C言語基礎/ライブラリー
授業/C言語基礎/ルーブリック
授業/C言語基礎/値渡しと参照渡し
授業/C言語基礎/値渡しと参照渡し/練習問題
授業/C言語基礎/再帰呼び出し
授業/C言語基礎/再帰呼び出し/練習問題
授業/C言語基礎/前処理
授業/C言語基礎/変数
授業/C言語基礎/変数/練習問題
授業/C言語基礎/変数/練習問題/02A-1
授業/C言語基礎/変数/練習問題/02A-2
授業/C言語基礎/変数/練習問題/02A-3
授業/C言語基礎/変数の高度な使い方
授業/C言語基礎/変数の高度な使い方/練習問題
授業/C言語基礎/変数の高度な使い方/練習問題の解答例
授業/C言語基礎/教科書と参考書
授業/C言語基礎/数当てゲーム
授業/C言語基礎/文字
授業/C言語基礎/文字コードと改行コード
授業/C言語基礎/文字列
授業/C言語基礎/文字列/練習問題
授業/C言語基礎/文字列/練習問題/10B-01
授業/C言語基礎/文字列/練習問題/10B-02
授業/C言語基礎/文字列/練習問題/10B-03
授業/C言語基礎/文字列/練習問題/10B-04
授業/C言語基礎/条件演算子
授業/C言語基礎/演算
授業/C言語基礎/演算/練習問題
授業/C言語基礎/演算/練習問題/02B-1
授業/C言語基礎/演算/練習問題/02B-2
授業/C言語基礎/演算/練習問題/02B-3
授業/C言語基礎/演算/練習問題/02B-4
授業/C言語基礎/演算/練習問題/02B-5
授業/C言語基礎/演算/練習問題/02B-6
授業/C言語基礎/演算子の高度な使い方
授業/C言語基礎/画面への出力
授業/C言語基礎/画面への出力/練習問題
授業/C言語基礎/画面への出力/練習問題/04A-1
授業/C言語基礎/画面への出力/練習問題/04A-2
授業/C言語基礎/画面への出力/練習問題/04A-3
授業/C言語基礎/計算ゲーム
授業/C言語基礎/課題の提出方法
授業/C言語基礎/課題提出についての注意事項
授業/C言語基礎/配列
授業/C言語基礎/配列/練習問題
授業/C言語基礎/配列/練習問題の解答例
授業/C言語基礎/関数
授業/C言語基礎/関数/練習問題
授業/バイオインフォマティクス特論
授業/バイオインフォマティクス特論/分析練習用データ
授業/情報技術英語B
授業/情報数学
授業/知能情報工学
機械学習
機械学習/Colabでデータ・サイエンス
機械学習/GeForce GTX 1080を搭載したMac ProでTensorFlowを使う
機械学習/MacでLIBLINEARを使う
機械学習/MacでLIBSVMを使う
機械学習/MacでMahoutを使う
機械学習/MacでRのkernlabパッケージを使う
機械学習/MacでRを使う
機械学習/MacでSVM-Lightを使う
機械学習/MacでTensorFlowを使う
機械学習/Macでpandasとscikit-learnとJupyter Notebookを使う
機械学習/Pythonでデータ分析するはじめの一歩(Mac編)
機械学習/Pythonでデータ分析するはじめの一歩(Windows編)
機械学習/Pythonでデータ分析する次の一歩(ディープ・ラーニング、Keras編)
機械学習/Pythonでデータ分析する次の一歩(データ分析支援ライブラリー、pandas編)
機械学習/Pythonでデータ分析する次の一歩(プログラミング言語、Python編)
機械学習/Pythonでデータ分析する次の一歩(実行環境、Jupyter Notebook編)
機械学習/Pythonでデータ分析する次の一歩(数値計算ライブラリー、NumPy編)
機械学習/Pythonでデータ分析する次の一歩(機械学習ライブラリー、scikit-learn編)
機械学習/Pythonで前処理する
機械学習/Pythonで学習パラメーターを最適化する
機械学習/Pythonで決定木を使う
機械学習/Pythonで特徴を選択する
機械学習/Pythonで説明変数の数を減らす
機械学習/Pythonで説明変数を減らす
機械学習/Rで大規模データを扱う
機械学習/Rで機械学習する
機械学習/WindowsでRを使う
機械学習/pandasとscikit-learnとJupyter Notebookで学習パラメーターを最適化する
機械学習/pandasとscikit-learnとJupyter Notebookで決定木を使う
機械学習/クラスタリング
機械学習/機械学習の参考文献
機械学習/機械学習の国際会議
機械学習/機械学習の論文を探す
金融データ・マイニング
金融データ・マイニング/TEDプレゼンテーション
金融データ・マイニング/動的クラスタリングとクラスター変化検出
金融データ・マイニング/時系列クラスタリング
金融データ・マイニング/時系列解析の参考文献
金融データ・マイニング/論文
*はじめに [#a319abfd] このページは、「基礎から学ぶ実践データサイエンス」の第5週「機械学習の基礎」の資料です。 工学研究科情報工学専攻と生命健康科学研究科生命医科学専攻対象の[[「バイオインフォマティクス特論」(秋学期)の資料>授業/バイオインフォマティクス特論]]をまとめたものです。 *準備 [#ma119aa6] Rのインストールについては、次のページを見てください。 -[[MacでRを使う>機械学習/MacでRを使う]] -[[WindowsでRを使う>機械学習/WindowsでRを使う]] ここでは、標準で使用できる''irisデータセット''を使います。 #geshi(rsplus){{ data(iris) }} このデータセットは、アヤメの種類 (Species) をがく片の長さ (Sepal.Length)、幅 (Sepal.Width)、花びらの長さ (Petal.Length)、幅 (Petal.Width) によって分類する問題です。 長さと幅は連続値、種類はsetosa, versicolor, virginicaのいずれかをとる離散値です。 このデータセットには、setosa, versicolor, virginicaという3種類のアヤメについて、それぞれ50個ずつ、合計150個のデータが含まれています。 ランダムに10個のデータを選択して、見てみましょう。 #geshi(rsplus){{ iris[sort(sample(1:150,10)),] }} #geshi(rsplus){{ Sepal.Length Sepal.Width Petal.Length Petal.Width Species 4 4.6 3.1 1.5 0.2 setosa 22 5.1 3.7 1.5 0.4 setosa 65 5.6 2.9 3.6 1.3 versicolor 97 5.7 2.9 4.2 1.3 versicolor 100 5.7 2.8 4.1 1.3 versicolor 108 7.3 2.9 6.3 1.8 virginica 116 6.4 3.2 5.3 2.3 virginica 122 5.6 2.8 4.9 2.0 virginica 136 7.7 3.0 6.1 2.3 virginica 146 6.7 3.0 5.2 2.3 virginica }} *機械学習 [#va675044] AIにおいては、「あるタスクについて、評価尺度 [math]E[/math] があるとき、機械(コンピューター)のが何らかの方法によって評価尺度 [math]E[/math] を向上させること」を''機械学習'' (''machine learning'') といいます。 データサイエンスにおいては、もう少し簡単に、「入力 [math]X[/math] と出力 [math]y[/math] の組 [math](X, y)[/math] を事例といい、事例の集合 [math]D[/math] が与えられたときに、[math]D[/math] から $$y_i = f(X_i) \qquad \forall (X_i, y_i) \in D$$ となる関数 [math]f[/math] を求めること」を機械学習といいます。 与えられた事例の集合 [math]D[/math] に''出力 [math]y[/math] が含まれていない''ものを''教師なし学習'' (''unsupervised learning'') といい、''出力 [math]y[/math] が含まれている''ものを''教師あり学習'' (''supervised learning'') といいます。 上のirisデータセットの場合、Sepal.Length, Sepal.Width, Petal.Length, Petal.Width を入力 [math]X[/math]、Species を出力 [math]y[/math] とすると、がく片の長さ、幅、花びらの長さ、幅からアヤメの種類を判別する教師付き学習と考えることができます。 *教師なし学習 [#l50b13ac] 教師なし学習の代表的な手法は、与えられた事例をいくつかのグループに分割する''クラスター分析(''クラスタリング'', ''clustering'')です。 クラスタリングの代表的な手法として、''階層クラスタリング'' (''hierarchical clustering'') や ''[math]k[/math]-平均法'' (''[math]k[/math]-means'') などありますが、ここでは階層クラスタリングを紹介します。 階層クラスタリングの代表的な方法の一つである''凝集型階層クラスタリング'' (''agglomerative hierarchical clustering'') では、まず、1つのデータだけを含むクラスターをデータと同じ数だけ作ります。 それから、最も近い(似ている)クラスター同士を結合してより大きい新しいクラスターを作ります。 これを全てのクラスターが一つに結合されるまで繰り返します。 Rで階層クラスタリングを用いるには、''hclust''関数を用います。 hclust関数の引数には距離行列を与えます。 距離行列は、''dist''関数で求めることができます。 そこで、まず、irisデータのSepal.Length, Sepal.Width, Petal.Length, Petal.Widthの値から、距離行列を計算します。 #geshi(rsplus){{ d <- dist(iris[,1:4]) }} この距離行列を用いて、階層クラスタリングを行います。 #geshi(rsplus){{ model <- hclust(d) }} 結果を''plot''関数を用いてプロットすると''デンドログラム'' (''dendrogram'') と呼ばれる図が描かれます。 #geshi(rsplus){{ plot(model, labels=iris[,5], xlab="Iris") }} #ref(hc.png,nolink,33%) デンドログラムを見ると、どのクラスターが結合したのかがわかります。 距離尺度とクラスターを結合する方法にはいくつかの方法があります。 距離尺度には ''ユークリッド距離'' (''Euclidean distance'')、結合方法には''Ward法'' (''Ward method'') がよく用いられます。 ''Ward''法は、クラスター[math]C_1, C_2[/math]を結合してクラスター[math]C_1 \cup C_2[/math]を作ったときに、各データとそれが含まれるクラスターの重心との距離の分散の増分を[math]C_1 C_2[/math]間の距離として、最も近い(似ている)クラスターを結合します。 \[ d(C_1, C_2) = {\mathrm E}(C_1 \cup C_2) - {\mathrm E}(C_1) - {\mathrm E}(C_2) \] \[ {\mathrm E}(C_i) = \sum_{{\bf x} \in C_i} (d({\bf x}, {\bf c_i}))^2 \] Ward法を用いるには、hclust関数にオプション''method="ward.D"''を指定します(新しい ward.D2 という方法もあります)。 #geshi(rsplus){{ d <- dist(iris[,1:4]) model <- hclust(d, method="ward.D") plot(model, labels=iris[,5], xlab="Euclidean") }} #ref(hc_euclidean_ward.png,nolink,33%) *教師あり学習 [#zba9a664] 出力 [math]y[/math] が与えられる教師あり学習において、''[math]y[/math] が連続値''(''数値'')であるものを''回帰分析'' (''regression'') といい、''離散値''(''カテゴリー'')であるものを''カテゴリー分析'' (''categolization'') または''分類分析'' (''classification'') といいます。 **回帰分析 [#z660af16] ***単回帰分析 [#m24ab218] 説明したい値を''目的変数''といい、目的変数を説明するために使う変数を''説明変数''と言います。 統計の分野では、目的変数を''従属変数''、説明変数を''独立変数''と呼びます。 まず、説明変数が1つの''単回帰''(single linear regression)を行います。 つまり、モデルが次のような式で表される直線をデータから求めます。 \[\hat{y} = \beta_0 + \beta_1 x_1\] ここで、[math]\hat{y}[/math]がモデルによる''予測値''、[math]x_1[/math]が''説明変数''、[math]\beta_0[/math]が''定数項''、[math]\beta_1[/math]が([math]x_1[/math]の)''係数''です。 ある観測値 [math](x_i, y_i)[/math] に対して、モデルの予測値 [math]\hat{y_i}[/math] と観測値 [math]y_i[/math] の差を''残差''といい、次の式で表されます。 \[ y_i - \hat{y_i} = y_i - (\beta_0 + \beta_1 x_{i, 1}) \] 線形回帰では、''残差の二乗の和''を最小化するような係数と定数項を''最小二乗法''を使って求めます。 つまり、単回帰では、[math]N[/math] 個の観測データに対して、次の値を最小化するよう [math]\beta_0[/math]と [math]\beta_1[/math] を求めます。 (求め方の説明は省きます。) \[ \sum_{i=1}^N \left(y_i - (\beta_0 + \beta_1 x_{i,1})\right)^2 \] 例として、がくの長さ(Petal.Length)を横軸、花びらの長さ(Sepal.Length)を縦軸にとって、150個のデータをプロットしてみます。 #geshi(rsplus){{ plot(iris$Sepal.Length, iris$Petal.Length) }} #ref(iris_single_rawdata.png,nolink,75%) どうやら、花びらの長さとがくの長さの間には正の相関(一方が大きいと他方も大きいという関係)がありそうですね。 そこで、花びらの長さ(Sepal.Length)を [math]x_1[/math](説明変数)、がくの長さ(Petal.Length)を [math]y[/math](目的変数)として、単回帰を行いましょう。 Rでは、モデルの式を、記号''~''を使って「目的変数 ~ 説明変数」というように表します。 したがって、目的変数 [math]y[/math] をがくの長さ(Petal.Length)、説明変数 [math]x_1[/math] を花びらの長さ(Sepal.Length)とするとき、モデルの式は「y ~ x1」となります。 #geshi(rsplus){{ y <- iris$Petal.Length x1 <- iris$Sepal.Length }} 線形回帰は、標準で用意されている''lm関数''にモデル式を入力して行います。 #geshi(rsplus){{ model <- lm(y ~ x1) }} 学習された結果を表示してみると、次のようになります。 #geshi(rsplus){{ model }} #geshi(rsplus){{ Call: lm(formula = y ~ x1) Coefficients: (Intercept) x1 -7.101 1.858 }} Coefficientsは係数を表し、Interceptは定数項の値(切片)を表します。 つまり、花びらの長さを [math]x_1[/math]、がくの長さを [math]y[/math] とすると、学習された式は次のように書けます。 \[ y = -7.101 + 1.858 x_1 \] 学習された単回帰モデルを図示します。 #geshi(rsplus){{ plot(x1, y) abline(model) }} #ref(iris_single_model.png,nolink,75%) 学習されたモデルを''summary関数''に渡すと、モデルに関する情報のサマリーが出力されます。 #geshi(rsplus){{ summary(model) }} #geshi(rsplus){{ Call: lm(formula = y ~ x1) Residuals: Min 1Q Median 3Q Max -2.47747 -0.59072 -0.00668 0.60484 2.49512 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -7.10144 0.50666 -14.02 <2e-16 *** x1 1.85843 0.08586 21.65 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.8678 on 148 degrees of freedom Multiple R-squared: 0.76, Adjusted R-squared: 0.7583 F-statistic: 468.6 on 1 and 148 DF, p-value: < 2.2e-16 }} ''Residuals''は、残差の最小値、中央値、最大値、四分位数を表します。 ''Coefficients''は、''切片'' (Intercept) [math]\beta_0[/math] と [math]x_1[/math] の''係数'' [math]\beta_1[/math] の''推定値'' (Estimate)、''標準誤差'' (Std. Error)を表します。 また、それぞれの推定値が 0 であるという帰無仮説に対するt検定の''t統計量'' (t value)、''p値'' (Pr(>|t|)) が示されています。 p値が0.05を超えている場合は、その説明変数は有意水準5%で統計的に有意ではなく、使えないと判断します。 ''Multiple R-squared''は、''決定係数''で、このモデルがどのくらい説明できているかを 0 から 1 の範囲で表します。 単回帰では説明変数を1つしか使いませんが、説明変数を複数使うことができ、説明変数を増やすと決定係数を1に近づけることができてしまいます。 ''Adjusted R-squared''は、''自由度調整済み決定係数''で、説明変数の数(自由度)によって調整した決定係数を表します。 説明変数の数が異なるモデルを比較するときには、自由度調整済み決定係数を使います。 最後に、係数が全て 0 であるという帰無仮説に対するF検定の''F統計量'' (F-statistic) と''p値'' (p-value) が示されています。 p値が0.05を超えている場合は、このモデルは有意水準5%で統計的に有意ではなく、使えないと判断します。 次に、予測誤差を視覚化するため、それぞれのデータについて、横軸に実際のがくの長さ(Petal.Length)、縦軸にその予測値をとってグラフを表示します。 予測値は''predict関数''で求めることができます。 #geshi(rsplus){{ plot(y, predict(model)) abline(a=0,b=1) }} #ref(iris_single_errors.png,nolink,75%) この予測がどのくらい良いのかを表すために、''平均二乗誤差''(実際の値と予測値の差の二乗の平均)を求めます。 \[\textit{MSE} = \frac{1}{N}\sum_{i=1}^{N} \left(y_i - (\beta_0 + \beta_1 x_{i,1})\right)^2\] #geshi(rsplus){{ mean((y - predict(model))**2) }} #geshi(rsplus){{ [1] 0.743061 }} ***重回帰分析 [#id6e977a] 説明変数が複数ある線形回帰を''重回帰''(multiple linear regression)といいます。 重回帰のモデルは次のような式で表されます。 \[y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_p x_p\ = \beta_0 + \beta^\mathrm{T}\bf{x}\] ここで、[math]\beta[/math]と[math]\bf{x}[/math]は、それぞれ[math]\beta_1, \dots, \beta_p[/math]と[math]x_1, \dots, x_p[/math]を要素とするベクトルです。 また、単回帰のときと同様に、次式で表される二乗誤差の総和を最小化するような[math]\beta_0, \dots, \beta_p[/math]を求めます。 \[\sum_{i=1}^N \left(y_i - (\beta_0 + \beta^\mathrm{T}\bf{x}_i)\right)^2\] ここでは、がくの長さ(Petal.Length)を目的変数 [math]y[/math]、花びらの長さ(Sepal.Length)、幅(Sepal.Width)、がくの幅(Petal.Width)を説明変数 [math]x_1[/math], [math]x_2[/math], [math]x_3[/math] として重回帰を行いましょう。 #geshi(rsplus){{ y <- iris$Petal.Length x1 <- iris$Sepal.Length x2 <- iris$Sepal.Width x3 <- iris$Petal.Width }} 説明変数が複数あるときは、モデルを表すときにそれぞれの変数を記号''+''で連結して表します。 ここでは、「y ~ x1+x2+x3」となります。 単回帰と同じように、''lm関数''を用いてモデルを学習します。 #geshi(rsplus){{ model <- lm(y ~ x1+x2+x3) model$coefficients }} #geshi(rsplus){{ (Intercept) x1 x2 x3 -0.2627112 0.7291384 -0.6460124 1.4467934 }} 単回帰と同じように、学習された式は次のように書けます。 \[ y = -0.2627112 + 0.7291384 x_1 - 0.6460124 x_2 + 1.4467934 x_3 \] 単回帰と同じように、学習されたモデルを''summary関数''に渡すと、モデルに関する情報のサマリーが出力されます。 #geshi(rsplus){{ summary(model) }} #geshi(rsplus){{ Call: lm(formula = y ~ x1 + x2 + x3) Residuals: Min 1Q Median 3Q Max -0.99333 -0.17656 -0.01004 0.18558 1.06909 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.26271 0.29741 -0.883 0.379 x1 0.72914 0.05832 12.502 <2e-16 *** x2 -0.64601 0.06850 -9.431 <2e-16 *** x3 1.44679 0.06761 21.399 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.319 on 146 degrees of freedom Multiple R-squared: 0.968, Adjusted R-squared: 0.9674 F-statistic: 1473 on 3 and 146 DF, p-value: < 2.2e-16 }} 重回帰分析の場合はモデルが視覚化しにくいので、予測誤差だけ視覚化します。 #geshi(rsplus){{ plot(y, predict(model)) abline(a=0,b=1) }} #ref(iris_multiple_errors.png,nolink,75%) 単回帰と同様に、平均二乗誤差を求めます。 \[\textit{MSE} = \frac{1}{N} \sum_{i=1}^N (y_i - (\beta_0 + \beta^\mathrm{T}\bf{x}_i))^2\] #geshi(rsplus){{ mean((y - predict(model))**2) }} #geshi(rsplus){{ [1] 0.09901965 }} 単回帰の場合よりも誤差がかなり小さくなっていることがわかります。 **カテゴリー分析 [#l8da0721] 出力 [math]y[/math] が離散値(カテゴリー)であるカテゴリー分析(分類分析)の基礎的な手法に''決定木学習'' (''decision tree'') があります。 Rで決定木学習を行うには、''tree''パッケージ((Breiman L., Friedman J. H., Olshen R. A., and Stone, C. J. (1984) Classification and Regression Trees. Wadsworth.))((Ripley, B. D. (1996) Pattern Recognition and Neural Networks. Cambridge University Press, Cambridge. Chapter 7.))を使います. ''install.packages''コマンドを入力すると,パッケージをダウンロードするサーバーを聞かれますので,リストからJapanを選択します. #geshi(rsplus){{ install.packages("tree") library(tree) }} ''決定木学習''は、説明変数に対する条件を用いて事例集合を分割することによってラベル(カテゴリー)を予測するための''決定木''を学習するものです。 実物を見た方が理解しやすいので早速決定木を学習します。 まず、''tree''コマンドを用いて決定木を学習します。 #geshi(rsplus){{ model <- tree(Species ~ ., iris) }} ここで、第1引数の「Species ~ .」はモデル式、第2引数の「iris」は訓練データを表しています。 モデル式は「目的変数 ~ 説明変数」という形で表現し、説明変数が「.」(ドット)のときは、目的変数以外の全ての変数を表します。 したがって、ここでは、irisデータセットのSpeciesを目的変数とし、それ以外のすべての変数(Spepal.Lenght, Sepal.Width, Petal.Length, Petal.Width)を説明変数としています。 次に、学習された決定木を表示します。 #geshi(rsplus){{ model }} #geshi(rsplus){{ node), split, n, deviance, yval, (yprob) * denotes terminal node 1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 ) 2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.00000 0.00000 ) * 3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 ) 6) Petal.Width < 1.75 54 33.320 versicolor ( 0.00000 0.90741 0.09259 ) 12) Petal.Length < 4.95 48 9.721 versicolor ( 0.00000 0.97917 0.02083 ) 24) Sepal.Length < 5.15 5 5.004 versicolor ( 0.00000 0.80000 0.20000 ) * 25) Sepal.Length > 5.15 43 0.000 versicolor ( 0.00000 1.00000 0.00000 ) * 13) Petal.Length > 4.95 6 7.638 virginica ( 0.00000 0.33333 0.66667 ) * 7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000 0.02174 0.97826 ) 14) Petal.Length < 4.95 6 5.407 virginica ( 0.00000 0.16667 0.83333 ) * 15) Petal.Length > 4.95 40 0.000 virginica ( 0.00000 0.00000 1.00000 ) * }} テキストでは分かりにくいので、図にします。 #geshi(rsplus){{ plot(model) text(model) }} #ref(iris_decision_tree.png,nolink,67%) 一番上が''根''(root)と呼ばれます。 根から''枝''(branch)が下へと伸び、''節''(node)で分岐します。 節は''条件''に対応します。 枝の先端が''葉''(leaf)で、葉はカテゴリー(ラベル)に対応します。 最初に、根の条件「Petal.Lengthの値が2.45より小さいか」によって事例を分けます。 Petal.Lengthの値が2.45よりも小さい事例は左に、そうでない事例は右に振り分けられます。 右に振り分けられた事例は、次に、2番目の条件「Petal.Widthの値が1.75より小さいか」によって振り分けられます。 Petal.Widthの値が1.75よりも小さい事例は左に、そうでない事例は右に振り分けられます。 ここで右に振り分けられた事例は、「Petal.Lengthの値が2.45より大きい」かつ「Petal.Widthの値が1.74より大きい」事例です。 このように、決定木は、''論理積''(かつ)で結合した条件を表しています。 先に表示したテキストで見てみましょう。 最初の条件で分割する前の集合は ''1)'' です。 最初のrootのところは条件を表しますが、ここでは条件がないのでrootと書かれています。 150はこの集合に含まれる事例の数、239.600はこの集合に含まれる事例のバラツキの度合いです。 そしてsetosaはこの集合に振り分けられた事例に対する予測ラベルです。 ( 0.33333 0.33333 0.33333 )は、setosa, versicolor, virginicaの出現確率を表しています。 最初の条件は「Petal.Length < 2.45」です。 この条件に当てはまる事例の集合が ''2)'' で、そうでない事例の集合が ''3)'' です。 このような分割が葉に至るまで続きます。 ここで、図の右下の条件を見ると、「Petal.Length < 4.95」という条件で分割していますが、どちらに振り分けられてもvirginicaと予測されています。 同じように、左下の条件でも左右ともversicolorになっています。 前者の集合は 7)、後者の集合は 12) です。 そこで、この条件を決定木から取り除きます。 これを''枝刈り''といいます。 枝刈りをするには、''snip.tree''関数を使って、nodeオプションに枝刈りする(条件分岐を止める)節番号のベクトルを指定します。 #geshi(rsplus){{ model <- snip.tree(model, nodes=c(7,12)) }} ここで、決定木のモデル model を枝刈りしたものを同じ名前の変数に代入(上書き)していることに注意しましょう。 #geshi(rsplus){{ plot(model) text(model) }} #ref(iris_decision_tree_pruned.png,nolink,67%) #geshi(rsplus){{ model }} #geshi(rsplus){{ node), split, n, deviance, yval, (yprob) * denotes terminal node 1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 ) 2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.00000 0.00000 ) * 3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 ) 6) Petal.Width < 1.75 54 33.320 versicolor ( 0.00000 0.90741 0.09259 ) 12) Petal.Length < 4.95 48 9.721 versicolor ( 0.00000 0.97917 0.02083 ) * 13) Petal.Length > 4.95 6 7.638 virginica ( 0.00000 0.33333 0.66667 ) * 7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000 0.02174 0.97826 ) * }} 7) と 12) から下の枝が刈られて、なくなっていることがわかります。 最後に、学習した決定木を使って、カテゴリー(Species)が未知のデータに対してそのカテゴリーを予測してみましょう。 まず、''data.frame''関数を用いてデータ・フレームを作成します。 #geshi(rsplus){{ testdata <- data.frame( Sepal.Length=c(6.2,7.0,5.0), Sepal.Width=c(3.3,3.3,3.5), Petal.Length=c(6.0,4.5,1.4), Petal.Width=c(2.4,1.4,0.3) ) testdata }} #geshi(rsplus){{ Sepal.Length Sepal.Width Petal.Length Petal.Width 1 6.2 3.3 6.0 2.4 2 7.0 3.3 4.5 1.4 3 5.0 3.5 1.4 0.3 }} 次に、(枝刈り前の木で予測するために決定木を作り直してから)''predict''関数を用いてカテゴリーを予測します。 #geshi(rsplus){{ model <- tree(Species ~ ., iris) predict(model, testdata) }} #geshi(rsplus){{ setosa versicolor virginica 1 0 0 1 2 0 1 0 3 1 0 0 }} 1番目の事例はvirginicaに、2番目の事例はversicolorに、3番目の事例はsetosaと予測されました。 また、決定木を枝刈りしてから予測すると次のようになります。 #geshi(rsplus){{ model <- snip.tree(model, nodes=c(7,12)) predict(model, testdata) }} #geshi(rsplus){{ setosa versicolor virginica 1 0 0.02173913 0.97826087 2 0 0.97916667 0.02083333 3 1 0.00000000 0.00000000 }} 1番目の事例は97.8%の確率でvirginicaに、2.2%の確率でversicolorに分類されると予測されました。 同様に、2番目の事例は97.9%の確率でversicolorに、2.1%の確率でverginicaに分類されると予測されました。 3番目の事例は枝刈りしなかったときと同様に100%の確率でsetosaと予測されました。 *まとめ [#c32b9e93] データサイエンスにおける機械学習は、出力 [math]y[/math] が与えられない''教師なし学習''と与えられる''教師あり学習''に分けられます。 教師なし学習の代表的な手法は''クラスター分析''(''クラスタリング'')であり、代表的なクラスター分析の手法として''凝集型階層クラスタリング''があります。 教師あり学習のうち、出力 [math]y[/math] が連続値(数値)であるものを''回帰分析''、離散値(カテゴリー)であるものを''カテゴリー分析''(''分類分析'')といいます。 回帰分析の代表的な手法には''重回帰分析''があり、カテゴリー分析の基礎的な手法には''決定木学習''があります。 自分の分析の目的に応じて適切に手法を使い分けることが重要です。 *課題 [#f3707ba5] ''penguins''データセットを用いて、次の分析を行え。 + 正解ラベルを ''species''、説明変数を ''bill_length_mm'', ''bill_depth_mm'', ''flipper_length_mm'', ''body_mass_g'' としたクラスター分析 + 目的変数を ''body_mass_g''、説明変数を ''bill_length_mm'', ''bill_depth_mm'', ''flipper_length_mm'' とした重回帰分析 + 目的変数を ''species''、説明変数を ''bill_length_mm'', ''bill_depth_mm'', ''flipper_length_mm'', ''body_mass_g'' とした決定木学習 レポートには、自分が実行したコマンド、その出力結果、結果についての簡潔な説明を示すこと。 penguinsデータセットは、次のようにしてインストールして使用すること。 #geshi(rsplus){{ install.packages("palmerpenguins") library(palmerpenguins) data(penguins) }} genguinsデータセットは、2007年から2009年にかけて南極のパーマー基地付近で観測されたペンギンのデータセットです。 152羽のアデリーペンギン、68羽のヒゲペンギン、124羽のジェンツーペンギンについて、次の項目が記録されています。 + ''species'': ペンギンの種類 Adelie, Chinstrap, Gentoo + ''island'': 観測された島 Biscoe, Dream, Torgersen + ''bill_length_mm'': 嘴の長さ (mm) + ''bill_depth_mm'': 嘴の幅 (mm) + ''flipper_length_mm'': 翼の長さ (mm) + ''body_mass_g'': 体重 (g) + ''sex'': 性別 female, male + ''year'': 調査した年 2007, 2008, 2009 ランダムに10個のデータを取り出してみると、次のようになっています。 #geshi(rsplus){{ penguins[sort(sample(1:125, 10)),] }} #geshi(rsplus){{ species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year 4 Adelie Torgersen NA NA NA NA <NA> 2007 28 Adelie Biscoe 40.5 17.9 187 3200 female 2007 31 Adelie Dream 39.5 16.7 178 3250 female 2007 54 Adelie Biscoe 42.0 19.5 200 4050 male 2008 66 Adelie Biscoe 41.6 18.0 192 3950 male 2008 74 Adelie Torgersen 45.8 18.9 197 4150 male 2008 87 Adelie Dream 36.3 19.5 190 3800 male 2008 90 Adelie Dream 38.9 18.8 190 3600 female 2008 107 Adelie Biscoe 38.6 17.2 199 3750 female 2009 122 Adelie Torgersen 37.7 19.8 198 3500 male 2009 }} *参考文献 [#m0179760] - 樋口 千洋. 2011. ''Rによるバイオインフォマティクスデータ解析-Bioconductorを用いたゲノムスケールのデータマイニング, 第2版.'' 共立出版. https://amzn.to/4nz0g7v - Horst AM, Hill AP, Gorman KB. 2020. ''palmerpenguins: Palmer Archipelago (Antarctica) penguin data.'' R package version 0.1.0. https://allisonhorst.github.io/palmerpenguins/ - @bob3bob3. 2022. ''パーマーステーションのペンギンたち #1.'' Tokyo.R #99. https://speakerdeck.com/bob3bob3/tokoy-dot-r-number-99-pamasutesiyonfalsepengintati-number-1
タイムスタンプを変更しない
*はじめに [#a319abfd] このページは、「基礎から学ぶ実践データサイエンス」の第5週「機械学習の基礎」の資料です。 工学研究科情報工学専攻と生命健康科学研究科生命医科学専攻対象の[[「バイオインフォマティクス特論」(秋学期)の資料>授業/バイオインフォマティクス特論]]をまとめたものです。 *準備 [#ma119aa6] Rのインストールについては、次のページを見てください。 -[[MacでRを使う>機械学習/MacでRを使う]] -[[WindowsでRを使う>機械学習/WindowsでRを使う]] ここでは、標準で使用できる''irisデータセット''を使います。 #geshi(rsplus){{ data(iris) }} このデータセットは、アヤメの種類 (Species) をがく片の長さ (Sepal.Length)、幅 (Sepal.Width)、花びらの長さ (Petal.Length)、幅 (Petal.Width) によって分類する問題です。 長さと幅は連続値、種類はsetosa, versicolor, virginicaのいずれかをとる離散値です。 このデータセットには、setosa, versicolor, virginicaという3種類のアヤメについて、それぞれ50個ずつ、合計150個のデータが含まれています。 ランダムに10個のデータを選択して、見てみましょう。 #geshi(rsplus){{ iris[sort(sample(1:150,10)),] }} #geshi(rsplus){{ Sepal.Length Sepal.Width Petal.Length Petal.Width Species 4 4.6 3.1 1.5 0.2 setosa 22 5.1 3.7 1.5 0.4 setosa 65 5.6 2.9 3.6 1.3 versicolor 97 5.7 2.9 4.2 1.3 versicolor 100 5.7 2.8 4.1 1.3 versicolor 108 7.3 2.9 6.3 1.8 virginica 116 6.4 3.2 5.3 2.3 virginica 122 5.6 2.8 4.9 2.0 virginica 136 7.7 3.0 6.1 2.3 virginica 146 6.7 3.0 5.2 2.3 virginica }} *機械学習 [#va675044] AIにおいては、「あるタスクについて、評価尺度 [math]E[/math] があるとき、機械(コンピューター)のが何らかの方法によって評価尺度 [math]E[/math] を向上させること」を''機械学習'' (''machine learning'') といいます。 データサイエンスにおいては、もう少し簡単に、「入力 [math]X[/math] と出力 [math]y[/math] の組 [math](X, y)[/math] を事例といい、事例の集合 [math]D[/math] が与えられたときに、[math]D[/math] から $$y_i = f(X_i) \qquad \forall (X_i, y_i) \in D$$ となる関数 [math]f[/math] を求めること」を機械学習といいます。 与えられた事例の集合 [math]D[/math] に''出力 [math]y[/math] が含まれていない''ものを''教師なし学習'' (''unsupervised learning'') といい、''出力 [math]y[/math] が含まれている''ものを''教師あり学習'' (''supervised learning'') といいます。 上のirisデータセットの場合、Sepal.Length, Sepal.Width, Petal.Length, Petal.Width を入力 [math]X[/math]、Species を出力 [math]y[/math] とすると、がく片の長さ、幅、花びらの長さ、幅からアヤメの種類を判別する教師付き学習と考えることができます。 *教師なし学習 [#l50b13ac] 教師なし学習の代表的な手法は、与えられた事例をいくつかのグループに分割する''クラスター分析(''クラスタリング'', ''clustering'')です。 クラスタリングの代表的な手法として、''階層クラスタリング'' (''hierarchical clustering'') や ''[math]k[/math]-平均法'' (''[math]k[/math]-means'') などありますが、ここでは階層クラスタリングを紹介します。 階層クラスタリングの代表的な方法の一つである''凝集型階層クラスタリング'' (''agglomerative hierarchical clustering'') では、まず、1つのデータだけを含むクラスターをデータと同じ数だけ作ります。 それから、最も近い(似ている)クラスター同士を結合してより大きい新しいクラスターを作ります。 これを全てのクラスターが一つに結合されるまで繰り返します。 Rで階層クラスタリングを用いるには、''hclust''関数を用います。 hclust関数の引数には距離行列を与えます。 距離行列は、''dist''関数で求めることができます。 そこで、まず、irisデータのSepal.Length, Sepal.Width, Petal.Length, Petal.Widthの値から、距離行列を計算します。 #geshi(rsplus){{ d <- dist(iris[,1:4]) }} この距離行列を用いて、階層クラスタリングを行います。 #geshi(rsplus){{ model <- hclust(d) }} 結果を''plot''関数を用いてプロットすると''デンドログラム'' (''dendrogram'') と呼ばれる図が描かれます。 #geshi(rsplus){{ plot(model, labels=iris[,5], xlab="Iris") }} #ref(hc.png,nolink,33%) デンドログラムを見ると、どのクラスターが結合したのかがわかります。 距離尺度とクラスターを結合する方法にはいくつかの方法があります。 距離尺度には ''ユークリッド距離'' (''Euclidean distance'')、結合方法には''Ward法'' (''Ward method'') がよく用いられます。 ''Ward''法は、クラスター[math]C_1, C_2[/math]を結合してクラスター[math]C_1 \cup C_2[/math]を作ったときに、各データとそれが含まれるクラスターの重心との距離の分散の増分を[math]C_1 C_2[/math]間の距離として、最も近い(似ている)クラスターを結合します。 \[ d(C_1, C_2) = {\mathrm E}(C_1 \cup C_2) - {\mathrm E}(C_1) - {\mathrm E}(C_2) \] \[ {\mathrm E}(C_i) = \sum_{{\bf x} \in C_i} (d({\bf x}, {\bf c_i}))^2 \] Ward法を用いるには、hclust関数にオプション''method="ward.D"''を指定します(新しい ward.D2 という方法もあります)。 #geshi(rsplus){{ d <- dist(iris[,1:4]) model <- hclust(d, method="ward.D") plot(model, labels=iris[,5], xlab="Euclidean") }} #ref(hc_euclidean_ward.png,nolink,33%) *教師あり学習 [#zba9a664] 出力 [math]y[/math] が与えられる教師あり学習において、''[math]y[/math] が連続値''(''数値'')であるものを''回帰分析'' (''regression'') といい、''離散値''(''カテゴリー'')であるものを''カテゴリー分析'' (''categolization'') または''分類分析'' (''classification'') といいます。 **回帰分析 [#z660af16] ***単回帰分析 [#m24ab218] 説明したい値を''目的変数''といい、目的変数を説明するために使う変数を''説明変数''と言います。 統計の分野では、目的変数を''従属変数''、説明変数を''独立変数''と呼びます。 まず、説明変数が1つの''単回帰''(single linear regression)を行います。 つまり、モデルが次のような式で表される直線をデータから求めます。 \[\hat{y} = \beta_0 + \beta_1 x_1\] ここで、[math]\hat{y}[/math]がモデルによる''予測値''、[math]x_1[/math]が''説明変数''、[math]\beta_0[/math]が''定数項''、[math]\beta_1[/math]が([math]x_1[/math]の)''係数''です。 ある観測値 [math](x_i, y_i)[/math] に対して、モデルの予測値 [math]\hat{y_i}[/math] と観測値 [math]y_i[/math] の差を''残差''といい、次の式で表されます。 \[ y_i - \hat{y_i} = y_i - (\beta_0 + \beta_1 x_{i, 1}) \] 線形回帰では、''残差の二乗の和''を最小化するような係数と定数項を''最小二乗法''を使って求めます。 つまり、単回帰では、[math]N[/math] 個の観測データに対して、次の値を最小化するよう [math]\beta_0[/math]と [math]\beta_1[/math] を求めます。 (求め方の説明は省きます。) \[ \sum_{i=1}^N \left(y_i - (\beta_0 + \beta_1 x_{i,1})\right)^2 \] 例として、がくの長さ(Petal.Length)を横軸、花びらの長さ(Sepal.Length)を縦軸にとって、150個のデータをプロットしてみます。 #geshi(rsplus){{ plot(iris$Sepal.Length, iris$Petal.Length) }} #ref(iris_single_rawdata.png,nolink,75%) どうやら、花びらの長さとがくの長さの間には正の相関(一方が大きいと他方も大きいという関係)がありそうですね。 そこで、花びらの長さ(Sepal.Length)を [math]x_1[/math](説明変数)、がくの長さ(Petal.Length)を [math]y[/math](目的変数)として、単回帰を行いましょう。 Rでは、モデルの式を、記号''~''を使って「目的変数 ~ 説明変数」というように表します。 したがって、目的変数 [math]y[/math] をがくの長さ(Petal.Length)、説明変数 [math]x_1[/math] を花びらの長さ(Sepal.Length)とするとき、モデルの式は「y ~ x1」となります。 #geshi(rsplus){{ y <- iris$Petal.Length x1 <- iris$Sepal.Length }} 線形回帰は、標準で用意されている''lm関数''にモデル式を入力して行います。 #geshi(rsplus){{ model <- lm(y ~ x1) }} 学習された結果を表示してみると、次のようになります。 #geshi(rsplus){{ model }} #geshi(rsplus){{ Call: lm(formula = y ~ x1) Coefficients: (Intercept) x1 -7.101 1.858 }} Coefficientsは係数を表し、Interceptは定数項の値(切片)を表します。 つまり、花びらの長さを [math]x_1[/math]、がくの長さを [math]y[/math] とすると、学習された式は次のように書けます。 \[ y = -7.101 + 1.858 x_1 \] 学習された単回帰モデルを図示します。 #geshi(rsplus){{ plot(x1, y) abline(model) }} #ref(iris_single_model.png,nolink,75%) 学習されたモデルを''summary関数''に渡すと、モデルに関する情報のサマリーが出力されます。 #geshi(rsplus){{ summary(model) }} #geshi(rsplus){{ Call: lm(formula = y ~ x1) Residuals: Min 1Q Median 3Q Max -2.47747 -0.59072 -0.00668 0.60484 2.49512 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -7.10144 0.50666 -14.02 <2e-16 *** x1 1.85843 0.08586 21.65 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.8678 on 148 degrees of freedom Multiple R-squared: 0.76, Adjusted R-squared: 0.7583 F-statistic: 468.6 on 1 and 148 DF, p-value: < 2.2e-16 }} ''Residuals''は、残差の最小値、中央値、最大値、四分位数を表します。 ''Coefficients''は、''切片'' (Intercept) [math]\beta_0[/math] と [math]x_1[/math] の''係数'' [math]\beta_1[/math] の''推定値'' (Estimate)、''標準誤差'' (Std. Error)を表します。 また、それぞれの推定値が 0 であるという帰無仮説に対するt検定の''t統計量'' (t value)、''p値'' (Pr(>|t|)) が示されています。 p値が0.05を超えている場合は、その説明変数は有意水準5%で統計的に有意ではなく、使えないと判断します。 ''Multiple R-squared''は、''決定係数''で、このモデルがどのくらい説明できているかを 0 から 1 の範囲で表します。 単回帰では説明変数を1つしか使いませんが、説明変数を複数使うことができ、説明変数を増やすと決定係数を1に近づけることができてしまいます。 ''Adjusted R-squared''は、''自由度調整済み決定係数''で、説明変数の数(自由度)によって調整した決定係数を表します。 説明変数の数が異なるモデルを比較するときには、自由度調整済み決定係数を使います。 最後に、係数が全て 0 であるという帰無仮説に対するF検定の''F統計量'' (F-statistic) と''p値'' (p-value) が示されています。 p値が0.05を超えている場合は、このモデルは有意水準5%で統計的に有意ではなく、使えないと判断します。 次に、予測誤差を視覚化するため、それぞれのデータについて、横軸に実際のがくの長さ(Petal.Length)、縦軸にその予測値をとってグラフを表示します。 予測値は''predict関数''で求めることができます。 #geshi(rsplus){{ plot(y, predict(model)) abline(a=0,b=1) }} #ref(iris_single_errors.png,nolink,75%) この予測がどのくらい良いのかを表すために、''平均二乗誤差''(実際の値と予測値の差の二乗の平均)を求めます。 \[\textit{MSE} = \frac{1}{N}\sum_{i=1}^{N} \left(y_i - (\beta_0 + \beta_1 x_{i,1})\right)^2\] #geshi(rsplus){{ mean((y - predict(model))**2) }} #geshi(rsplus){{ [1] 0.743061 }} ***重回帰分析 [#id6e977a] 説明変数が複数ある線形回帰を''重回帰''(multiple linear regression)といいます。 重回帰のモデルは次のような式で表されます。 \[y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_p x_p\ = \beta_0 + \beta^\mathrm{T}\bf{x}\] ここで、[math]\beta[/math]と[math]\bf{x}[/math]は、それぞれ[math]\beta_1, \dots, \beta_p[/math]と[math]x_1, \dots, x_p[/math]を要素とするベクトルです。 また、単回帰のときと同様に、次式で表される二乗誤差の総和を最小化するような[math]\beta_0, \dots, \beta_p[/math]を求めます。 \[\sum_{i=1}^N \left(y_i - (\beta_0 + \beta^\mathrm{T}\bf{x}_i)\right)^2\] ここでは、がくの長さ(Petal.Length)を目的変数 [math]y[/math]、花びらの長さ(Sepal.Length)、幅(Sepal.Width)、がくの幅(Petal.Width)を説明変数 [math]x_1[/math], [math]x_2[/math], [math]x_3[/math] として重回帰を行いましょう。 #geshi(rsplus){{ y <- iris$Petal.Length x1 <- iris$Sepal.Length x2 <- iris$Sepal.Width x3 <- iris$Petal.Width }} 説明変数が複数あるときは、モデルを表すときにそれぞれの変数を記号''+''で連結して表します。 ここでは、「y ~ x1+x2+x3」となります。 単回帰と同じように、''lm関数''を用いてモデルを学習します。 #geshi(rsplus){{ model <- lm(y ~ x1+x2+x3) model$coefficients }} #geshi(rsplus){{ (Intercept) x1 x2 x3 -0.2627112 0.7291384 -0.6460124 1.4467934 }} 単回帰と同じように、学習された式は次のように書けます。 \[ y = -0.2627112 + 0.7291384 x_1 - 0.6460124 x_2 + 1.4467934 x_3 \] 単回帰と同じように、学習されたモデルを''summary関数''に渡すと、モデルに関する情報のサマリーが出力されます。 #geshi(rsplus){{ summary(model) }} #geshi(rsplus){{ Call: lm(formula = y ~ x1 + x2 + x3) Residuals: Min 1Q Median 3Q Max -0.99333 -0.17656 -0.01004 0.18558 1.06909 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.26271 0.29741 -0.883 0.379 x1 0.72914 0.05832 12.502 <2e-16 *** x2 -0.64601 0.06850 -9.431 <2e-16 *** x3 1.44679 0.06761 21.399 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.319 on 146 degrees of freedom Multiple R-squared: 0.968, Adjusted R-squared: 0.9674 F-statistic: 1473 on 3 and 146 DF, p-value: < 2.2e-16 }} 重回帰分析の場合はモデルが視覚化しにくいので、予測誤差だけ視覚化します。 #geshi(rsplus){{ plot(y, predict(model)) abline(a=0,b=1) }} #ref(iris_multiple_errors.png,nolink,75%) 単回帰と同様に、平均二乗誤差を求めます。 \[\textit{MSE} = \frac{1}{N} \sum_{i=1}^N (y_i - (\beta_0 + \beta^\mathrm{T}\bf{x}_i))^2\] #geshi(rsplus){{ mean((y - predict(model))**2) }} #geshi(rsplus){{ [1] 0.09901965 }} 単回帰の場合よりも誤差がかなり小さくなっていることがわかります。 **カテゴリー分析 [#l8da0721] 出力 [math]y[/math] が離散値(カテゴリー)であるカテゴリー分析(分類分析)の基礎的な手法に''決定木学習'' (''decision tree'') があります。 Rで決定木学習を行うには、''tree''パッケージ((Breiman L., Friedman J. H., Olshen R. A., and Stone, C. J. (1984) Classification and Regression Trees. Wadsworth.))((Ripley, B. D. (1996) Pattern Recognition and Neural Networks. Cambridge University Press, Cambridge. Chapter 7.))を使います. ''install.packages''コマンドを入力すると,パッケージをダウンロードするサーバーを聞かれますので,リストからJapanを選択します. #geshi(rsplus){{ install.packages("tree") library(tree) }} ''決定木学習''は、説明変数に対する条件を用いて事例集合を分割することによってラベル(カテゴリー)を予測するための''決定木''を学習するものです。 実物を見た方が理解しやすいので早速決定木を学習します。 まず、''tree''コマンドを用いて決定木を学習します。 #geshi(rsplus){{ model <- tree(Species ~ ., iris) }} ここで、第1引数の「Species ~ .」はモデル式、第2引数の「iris」は訓練データを表しています。 モデル式は「目的変数 ~ 説明変数」という形で表現し、説明変数が「.」(ドット)のときは、目的変数以外の全ての変数を表します。 したがって、ここでは、irisデータセットのSpeciesを目的変数とし、それ以外のすべての変数(Spepal.Lenght, Sepal.Width, Petal.Length, Petal.Width)を説明変数としています。 次に、学習された決定木を表示します。 #geshi(rsplus){{ model }} #geshi(rsplus){{ node), split, n, deviance, yval, (yprob) * denotes terminal node 1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 ) 2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.00000 0.00000 ) * 3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 ) 6) Petal.Width < 1.75 54 33.320 versicolor ( 0.00000 0.90741 0.09259 ) 12) Petal.Length < 4.95 48 9.721 versicolor ( 0.00000 0.97917 0.02083 ) 24) Sepal.Length < 5.15 5 5.004 versicolor ( 0.00000 0.80000 0.20000 ) * 25) Sepal.Length > 5.15 43 0.000 versicolor ( 0.00000 1.00000 0.00000 ) * 13) Petal.Length > 4.95 6 7.638 virginica ( 0.00000 0.33333 0.66667 ) * 7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000 0.02174 0.97826 ) 14) Petal.Length < 4.95 6 5.407 virginica ( 0.00000 0.16667 0.83333 ) * 15) Petal.Length > 4.95 40 0.000 virginica ( 0.00000 0.00000 1.00000 ) * }} テキストでは分かりにくいので、図にします。 #geshi(rsplus){{ plot(model) text(model) }} #ref(iris_decision_tree.png,nolink,67%) 一番上が''根''(root)と呼ばれます。 根から''枝''(branch)が下へと伸び、''節''(node)で分岐します。 節は''条件''に対応します。 枝の先端が''葉''(leaf)で、葉はカテゴリー(ラベル)に対応します。 最初に、根の条件「Petal.Lengthの値が2.45より小さいか」によって事例を分けます。 Petal.Lengthの値が2.45よりも小さい事例は左に、そうでない事例は右に振り分けられます。 右に振り分けられた事例は、次に、2番目の条件「Petal.Widthの値が1.75より小さいか」によって振り分けられます。 Petal.Widthの値が1.75よりも小さい事例は左に、そうでない事例は右に振り分けられます。 ここで右に振り分けられた事例は、「Petal.Lengthの値が2.45より大きい」かつ「Petal.Widthの値が1.74より大きい」事例です。 このように、決定木は、''論理積''(かつ)で結合した条件を表しています。 先に表示したテキストで見てみましょう。 最初の条件で分割する前の集合は ''1)'' です。 最初のrootのところは条件を表しますが、ここでは条件がないのでrootと書かれています。 150はこの集合に含まれる事例の数、239.600はこの集合に含まれる事例のバラツキの度合いです。 そしてsetosaはこの集合に振り分けられた事例に対する予測ラベルです。 ( 0.33333 0.33333 0.33333 )は、setosa, versicolor, virginicaの出現確率を表しています。 最初の条件は「Petal.Length < 2.45」です。 この条件に当てはまる事例の集合が ''2)'' で、そうでない事例の集合が ''3)'' です。 このような分割が葉に至るまで続きます。 ここで、図の右下の条件を見ると、「Petal.Length < 4.95」という条件で分割していますが、どちらに振り分けられてもvirginicaと予測されています。 同じように、左下の条件でも左右ともversicolorになっています。 前者の集合は 7)、後者の集合は 12) です。 そこで、この条件を決定木から取り除きます。 これを''枝刈り''といいます。 枝刈りをするには、''snip.tree''関数を使って、nodeオプションに枝刈りする(条件分岐を止める)節番号のベクトルを指定します。 #geshi(rsplus){{ model <- snip.tree(model, nodes=c(7,12)) }} ここで、決定木のモデル model を枝刈りしたものを同じ名前の変数に代入(上書き)していることに注意しましょう。 #geshi(rsplus){{ plot(model) text(model) }} #ref(iris_decision_tree_pruned.png,nolink,67%) #geshi(rsplus){{ model }} #geshi(rsplus){{ node), split, n, deviance, yval, (yprob) * denotes terminal node 1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 ) 2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.00000 0.00000 ) * 3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 ) 6) Petal.Width < 1.75 54 33.320 versicolor ( 0.00000 0.90741 0.09259 ) 12) Petal.Length < 4.95 48 9.721 versicolor ( 0.00000 0.97917 0.02083 ) * 13) Petal.Length > 4.95 6 7.638 virginica ( 0.00000 0.33333 0.66667 ) * 7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000 0.02174 0.97826 ) * }} 7) と 12) から下の枝が刈られて、なくなっていることがわかります。 最後に、学習した決定木を使って、カテゴリー(Species)が未知のデータに対してそのカテゴリーを予測してみましょう。 まず、''data.frame''関数を用いてデータ・フレームを作成します。 #geshi(rsplus){{ testdata <- data.frame( Sepal.Length=c(6.2,7.0,5.0), Sepal.Width=c(3.3,3.3,3.5), Petal.Length=c(6.0,4.5,1.4), Petal.Width=c(2.4,1.4,0.3) ) testdata }} #geshi(rsplus){{ Sepal.Length Sepal.Width Petal.Length Petal.Width 1 6.2 3.3 6.0 2.4 2 7.0 3.3 4.5 1.4 3 5.0 3.5 1.4 0.3 }} 次に、(枝刈り前の木で予測するために決定木を作り直してから)''predict''関数を用いてカテゴリーを予測します。 #geshi(rsplus){{ model <- tree(Species ~ ., iris) predict(model, testdata) }} #geshi(rsplus){{ setosa versicolor virginica 1 0 0 1 2 0 1 0 3 1 0 0 }} 1番目の事例はvirginicaに、2番目の事例はversicolorに、3番目の事例はsetosaと予測されました。 また、決定木を枝刈りしてから予測すると次のようになります。 #geshi(rsplus){{ model <- snip.tree(model, nodes=c(7,12)) predict(model, testdata) }} #geshi(rsplus){{ setosa versicolor virginica 1 0 0.02173913 0.97826087 2 0 0.97916667 0.02083333 3 1 0.00000000 0.00000000 }} 1番目の事例は97.8%の確率でvirginicaに、2.2%の確率でversicolorに分類されると予測されました。 同様に、2番目の事例は97.9%の確率でversicolorに、2.1%の確率でverginicaに分類されると予測されました。 3番目の事例は枝刈りしなかったときと同様に100%の確率でsetosaと予測されました。 *まとめ [#c32b9e93] データサイエンスにおける機械学習は、出力 [math]y[/math] が与えられない''教師なし学習''と与えられる''教師あり学習''に分けられます。 教師なし学習の代表的な手法は''クラスター分析''(''クラスタリング'')であり、代表的なクラスター分析の手法として''凝集型階層クラスタリング''があります。 教師あり学習のうち、出力 [math]y[/math] が連続値(数値)であるものを''回帰分析''、離散値(カテゴリー)であるものを''カテゴリー分析''(''分類分析'')といいます。 回帰分析の代表的な手法には''重回帰分析''があり、カテゴリー分析の基礎的な手法には''決定木学習''があります。 自分の分析の目的に応じて適切に手法を使い分けることが重要です。 *課題 [#f3707ba5] ''penguins''データセットを用いて、次の分析を行え。 + 正解ラベルを ''species''、説明変数を ''bill_length_mm'', ''bill_depth_mm'', ''flipper_length_mm'', ''body_mass_g'' としたクラスター分析 + 目的変数を ''body_mass_g''、説明変数を ''bill_length_mm'', ''bill_depth_mm'', ''flipper_length_mm'' とした重回帰分析 + 目的変数を ''species''、説明変数を ''bill_length_mm'', ''bill_depth_mm'', ''flipper_length_mm'', ''body_mass_g'' とした決定木学習 レポートには、自分が実行したコマンド、その出力結果、結果についての簡潔な説明を示すこと。 penguinsデータセットは、次のようにしてインストールして使用すること。 #geshi(rsplus){{ install.packages("palmerpenguins") library(palmerpenguins) data(penguins) }} genguinsデータセットは、2007年から2009年にかけて南極のパーマー基地付近で観測されたペンギンのデータセットです。 152羽のアデリーペンギン、68羽のヒゲペンギン、124羽のジェンツーペンギンについて、次の項目が記録されています。 + ''species'': ペンギンの種類 Adelie, Chinstrap, Gentoo + ''island'': 観測された島 Biscoe, Dream, Torgersen + ''bill_length_mm'': 嘴の長さ (mm) + ''bill_depth_mm'': 嘴の幅 (mm) + ''flipper_length_mm'': 翼の長さ (mm) + ''body_mass_g'': 体重 (g) + ''sex'': 性別 female, male + ''year'': 調査した年 2007, 2008, 2009 ランダムに10個のデータを取り出してみると、次のようになっています。 #geshi(rsplus){{ penguins[sort(sample(1:125, 10)),] }} #geshi(rsplus){{ species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year 4 Adelie Torgersen NA NA NA NA <NA> 2007 28 Adelie Biscoe 40.5 17.9 187 3200 female 2007 31 Adelie Dream 39.5 16.7 178 3250 female 2007 54 Adelie Biscoe 42.0 19.5 200 4050 male 2008 66 Adelie Biscoe 41.6 18.0 192 3950 male 2008 74 Adelie Torgersen 45.8 18.9 197 4150 male 2008 87 Adelie Dream 36.3 19.5 190 3800 male 2008 90 Adelie Dream 38.9 18.8 190 3600 female 2008 107 Adelie Biscoe 38.6 17.2 199 3750 female 2009 122 Adelie Torgersen 37.7 19.8 198 3500 male 2009 }} *参考文献 [#m0179760] - 樋口 千洋. 2011. ''Rによるバイオインフォマティクスデータ解析-Bioconductorを用いたゲノムスケールのデータマイニング, 第2版.'' 共立出版. https://amzn.to/4nz0g7v - Horst AM, Hill AP, Gorman KB. 2020. ''palmerpenguins: Palmer Archipelago (Antarctica) penguin data.'' R package version 0.1.0. https://allisonhorst.github.io/palmerpenguins/ - @bob3bob3. 2022. ''パーマーステーションのペンギンたち #1.'' Tokyo.R #99. https://speakerdeck.com/bob3bob3/tokoy-dot-r-number-99-pamasutesiyonfalsepengintati-number-1
テキスト整形のルールを表示する