ためすう

How to Win a Data Science Competition (Week1-4)

2019-05-18

はじめに

Coursera の 「How to Win a Data Science Competition」 のメモです。

英語字幕しかなかったので、翻訳の意味が分からないところがあるかもしれません。

Introduction & Recap

学習目標

  • Describe competition mechanics
  • Compare real life applications and competitions
  • Summarize reasons to participate in data science competitions
  • Describe main types of ML algorithms
  • Describe typical hardware and software requirements
  • Analyze decision boundries of different classifiers
  • Use standard ML libraries

Software/Hardware Requirements

ハードウェア要件

メモリとCPU

コンペに出るのに困らなさそうな設定

  • メモリ(RAM): 16GB 以上
  • コア数: 4以上

かなり良い設定

  • メモリ(RAM): 32GB 以上
  • コア数: 6以上
ストレージ
  • SSD

クラウド

  • Amazon AWS
  • Microsoft’s Azure
  • Google Cloud

ソフトウェア要件

  • R
  • Python

    • Numpy

      • 線形代数ライブラリ
    • Pandas

      • データのテーブルをSQLライクに操作できる
    • Scikit-learn

      • 機械学習アルゴリズムのライブラリ
    • Matplotlib

      • 折れ線グラフ
      • ヒストグラム
      • 散布図
    • jupyter notebook

      • 対話的なIDE
    • 勾配ブースト決定木の追加パッケージ

      • XGBoost
      • LightGBM
    • Keras

      • ニューラルネットワークのフレームワーク
    • 外部ツール

      • Vowpal Wabbit

      メモリに収まらない巨大データを処理するために設計されている

      • libfm
      • libffm

      スパースデータ (疎なデータ) によく使われる

      • fast_rgf

      アンサンブルで使用するのにおすすめ

    • Anaconda

ここで紹介したものは、1つの選択肢に過ぎない。

参考

How to Win a Data Science Competition (Week1-3)

2019-05-18

はじめに

Coursera の 「How to Win a Data Science Competition」 のメモです。

英語字幕しかなかったので、翻訳の意味が分からないところがあるかもしれません。

Introduction & Recap

学習目標

  • Describe competition mechanics
  • Compare real life applications and competitions
  • Summarize reasons to participate in data science competitions
  • Describe main types of ML algorithms
  • Describe typical hardware and software requirements
  • Analyze decision boundries of different classifiers
  • Use standard ML libraries

Recap of main ML algorithms

機械学習のアルゴリズム

線形モデル

  • ロジスティック回帰
  • SVM

特徴

  • 線で空間を分ける
  • 高次元データに適している
  • それぞれ、異なる損失関数を持つ
  • 線形モデルの限界として、輪を形成している点は分離できない
  • ほとんどの機械学習ライブラリに実装されている (scikit-learnなど)
  • Vowpal Wabbit (大きいデータセットを扱うように設計されている)
樹木モデル

  • ランダムフォレスト (RF)
  • 勾配ブースティング (GBDT: Gradient Boosted Decision Trees)

特徴

  • 決定木 (decision tree)
  • 分割統治法を利用して、分割し続ける
  • コンペの勝者はほぼ使う
  • 表形式データへのアプローチに良い
  • 線形の依存関係を捉えることは難しい
  • 境界線の付近で不正確になる可能性がある
  • ほとんどの機械学習ライブラリに実装されている (scikit-learnなど)
  • XGBoost, LightGBM は高速で正確なライブラリ

k近傍法 (k-nearest neighbor)

特徴

  • ニューラルネットワークとは異なる
  • 互いに近い点が同様のラベルと仮定している
  • 近いオブジェクトを探すために2乗距離を使うが、画像ではあまり意味がない
  • ほとんどの機械学習ライブラリに実装されている
    • scikit-learn がおすすめ(事前定義の距離を使うことができる)
    • 自前の距離関数も実装できる

ニューラルネットワーク

※ このコースでは扱わない

  • TensorFlow
  • Keras
  • MXNet
  • PyTorch
  • Lasagne

特徴

  • 一般的にはブラックボックスで、滑らかな境界線を作る
  • 画像、音、テキスト、シーケンスに適しているものがある

ノーフリーランチ定理

すべてのタスクに対して、他の全ての方法を上回るパフォーマンスを出す方法はない。

参考

Ruby のモジュールについて

2019-05-18

やったこと

Ruby のモジュールについて調べてみます。

確認環境

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

調査

モジュールの特徴

  • 名前空間を作る
  • モジュールのメソッドを、あるクラスのインスタンスメソッドとして取り込む
  • モジュールのメソッドを、あるオブジェクトの特異メソッド(クラスメソッド)として取り込む
  • モジュール関数を定義して使う

