ためすう

How to Win a Data Science Competition (Week1-5 part1)

2019-05-19

はじめに

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

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

Feature Preprocessing and Generation with Respect to Models

学習目標

  • Explain how employed model impacts choice of preprocessing
  • Summarize feature preprocessings for numeric and categorical features
  • Summarize feature generation approaches for datetime and coordinates
  • Summarize approaches to deal with missing values
  • Outline the pipeline of applying Bag of Words
  • Compare Bag of Words and Word2vec
  • Explain how to extract CNN descriptors from images

Feature preprocessing and generation with respect to models

メイントピック

  • 特徴の前処理
  • 特徴の生成
  • モデルの種類によって、どのように影響するか

特徴のデータ形式について

  • numeric (数値)
  • categorical (カテゴリー)
  • ordinal (序数)
  • datetime (日付)
  • coordinate (座標)

特徴のデータ形式の違いは下記と関連がある

  • モデルの前処理
  • それぞれの特徴の種類による特徴を生成する方法

Kaggle のタイタニックのデータについて

Titanic: Machine Learning from Disaster | Kaggle

  • Survived を予測する

前処理について

  • モデルの品質を改善するために、特徴の種類ごとに方法がある
    • 使用するモデルごとに前処理が変わる

例えばタイタニックのデータを例に説明する 線形モデルを使うとき、特徴が pclass が非線形であったとする 下記のように、カテゴリデータを数値で扱うようにする

pclass pclass == 1 pclass == 2 pclass == 3
1 1 0 0
2 0 1 0
3 0 0 1

データ前処理② データを Categorical から Numerical に。 - Qiita

※ ランダムフォレストの場合は、この前処理は特に必要なし

特徴の生成について

例えば、週ごとの販売数を予測したい時、 線形モデルを使うとき、過去の週数を示す特徴を作る

勾配ブースティング (GBDT: Gradient Boosted Decision Trees) の場合は、各週の平均目標値などを特徴として作る

Numeric features

前処理

スケーリングに依存しない

  • 決定木分類器

スケーリングに依存する

  • k近傍
  • 線形モデル
  • ニューラルネットワーク
正規化
  • 特徴の最小値を0、最大値を1にする
    • sklearn では、MinMaxScaler を使う
  • 平均を0、標準偏差を1にする
    • sklearn では、StandardScaler を使う
外れ値
  • 線形モデルを扱う時、結果に影響を与える

Winsorizing について

外れ値を外れ値以外の最大値・最小値で置き換えるというものである。

ランク変換
  • 外れ値がある場合、MinMaxScaler より良い選択肢
  • 外れ値を手動で処理する時間がない時などに利用
  • scipy ライブラリにある
  • 注意点、テストデータにも適用すること
non-tree-based のモデルに役立つ前処理

大きすぎる値を、特徴の値の平均値に近づける ニューラルネットワークに役立つことが多い

  • log 変換
  • 平方根を利用

特徴の生成

  • 特徴の値通しで、加算、乗算、除算は役立つことがある

まとめ

  • tree-based model は特徴のスケーリングに依存しない
  • non-tree-based は特徴のスケーリングに依存する
  • データの理解によって良い特徴が生成できる

参考

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

2019-05-18

はじめに

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

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

Feature Preprocessing and Generation with Respect to Models

学習目標

  • Analyze the final project task and requirements to compete it
  • Start analyzing data in the final project
  • Start creating benchmark for the final project

Final project

第5週に、コンペに出る。

  • いくつかの異なるモデルを試す
  • 前処理を行う
  • 特徴を生成する
  • テキストから特徴を抽出する

Final project overview

  • コンペのチームに参加した方が良い
  • 「1C」というロシアのソフトウェア会社が提供しているデータ
  • トレーニングデータ
    • 600 万件 (今日のコンペでは中規模のデータ量)
    • あるアイテムが、ある日に、どの店舗で売れたかというデータ
  • 予測するものは、来月のアイテム、店舗ごとの売上
  • すぐに始めて提出し、毎週改善し続ける

参考

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

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