347

勉強のこと、酒のことを書いていく

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回ずつ試行、平均と標準偏差を記録
  • 結果としてはアヤメのデータは半々に分けるあたりから精度が出始めるとわかる

 

最終的にはデータの分け方とその平均スコア、標準偏差のグラフを描画して納得できる

コード自体は短く、かつ機械学習ができるのは便利、なにかに使えそう

f:id:geva:20180929170646p:plain

機械学習 識別について の勉強継続中

夜勤明けで一眠りしたんで、AbemaTVでゆるキャンの放送が始まるまで勉強します

誰かに公開するブログというより自分用の学習記録になっている

 

2次元データの識別例

散布図を利用し様々な識別器を利用した識別、の続き

 

癌のデータを識別、学習とテストを半々に
  • 癌のデータに対し、線形モデルで分類を実施
  • 全データから学習データ、テストデータを分けるまでの流れを学ぶ
  • 識別器の学習を行い結果を表示、精度について確認

 

アヤメのデータを識別、学習とテストを半々に、するとうまくいかない例
  • 癌のデータと同様に、scikitlearnのテストデータであるアヤメのデータを使用
  • アヤメのデータの半分を学習データ、もう半分をテストデータに分け識別器の学習、結果の表示
  • アヤメのデータは3クラスに分かれているが、学習の結果精度は33%、3クラス問題では無意味な結果になる
  • なぜこうなるか(教師データの内容を見たら思い出したけど)は次の教材で

 

 

機械学習 識別について

今日は夜間作業につき勤務時間まで余裕があるので勉強します

教材は以前も利用していたUdemy、ある程度進めていたけど、最初からやり直し

 

教材はこれ

www.udemy.com

 

識別とは

入力:何らかのデータ(画像、音声、テキストなど)

出力:種類、ラベル、カテゴリ、クラス

出力の種類はカテゴリ数が有限、かつ離散的

 

例:入力はメール、出力は普通のメールまたは迷惑メール として識別を行う

 

教師あり学習教師なし学習

教師あり学習:各データに対し、それらがどのクラスに分類されるかという教師データが付属しているデータセットを使用した機械学習

教師なし学習:上記の教師データがないデータセットを使用した機械学習クラスタリング等に使用される

 

2次元データの識別例

散布図を利用し様々な識別器を利用した識別、

この学習中に時間切れ

matplotlibの関数について細かな疑問、あとサンプルプログラムを理解していなくて変に時間がかかった

 

yという変数に教師データ(0,1)を格納した上で

# 2次元散布図でプロット
plt.scatter(X[:,0], X[:,1], c=y, s=50)
plt.show()
 
とするとこんな図が出るプログラム、散布図の各点をどこで色分けしているのか
変につまずいてしまった
c=y の部分でカラーマップとして教師データを採用しているのに気が付かなった
というよりyというカラーマップ指定があるものと思い込んで時間がかかった

f:id:geva:20180927152118p:plain

勉強継続します

 

勉強、再開します

前回の10日坊主から約9ヶ月、勉強再開します

 

モチベーション

モチベーションがないと勉強が続かないことがわかった

今回は現業務で色々ありまして、人生に第2の矢が無さ過ぎることに気がづいた

モチベーションとしては以下、頑張ろう

  • このままでは今の会社が倒産すると同時に人生が詰む
  • 今の仕事では学びが少ない、仕事がつまらない
  • アウトプットしたい欲
  • 転職したい
  • 給料を上げたい

 

今日やったこと

勉強会でのメモ用、喫茶店で文章書く用にSurfaceを買ったので、Pythonのセッティング

 

今日は環境構築までで終了