名前空間を作る

test.rb

module A
  class B_IN_A
  end
end

p A
p A::B_IN_A

出力結果

$ ruby test.rb
A
A::B_IN_A

モジュールのメソッドをクラスのインスタンスメソッドとして取り込む

Mix-in のことです。

test.rb

module C
  def hoge_in_c
    'hoge_in_c'
  end
end

class D
  include C
end

p D.new.hoge_in_c

出力結果

$ ruby test.rb
"hoge_in_c"

モジュールのメソッドをオブジェクトに取り込む

test.rb

module E
  def hoge_in_E
    'hoge_in_E'
  end
end

o = Object.new
o.extend E

p o.hoge_in_E

出力結果

$ ruby test.rb
"hoge_in_E"

モジュール関数

「privateなインスタンスメソッドであると同時に、モジュールの特異メソッドである」メソッドのこと

test.rb

module F
  module_function

  def hoge_in_F
    'hoge_in_F'
  end
end

include F
p hoge_in_F

p F.hoge_in_F

出力結果

$ ruby test.rb
"hoge_in_F"
"hoge_in_F"

include して呼び出せないことを確認します

test.rb

module F
  module_function

  def hoge_in_F
    'hoge_in_F'
  end
end

class TTT
  include F
end

p TTT.new.hoge_in_F

出力結果

$ ruby test.rb
Traceback (most recent call last):
ruby-module.rb:xx:in `<main>': private method `hoge_in_F' called for #<TTT:0x00007fbbb70ba458> (NoMethodError)

エラーメッセージから private メソッドとして定義されていることも分かりました。

参考

  • パーフェクトRuby

Ruby でモジュールをメソッド呼び出しで include する方法

2019-05-18

やったこと

Ruby でモジュールを取り込むときに、ファイルの定義ではなくメソッド呼び出して取り込む方法を調べました。

確認環境

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

調査

test.rb

module A
  def ggg
    'ggg'
  end
end

s = Struct.new(:x, :y)
p s.superclass
p s.superclass.superclass
p s.superclass.superclass.superclass

b = s.include(A)
p b.new.ggg

p '---'
class C
end
p C.superclass
p C.superclass.superclass

c = C.include(A)
p c.new.ggg

p c.new.extend(A).ggg

出力結果

$ ruby test.rb
Struct
Object
BasicObject
"ggg"
"---"
Object
BasicObject
"ggg"
"ggg"

include は、インスタンス化する前に使って、 extend は、インスタンス化した後に取り込むときに使うことができるようです。

参考

Rails5 でコントローラのメソッドをヘルパーにする

2019-05-17

やったこと

Rails5 でコントローラに定義されているメソッドを、ヘルパーとして定義します。

確認環境

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

$ rails --version
Rails 5.2.3

調査

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  helper_method :hoge

  def new
  end

  private

  def hoge
    logger.debug(request.method)
  end
end

コントローラで定義したメソッドをヘルパーとしてビューで取り扱えます。

app/views/tasks/new.html.erb

<% hoge %>

参考

Rails5 の delegate を使ってみる

2019-05-17

やったこと

Rails5 で delegate を使ってみます。

確認環境

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

$ rails --version
Rails 5.2.3

調査

Active Support で用意されている delegate を使ってみます。

以下は動作を確認するためだけのコードです。

app/models/task.rb

class A
  def hoge
    'name A'
  end
end

class Task < ApplicationRecord
  @@b = A.new
  delegate :hoge, to: :@@b
end

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  def index
    @task = Task.new
    logger.debug(@task.hoge)
  end
end

参考

How to Win a Data Science Competition (Week1-2)

2019-05-15

はじめに

Coursera の 「How to Win a Data Science Competition」 のメモです。

英語字幕しかなかったので、翻訳の意味が分からないところがあるかもしれません。

Introduction & Recap

学習目標

  • Describe competition mechanics
  • Compare real life applications and competitions
  • Summarize reasons to participate in data science competitions
  • Describe main types of ML algorithms
  • Describe typical hardware and software requirements
  • Analyze decision boundries of different classifiers
  • Use standard ML libraries

Competition mechanics

  • Data
  • Model
  • Submission
  • Evaluation
  • Leaderboard

Data

  • データは提供されているもの

データのフォーマットの種類

  • SSV
  • テキスト
  • 写真付きのアーカイブ
  • データベースのダンプ
  • 無効化されたコード

Model

  • コンペの時に作るもの
  • データから答えに変換するもの(ある特定のアルゴリズムを指すのではない)

モデルの特性

  • 最良の予測をする
  • 再現性がある

Submit

  • 予測結果を提出する

