ためすう

How to Win a Data Science Competition (Week2-3 part4)

2019-05-29

Validation

学習目標

  • Describe validation process and its purpose
  • Compare validation strategies
  • Identify train/test split in a competition
  • Identify and analyze validation problems

Problems occurring during validation

バリデーション段階の問題

  • データがあまりにも少ないとき
  • データが多様すぎて、不整合があるとき
  • KFold は大抵多くても5で充分

課題の提出段階の問題

  • リーダーボードのスコアがバリデーションスコアより一貫して、高い or 低い
  • リーダーボードのスコアがバリデーションスコアと相関がない

発生する原因

  • Kfold でかなり異なるスコアかもしれない
  • 公開リーダーボードのデータが少なすぎる場合
  • 訓練データとテストデータの分布が異なっているかもしれない

まとめ

  • 公開テストデータが少な過ぎる場合、バリデーションを信頼する(オーバフィットしてないことも確認)
  • 訓練データとテストデータの分け方
  • 訓練データとテストデータの分布

参考

How to Win a Data Science Competition (Week2-4 part1)

2019-05-28

Data Leakages

学習目標

  • Embrace the concept of data leakage
  • Find and exploit typical data leakages
  • Probe public leaderboard

Basic data leaks

リークとは

非現実的に良い予測をする予期しないデータ内の情報

リークが発生するのは、エラー、事故の結果である

データリークの種類

  • 時系列データ

    • 訓練データ、公開テストデータ、非公開テストデータで、時間順になってないものがあるなら、リークを見つけたことになる
  • 期待していない情報

    • メタ情報、ファイル作成日、画像の解像度 などから見つける (はるかに困難)
    • ID の情報
    • 行番号

参考

How to Win a Data Science Competition (Week2-3 part3)

2019-05-28

Validation

学習目標

  • Describe validation process and its purpose
  • Compare validation strategies
  • Identify train/test split in a competition
  • Identify and analyze validation problems

Data splitting strategies

バリデーションの種類

バリデーションデータを作成するのに下記3通りがある。

  • ランダムに分ける
  • 時系列で分ける
  • idごとに分ける
  • 組み合わせ

あるモデルで、有効な特徴も他のモデルでは役に立たないことがある

異なる分割戦略

  • 生成された特徴では
  • モデルはその生成された特徴に依存する
  • ある種のリークがある

バリデーションの時に、コンペの主催者によって、作成された訓練データ、テストデータを再現するのが大切

参考

How to Win a Data Science Competition (Week2-3 part2)

2019-05-28

Validation

学習目標

  • Describe validation process and its purpose
  • Compare validation strategies
  • Identify train/test split in a competition
  • Identify and analyze validation problems

Data splitting strategies

バリデーションの種類

  • holdout
  • K-fold
  • Leave-one-out

holdout

ngroups = 1

sklearn.model_selection.ShuffleSplit

データを下記に分ける

  • 訓練データ
  • テストデータ

  • 十分なデータがあり、異なる分割に対して、同様のスコア、最適なモデルのパラメータを取得する時に使う

K-fold

ngroups = k

sklearn.model_selection.Kfold

データを k 回、訓練データ、テストデータに分ける

そして、平均値を出す

  • 十分なデータがあり、異なる分割に対して、スコア、最適なモデルのパラメータが異なる時に使う

Leave-one-out

ngroups = len(train)

sklearn.model_selection.LeaveOneOut
  • K-Fold の K とサンプル数が一致する場合である
  • データが少ない場合に使う

階層化

  • シャッフルデータには、holdout、K-Fold を使う
  • データが少ない場合、ランダムに分割する
  • 偏りのあるデータに役立つ
  • 他クラス分類に役立つ

参考

Rails5 で rspec の before, after, around を使ってみる

2019-05-27

やったこと

Rails5 で rspec の before, after, around を使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

$ gem list | grep rspec-rails
rspec-rails (3.8.2)

調査

spec/models/task_spec.rb

require 'rails_helper'

RSpec.describe Task, type: :model do

  around(:example) do |example|
    puts 'around example before'
    example.run
    puts 'around example after'
  end

  before(:context) do
    puts 'before context'
  end

  after(:context) do
    puts 'after context'
  end

  it 'gets return' do
    puts 'in the example'
  end
end

出力結果

$ bundle exec rspec spec/models/task_spec.rb -f d

Task
before context
around example before
in the example
around example after
  gets return
after context

Finished in 0.00188 seconds (files took 0.85554 seconds to load)
1 example, 0 failures

参考

Rails5 で時間に関わる rspec のテストを書く

2019-05-27

やったこと

Rails5 で時間に関わるテストを rspec で書いてみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

$ gem list | grep rspec-rails
rspec-rails (3.8.2)

調査

$ rails g rspec:model Task

spec/rails_helper.rb

RSpec.configure do |config|
  ...
  config.include ActiveSupport::Testing::TimeHelpers
  ...
end

spec/models/task_spec.rb

