AI 学習サービス Aidemy (アイデミー) の、3 か月コース「AIマーケティングコース」を
一部体験させていただけることになりました!
なので、そこで学んだことを、皆さまにもシェアできればと思い、授業メモを取ることにしました。
(もちろん、私のこの個人メモを見るよりも 実際の Aidemy さんの動画教材 を見た方が 1024 倍勉強になります)
(前回の記事:『AI 学習サービス Aidemy 受講メモ 05 「機械学習にデータはどれくらい必要なのか?」(転移学習, アルゴリズムチートシート)』)
今日の話題- 学習データの使い方
今日は、学習データの使い方について勉強しました。
機械学習するとき
手元のデータを「学習用」と「テスト用」に分割するわけだけど
そのやり方 3 種類を学びました💡
- シンプルな「 ホールドアウト法 (holdout method)」(8:2 くらいに2分割)
- k 分割してうち 1 つをテストデータにして k 回まわす「k-分割交差検証 (クロスバリデーション) (K-fold cross-validation)」
- ひとつだけ抜き出してテストデータとし、残りを学習に回す「Leave-One-Out (一個抜き交差検証)」
元動画、元教材
すべて Aidemy (アイデミー) さんの コンテンツです。
形式 | リンク |
---|---|
動画 | 『2.2.1 データの分割』 |
テキスト | 『2.2.2 学習データとテストデータ』 |
テキスト | 『2.2.3 ホールドアウト法の理論と実践』 |
テキスト | 『2.2.4 k-分割交差検証の理論』 |
テキスト | 『2.2.5 k-分割交差検証の実践』 |
YouTube 動画 (VTuber 版) | 『データの分割』 |
機械学習 と 統計学 の違い
(画像:『データの分割』より)
. | 機械学習 | 統計学 |
---|---|---|
目的 | モデルを構築し、未知のデータを予測・分類するための学問体系 | データを解析し、そのデータに至った背景を説明するための学問体系 |
データの使い方 | 手持ちのデータは分割する:学習用とテスト用(と検証用) | 分割はしない |
同じような例 | 教師あり学習 (回帰) | 重回帰分析 |
「テストデータ」を用意する必要
「テストデータ」を別に用意する理由としては、 機械学習が「未知のデータについて予測する」ことを目的とした学問体系であることが挙げられます。
「画像認識」「株価予測」「ニュース記事のカテゴリ分け」など、機械学習は様々な用途に活用されますが、どの場合でも「未知のデータ」を、学習済みモデルに当てはめて予想データを出力するという部分は共通です。
そのため、構築した学習モデルの評価には、テストデータという未知のデータが必要となります。
(引用元:Aidemy『2.2.2 学習データとテストデータ』より)
データの分割の方法
2 つに分ける場合
- 学習用
- テスト用
3 つに分ける場合
正答率をもとにモデルのチューニングを行う場合、検証用データを使って検証を行います。
(本家動画のページの下に「お詫びと訂正」として掲載されている内容を踏まえて、上の動画スクショには私自身で「学習用」「検証用」「テスト用」の文字入れをしてあります)
# | データ種類 | 用途 |
---|---|---|
1 | 学習用 (訓練用) | モデルの学習用 |
2 | 検証用 | 学習済みモデルが汎用性があるのかどうかの検証用 |
3 | テスト用 (最終評価用) | 最終評価用。モデルの精度をテスト。最後の最後に使う。(上二つのデータに全く関わっていないテストデータで精度を確認したいので) |
学習データとテストデータの分割手法
学習用データとテストデータの分割の方法にはいくつかの手法があり、
代表的な 3 つを学んだ。
- Hold-out (ホールドアウト法)
- Cross Validation(クロスバリデーション法)(交差検証)
- Leave One Out
1. Hold-out (ホールドアウト法)
ホールドアウト法は、
与えられたデータセットを
- トレーニングデータ
- テストデータ
の 2 つに分けて使用するというシンプルな手法です。
(引用元:Aidemy『2.2.3 ホールドアウト法の理論と実践』)
Python のオープンソース機械学習ライブラリ scikit-learn
を使う場合、
train_test_split
関数を使用します。
例)80 % を学習データ、20 % をテストデータに回す場合
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # X...正解ラベル以外の配列 # y...Xに対する正解ラベルの配列 # X_train...トレーニングデータのデータセット(正解ラベル以外) # y_train...トレーニングデータの正解ラベル # X_test...テストデータのデータセット(正解ラベル以外) # y_test...テストデータの正解ラベル # test_size...テストデータの割合
(↓ Aidemy 『2.2.3 ホールドアウト法の理論と実践』の演習問題の画面。こうやって web ブラウザ上で Python のコードを実際に書いて走らせてすぐに正解が分かるのすごく良い)
2. Cross Validation(クロスバリデーション法)(交差検証)
k-分割交差検証(クロスバリデーション)では、
用意したトレーニングデータセットを k 分割し、
そのうちの 1 つをテストデータ、
残りの k-1 個を学習データ
として使用します。
そして、 学習と評価を繰り返して得られる k 個のモデルと性能評価から平均性能を算出 するという手法です。
(引用元:Aidemy『2.2.4 k-分割交差検証の理論』)
k-分割交差検証 は、ホールドアウト法よりも k 倍の演算が必要ということになるね。
↓ k = 10
の場合の k-分割交差検証の様子
(画像:Aidemy『2.2.4 k-分割交差検証の理論』より)
Python のオープンソース機械学習ライブラリ scikit-learn
を使う場合、
cross_val_score
関数を使用します。(公式ドキュメント)
例)k=5 の場合の k-分割交差検証
# X は正解ラベル以外のデータセットの配列、y は正解ラベルの配列 scores = model_selection.cross_val_score(svc, X, y, cv=5)
3. Leave One Out(一個抜き交差検証)(LOO クロスバリデーション)
k-分割交差検証には、 一個抜き交差検証(Leave-One-Out:LOOクロスバリデーション) という手法もあります。
LOO では、k にデータ数と同じ値を設定して、データを 1 つずつ分割し、そのうちの 1 データのみをテストデータとして扱います。
(引用元:Aidemy『2.2.4 k-分割交差検証の理論』)
計算回数がすごいことになりそうだから、LOO やる場合はデータ分割数が少ない場合が良さそうだね
どれを使えばいい?
いろいろ方法があるのは分かりましたが、どれを選べばよいのか分からず。
ググったら分かりやすい記事『機械学習、ディープラーニングでの学習データとテストデータの分割手法について』があったので、ここで紹介させてください。
データサンプル数 | データ分割方法 | コメント |
---|---|---|
~ 10 個 | — | 少な過ぎる |
~ 100 個 | Leave One Out | LOO が有効。とはいえデータサンプル数がまだ少ないので、モデルの精度はあまり良くならない |
~ 1,000 個 | Cross Validation (交差検証) で 10 分割(10-fold cross validation) |
LOO も件数によっては有効だが計算に時間がかかる |
~ 10,000 個 | Cross Validation (交差検証) で 10 分割以内か Hold-out (ホールドアウト法) |
この量の学習サンプル数となると、マシンスペックが非常に重要になる |
~ 100,000 個 | Hold-out (ホールドアウト法) | この量のデータサンプル数になると、ホールドアウト以外無理。 また、マシンスペックやアルゴリズムが非常に重要になる |
それ以上 | (難しい) | 超高性能なマシンスペックが必要となる。研究施設での超最先端な技術みたいな世界 |
(引用元記事:『機械学習、ディープラーニングでの学習データとテストデータの分割手法について』)
当日のツイート
学んだことをツイートしたらわりと反応があったので
これからも学びながらツイートしていこうと思います
[今日学んだこと]
機械学習の「教師あり学習」では学習時
手元のデータを「学習用」と「テスト用」に分割するわけだけどそのやり方 3 種類を学んだ💡
・シンプルな「ホールドアウト法」(8:2 くらいに2分割)
・k分割してうち1つをテストデータにして k 回回す「k-分割交差検証」
・Leave-One-Out
— ちょまど🎀ITエンジニア兼漫画家 (@chomado) July 12, 2020
ホールドアウト法について、
Python の機械学習ライブラリ scikit-learn を使った場合
例えば手元のデータの
80% を学習用
20% をテスト用に使う場合X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)https://t.co/cyn0c80IZc
— ちょまど🎀ITエンジニア兼漫画家 (@chomado) July 12, 2020
ホールドアウト法について、
Python の機械学習ライブラリ scikit-learn を使った場合
例えば手元のデータの
80% を学習用
20% をテスト用に使う場合X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)https://t.co/cyn0c80IZc
— ちょまど🎀ITエンジニア兼漫画家 (@chomado) July 12, 2020
ちなみに、
全て画面ポチポチで機械学習ができる Azure Machine Learning だとこんな感じになる。例えば
ここでデータを分割していて
train と score に分かれてる画像: https://t.co/qgNsvkFGVL
(GUI 分かりやすい…) #AzureML pic.twitter.com/mqVtr2A10u— ちょまど🎀ITエンジニア兼漫画家 (@chomado) July 12, 2020
Next Step
次回は「過学習」について勉強します
[…] (次回の記事:『AI 学習サービス Aidemy 受講メモ 06「教師あり機械学習におけるデータ分割方法」(ホールドアウト法, k-分割交差検証, LOO)』) […]
[…] 機械学習におけるデータ分割方法 […]