Evaluation

  • モデルの質は正解率によって決められる
  • コンベではどの評価関数を使うか決められている

Leaderboard

  • スコア自体よりも他の参加者と比べて相対的な性能を見る
  • データ分析 -> モデル改良 -> 提出 -> Leaderboard を見る を何度も繰り返す
  • 提出物を評価する時、Public、Private の2つのテストデータがある
    • Public はコンペ中の評価に使われるもの
    • Private はコンペ終了時に最終評価するもの(非公開)

コンペに参加する理由

  • 学習の機会
  • 視野を広げる
  • 賞金を獲得できるかもしれない…

Kaggle Overview

  • Kaggle の Overview > Evaluation には、このコンペの評価関数が記載されている
  • コンペの Rules を注意深くみること、参加人数、提出制限などなど、大事なことが書いてある

カーネルの目的

  • アイデアを素早くチェックする
  • 他の参加者にコードを共有する

Real World Application vs Competitions

実世界の機械学習

  • ビジネスの観点から問題を理解する
  • 問題の定式化
  • データを集める
  • データの前処理を行う
  • モデルを構築する
  • モデルを評価する方法
  • モデルをデプロイする方法

コンペ

  • データの前処理を行う
  • モデルを構築する

コンペは実世界の機械学習と比べて、単純化されている。

データに関する洞察は、アルゴリズムよりも大切

参考

Ruby で組み込みクラスを拡張する

2019-05-15

やったこと

Ruby で組み込みクラスを拡張する方法を調べました。

確認環境

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

調査

test.rb

class Array
  def hogehoge
    'hogehoge'
  end
end

p [1, 2].hogehoge
p [1, 2].empty?

出力結果

$ ruby test.rb
"hogehoge"
false

これで拡張出来ましたが、安易に使わない方が良さそうです。

Ruby で中央値を求める

2019-05-15

やったこと

Ruby で中央値を求める方法を調べました。

確認環境

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

調査

今回は、facets という汎用メソッドが拡張されたものがあるので、それを使ってみます。

facets のインストール

$ gem install facets

インストールした facets のバージョン確認

$ gem list | grep facet
facets (3.1.0)

Math.median

test.rb

require 'facets/math'

a = [6, 3, 4, 9, 1, 2]

p Math.median(a)

出力結果

$ ruby test.rb
3.5

Array.median

test.rb

require 'facets/array/median'

b = [6, 3, 4, 9, 1, 2]

p b.median

出力結果

$ ruby test.rb
4

まとめ

配列が偶数個あった場合の挙動が変わります。 Math.median では平均値を出力してくれました。

参考

How to Win a Data Science Competition (Week1-1)

2019-05-14

はじめに

Coursera の 「How to Win a Data Science Competition」 のメモです。

英語字幕しかなかったので、翻訳の意味が分からないところがあるかもしれません。

Introduction & Recap

学習目標

  • Describe competition mechanics
  • Compare real life applications and competitions
  • Summarize reasons to participate in data science competitions
  • Describe main types of ML algorithms
  • Describe typical hardware and software requirements
  • Analyze decision boundries of different classifiers
  • Use standard ML libraries

Welcome to “How to win a data science competition”

知っておくべきこと

  • 前処理
  • 特徴の抽出
  • 正しくバリデーションを設定する
  • 与えられた測定基準を最適化する
  • 潜在的なデータ漏洩の原因について
  • モデルでパラメータを調整すること
  • 特徴量の生成方法
  • モデルをアンサンブルする方法

データ漏洩ってなに

Leakage とは、モデルを作るときに、本来知らないはずの情報(変数やデータ)を不当に使ってしまうこと

モデルの選択が与える影響

We will see, that the choice of the machine learning model impacts both preprocessing we apply to the features and our approach to generation of new ones.

モデルの選択によって、前処理、新しい特徴量の生成のアプローチが変わってくるようです。

このコースの目標

データサイエンスのコンペに出る知識を身に付けること

1週目

  • コンペの仕組み (実務との違い)
  • 主要な機械学習のモデル
  • データ分析のためのPythonライブラリ
  • 特徴の種類、前処理、新しい特徴の作成 (テキスト、画像から特徴を抽出)

2週目

  • コンペの最初にやること(データフレーム、モデル)
  • データ分析のトピック、EDA (探索的データ解析)
  • データの分析方法(匿名化された特徴、データをきれいにする)
  • 検証(データ漏洩、Leaderboard の問題)

3週目

  • 様々な回帰と分類の測定基準
  • mean-encodings

4週目

  • 他の高度な特徴
    • 統計と距離に基づく特徴
    • t-SNE (高次元データの次元を圧縮するアルゴリズム)
    • パラメータ調整
    • モデルのアンサンブル

参考