require 'rails_helper'

RSpec.describe Task, type: :model do
  it 'is whether now time' do
    travel_to('2019-05-26 23:00'.to_time) do
      expect(Time.zone.now).to eq(Time.new(2019, 5, 26, 23, 0, 0))
    end
  end
end

参考

Rails5 で json を返す

2019-05-26

やったこと

Rails5 で json を返す方法について調べました。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

$ gem list | grep jbuilder
jbuilder (2.8.0)

調査

hash を使う方法、Jbuilder を使う方法をそれぞれ試してみます。

hash を使う方法

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  def show
    res = {
      'a': 'val1',
      'b': 'val2'
    }

    render :json => res
  end
end

URL例

http://localhost:3000/tasks/1

Jbuilder を使う方法

JbuilderはBuilderと似ていますが、XMLではなくJSONを生成するのに使われます。

URL に json を含む場合

app/views/tasks/show.json.jbuilder

json.a "val1"
json.b "val2"

URL例

http://localhost:3000/tasks/1.json

URL に json を含まない場合

app/views/tasks/show.json.jbuilder

json.a "val1"
json.b "val2"

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  def show
    respond_to do |format|
      format.html { render 'show.json.jbuilder' }
      format.json
    end
  end
end

URL例 http://localhost:3000/tasks/1

参考

Rails5 で rspec の基礎文法を試す

2019-05-26

やったこと

rspec の基礎文法について調べました。

確認環境

$ ruby --version
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

$ gem list | grep rspec-rails
rspec-rails (3.8.2)

feature test

spec/features/session_spec.rb

require 'rails_helper'

RSpec.feature 'session management', :type => :feature do

  scenario 'scenario test' do

  end
end

出力結果

$ bundle exec rspec -f d spec/features/session_spec.rb

session management
  scenario test

Finished in 0.00364 seconds (files took 1.08 seconds to load)
1 example, 0 failures

model test

spec/models/task2_spec.rb

require 'rails_helper'

RSpec.describe Task2, type: :model do
  context 'is context1' do
    it 'is one thing' do
    end
  end

  describe 'is context2' do
    specify 'is one thing in specify' do
    end

    example 'is one thing in example' do
    end
  end
end
  • context, describe は ExampleGroup を作成します
  • it, specify, example は Example を作成します

出力結果

$ bundle exec rspec -f d spec/models/task2_spec.rb

Task2
  is context1
    is one thing
  is context2
    is one thing in specify
    is one thing in example

Finished in 0.0125 seconds (files took 1.02 seconds to load)
3 examples, 0 failures

参考

How to Win a Data Science Competition (Week2-3 part1)

2019-05-26

Validation

学習目標

  • Describe validation process and its purpose
  • Compare validation strategies
  • Identify train/test split in a competition
  • Identify and analyze validation problems

Validation and overfitting

コンペで leaderboard から落ちる2つの理由

  • public leaderboard に対して、1番高いものを提出したこと
  • public/private に対して、一貫した分割を行なっていない または、データが少ない場合

次から

  • validation、overfitting (オーバーフィッティング) の概念を理解すること
  • 安定した validation が行われるべき分割数
  • コンペでよく使われる訓練データ/テストデータの分割方法
  • validation でよく発生する問題

モデルの品質は、訓練データと、将来新しく発生するテストデータで異なる可能性がある

自分たちが持っているデータを下記のように分ける

※ テストデータの分割の仕方は kaggle のコンペの特性上2つに分ける

  • 訓練データ
  • バリデーションデータ
  • テストデータ (public)
  • テストデータ (private)

モデル選択をするため、繰り返し validation にかけ、スコアをチェックする

モデル選択には overfitting, underfitting していないか確認する

=> overfitting と underfitting の中間のモデルを選ぶ

一般的な overfitting と、コンペでいう overfitting は異なる

一般的な overfitting

訓練データセットの品質 > テストデータセットの品質 の時

コンペでいう overfitting

テストデータセットの品質が予想より低くなった時のみ

訓練データとバリデーションデータ

  • underfitting の時、両方高いエラー率
  • overfitting の時、訓練データはエラー率低く、バリデーションデータはエラー率高い

参考

How to Win a Data Science Competition (Week2-2 part2)

2019-05-26

EDA examples

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Springleaf competition EDA II

データの種類を決定する

特徴ごとのユニークな値の数を取得する

nunique = train.nunique(dropna=False)

ヒストグラムを作成する

XGBoost は同じ特徴を見つけるのに苦労する

例 訓練データの特徴を数値とカテゴリで分けます

cat_cols = list(train.select_dtypes(include=['object']).columns)
num_cols = list(train.select_dtypes(exclude=['object']).columns)

2つ目の特徴が1つ目の特徴より大きいならば、時系列の累積データの可能性がある

例えば、月ごとの累積データから、月ごとのデータを抽出するのは、線形モデル、ニューラルネットワークなら行うことができる。(tree-based model はできない)

参考