cross validation、Stratified 10-fold CV
明日は勉強会に参加予定なので自習はできそうにない
というか今月は珍しく既に4つほど勉強会にエントリーしてる
勉強会ってほぼ必ず短時間飲み会がついてるけど、費用どのくらいかかってるんだろう
10-fold CV
- sklearnからKFoldをimportするともうK-fold CVが使える
- 引数でKの値を指定可能、今回は10で指定
- ただKFoldをそのまま使うとStratifiedされていないため、10個に分けられたデータセットの中にはクラスバランスが悪いものが存在する
- そういった場合にはStratifiedKFoldを使用する
- cross validationの精度を計算するためのオブジェクト「cross_val_score」を利用する
- コードが短くて済み、かつ平均と標準偏差も出してくれるので精度が簡単に出せる
# 精度計算ができるcross_val_scoreを使用する、cvで分割数を指定しStratifiedもしてくれるfrom sklearn.model_selection import cross_val_score
ave_score = cross_val_score(clf, X, y, cv=10)print("{0:4.2f} +/- {1:4.2f} %".format(ave_score.mean() * 100, ave_score.std()*100))- 結果
- 94.91 +/- 1.61 %
学んだこと
- K-fold CVは引数でいくつに分割するかを簡単に指定可能、すごい便利
- K-fold CVの精度を計算するのもcross_val_scoreで楽できるなんてすごい
- Python、というかsklearnのライブラリがこんなにも便利だと日々実感する
Hold-out
衛宮さんちの今日のごはん#10 のWeb最速放送が始まるまで勉強
と言いつつ時間がきてしまったので先に視聴
壁走り、花の作画がすごすぎる、そして腹減る
これからも残業しなければ勉強時間は確保できそう
Hold-out
- load_breast_cancer(脳の癌のデータ)に対してHold-outで識別
- データセットの数は約500個
- 次にMNISTという手書き文字のデータセットに対してHold-outで識別
- MNISTは70,000個のデータ、9クラスのデータセット
- MNISTは最初の60,000個が学習データ、10,000個がテストデータと決まっている
- つまり60,000個の中で検証データを更に分け、精度を上げる必要がある
- 試しに60,000個を学習させると、識別器によっては1時間たっても終わらない
- 60,000個もデータがある場合は、Hold-outでも工夫が必要
Hold-out Stratified
- 学習データ、テストデータのクラスバランスが悪い場合を確認するため、極端な例としてデータセットの95%を学習データ、5%をテストデータとしてみる
- ShuffleSplitでデータセットを分割し、クラスバランスを確認すると偏りが見える
- そういった場合はStratifiedShuffleSplitを使用する
- そうするとクラスバランスを保ったまま学習データ、テストデータに分けてくれる
学んだこと
- 前日で学んだ、データセットの数に対しての分割方法について、コードを動かして「あー本当に計算リソースによっては時間かかりすぎて無理だな」と実感
- StratifiedShuffleSplit すごい
- sklearnからimportするだけでStratifiedを一発で出来てしまうなんて便利すぎる
学習データとテストデータの分け方概論
酒を飲む前に勉強します
引き続きUdemyの機械学習講座にて勉強
学習環境は、家にデスクトップPCがあるものの、誘惑が多いのでノートPC
Mac miniが発売されたら購入して家の環境を整理したい
学習データとテストデータの準備
- 学習データ=テストデータ、というのはよくない
- 元のデータに適用しすぎ、他の新たなデータに適用できない識別器ができてしまうため
- 通常は手持ちのデータに対し、50%を学習データ、50%をテストデータというように分けて使用する
- 学習データ≠テストデータ、とするのがよい
- Hold-outと言われる
Cross varidation
- Cross varidation、K-fold CV、交差検定、交差検証、交差確認とも言われる
- 手持ちのデータをn等分し、学習データとテストデータを入れ替えながら学習させる
- 例:100個のデータ、4等分の場合、1-75番目までを学習データ、76-100番目までをテストデータとする 次に1-50番目と76-100番目を学習データ、51-75番目をテストデータとする、ということを繰り返す方法
Leave one out
- N-fold CV、LOO、LOOCV、1つ抜き法、ジャックナイフ法とも言われる
- 手持ちのデータが少ない場合に使用される
- 手持ちのデータから1つのデータのみをテストデータとし、残りすべてを学習データとする
- 例:100個のデータの場合、1-99番目までを学習データ、100番目をテストデータとする 次に1-98番目と100番目を学習データ、99番目をテストデータする、ということを繰り返す方法
Stratified(層化)
- 学習データとテストデータを半々に分ける場合、ランダムに分けた場合でも学習データとテストデータのクラス(教師データ)が偏る可能性がある
- 学習データとテストデータの内容を、クラス(教師データ)の比率を保ったまま分ける、という方法
学習データ、テストデータ、検証データ
- 実際に機械学習を行う場合、手持ちデータを学習データ、テストデータに分けるが、学習データを更に学習データと検証データに分け、その中で精度が出るよう設定する
- テストデータはその後の本番として、本当に精度が出るかを試すために使用する
- 学習データとテストデータに分け、そのテストデータに合うようにチューニングを繰り返すと、そのテストデータに特化した識別器になってしまうため
どのくらいデータがあればよいか
- 学習サンプル数 < 10、本当に機械学習が必要かどうか、考え直す
- 学習サンプル数 < 100、機械学習ができないことはないが増やす努力が必要、性能は悪い、LOOCVが可能
- 学習サンプル数 < 1,000、まともな性能、10-fold CVで十分
- 学習サンプル数 < 10,000、良い性能が期待できる、K-fold CV(K < 10)を使用、計算リソースが重要となる
- 学習サンプル数 < 100,000、実応用、Hold-out以外無理、計算にかなり工夫が必要
- それ以上は最先端、実応用で頑張るしかない
学習・テストの分割方法はどれがよいか
- コンテスト、データセットに規格、基準が付属している場合はそれに従う
- 学習サンプル数が少ない場合はLOO
- 学習サンプル数がそこそこ、数百~数千ある場合は10-fold CV
- 学習サンプル数が膨大な場合、Hold-outしかない
- Stratifiedは常に重要
学習データ=テストデータの場合
- コードを書きながら実際の動きを学ぶ
- ランダムな2クラスの学習サンプルを作成、学習データ=テストデータで学習させた後、新たな学習サンプルを作成、精度を確認する
- 新たな学習データでは精度が約50%、2クラス問題では最低の精度になる
識別におけるデータの分け方について
Udemyで勉強しつつコード動かしつつブログにその内容をまとめます
データの分け方
- アヤメのデータは教師データが最初の3分の1が0、次の3分の1が1、最後の3分の1が2というラベルがついて整理されているため、そのデータを半々に分けて学習とサンプルデータにしてもうまく学習できない
- データをランダムにシャッフルするモジュールを利用する
- すごい便利
- ランダムに分ける、という行為がたまたまうまく識別できるよう分けられた、ということかどうか検証する
- 複数回試行してその差を確認
- 次にデータの分け方を半々ではなく、1対9、2対8 ... 9対1に分け、それぞれを1000回ずつ試行、平均と標準偏差を記録
- 結果としてはアヤメのデータは半々に分けるあたりから精度が出始めるとわかる
最終的にはデータの分け方とその平均スコア、標準偏差のグラフを描画して納得できる
コード自体は短く、かつ機械学習ができるのは便利、なにかに使えそう
機械学習 識別について の勉強継続中
夜勤明けで一眠りしたんで、AbemaTVでゆるキャンの放送が始まるまで勉強します
誰かに公開するブログというより自分用の学習記録になっている
2次元データの識別例
散布図を利用し様々な識別器を利用した識別、の続き
- scikit-learnとpandasのpipによるインストール
Windowsでscikit-learn(sklearn)をインストールしてirisの予測をサクッとするまで - SuprSonicJetBoy's blog
- KNeighborsClassifierを用いた学習、識別
- LogisticRegressionを用いた学習、識別
- svm(サポートベクターマシン)を用いた学習、識別
- データを準備、読み込み、プロットによる確認、識別器作成と学習、識別の一連の流れを学んだ
癌のデータを識別、学習とテストを半々に
- 癌のデータに対し、線形モデルで分類を実施
- 全データから学習データ、テストデータを分けるまでの流れを学ぶ
- 識別器の学習を行い結果を表示、精度について確認
アヤメのデータを識別、学習とテストを半々に、するとうまくいかない例
- 癌のデータと同様に、scikitlearnのテストデータであるアヤメのデータを使用
- アヤメのデータの半分を学習データ、もう半分をテストデータに分け識別器の学習、結果の表示
- アヤメのデータは3クラスに分かれているが、学習の結果精度は33%、3クラス問題では無意味な結果になる
- なぜこうなるか(教師データの内容を見たら思い出したけど)は次の教材で
機械学習 識別について
今日は夜間作業につき勤務時間まで余裕があるので勉強します
教材は以前も利用していたUdemy、ある程度進めていたけど、最初からやり直し
教材はこれ
識別とは
入力:何らかのデータ(画像、音声、テキストなど)
出力:種類、ラベル、カテゴリ、クラス
出力の種類はカテゴリ数が有限、かつ離散的
例:入力はメール、出力は普通のメールまたは迷惑メール として識別を行う
教師あり学習、教師なし学習
教師あり学習:各データに対し、それらがどのクラスに分類されるかという教師データが付属しているデータセットを使用した機械学習
教師なし学習:上記の教師データがないデータセットを使用した機械学習、クラスタリング等に使用される
2次元データの識別例
散布図を利用し様々な識別器を利用した識別、
この学習中に時間切れ
matplotlibの関数について細かな疑問、あとサンプルプログラムを理解していなくて変に時間がかかった
yという変数に教師データ(0,1)を格納した上で
勉強継続します
勉強、再開します
前回の10日坊主から約9ヶ月、勉強再開します
モチベーション
モチベーションがないと勉強が続かないことがわかった
今回は現業務で色々ありまして、人生に第2の矢が無さ過ぎることに気がづいた
モチベーションとしては以下、頑張ろう
- このままでは今の会社が倒産すると同時に人生が詰む
- 今の仕事では学びが少ない、仕事がつまらない
- アウトプットしたい欲
- 転職したい
- 給料を上げたい
今日やったこと
勉強会でのメモ用、喫茶店で文章書く用にSurfaceを買ったので、Pythonのセッティング
- Python公式サイトから最新バージョンのダウンロード、インストール
- VSCodeのダウンロード、インストール
- どちらもあくまで学習用、個人用途なので最新版を導入
- 以下を参考に日本語化
- ファイル - 基本設定 - 配色テーマ からVSCodeのからLightに変更
- 拡張機能 - 検索 からPythonと検索し、Python Extensionを導入
- print('hello world!')
今日は環境構築までで終了