ためすう

Rails5 で日本語の曜日を表示する

2019-05-20

やったこと

Rails5 で日時データから日本語の曜日を表示します。

確認環境

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

$ rails --version
Rails 5.2.3

調査

$ rails c
Running via Spring preloader in process 62147
Loading development environment (Rails 5.2.3)
irb(main):001:0> Time.now
=> 2019-05-20 18:51:58 +0900
irb(main):002:0> %w(日 月 火 水 木 金 土)[Time.now.wday]
=> "月"
irb(main):003:0> Time.now.wday
=> 1

wday の返却値と曜日の配列を紐づけます。

参考

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

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

Categorical and ordinal features

前処理

ラベルエンコーディング

一意の値を数値にマッピングする

  • tree-based model は有効
  • non-tree-based はあまり効果がない場合がある
ラベルエンコーディングの種類
  • Alphabetical (アルファベットのソート)

sklearn.preprocessing.LabelEncoder

※ 動画の並び順は間違っているような気がします

  • Order of appearance (出現順)

Panda.factorize

  • frequency encoding (出現確率でエンコーディングする)

    • 線形モデル、他の種類のモデルにも役立つ
    • 頻度が予測値と相関がある場合、役立つ
    • 分割数を少なくするのに役立つ
    • 新しく生成する特徴において、同頻度のカテゴリが複数ある場合、区別できない
one-hot encoding
  • 線形モデル、kNN、ニューラルネットワークで役立つ
  • すでに最小値0、最大値1でスケールされている
  • 何百ものバイナリの特徴があると、tree-based modelは速度が遅くなる
  • メモリの節約で疎行列を使う
  • 疎行列は、カテゴリの特徴、テキストを扱うときに便利
  • 疎行列を扱えるライブラリ
    • XGBoost
    • LightGBM
    • sklearn
  • ゼロ以外の値がデータ数の半分よりはるかに少ないなら、疎行列は有効

特徴の生成

  • non-tree-based で役に立つ (ex. 線形モデル、kNN) いくつかのカテゴリの特徴の間での、相互作用

例えば、タイタニックで、予測値が下記に依存するとします。

  • Pclass
  • sex

正しい場合、線形モデルはあらゆるこの2つの組み合わせで、良い結果を出します。

生成方法

両方の特徴量の文字列を繋げて、one-hot encoding を適用する

まとめ

  • ordinal は カテゴリの特徴の特殊なケース
    • ordinal は意味のある順番でソートされている
  • ラベルエンコーディングは、カテゴリの特徴を数字に置き換える
  • frequency encoding は、出現確率でエンコーディングする
  • ラベルエンコーディング、frequency encoding は tree-based model でよく使われる
  • one-hot encoding は、non-tree-based で使われる
  • one-hot encoding をカテゴリの特徴の組み合わせに適用することで、non-tree-based が特徴間の相互作用を考慮される

参考

Rails5 でトランザクションを使う

2019-05-19

やったこと

Rails5 でトランザクションを使ってみます。

確認環境

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

$ rails -v
Rails 5.1.6.2

調査

調査用のモデル生成

$ rails generate model Task email:string

id=1 のデータを2件登録しようとしてみます。

$ rails c
...
irb(main):006:0> ActiveRecord::Base.transaction do
irb(main):007:1*   task = Task.new
irb(main):008:1>   task.id = 1
irb(main):009:1>   task.save!
irb(main):010:1> end
   (0.1ms)  begin transaction
  SQL (0.9ms)  INSERT INTO "tasks" ("id", "created_at", "updated_at") VALUES (?, ?, ?)  [["id", 1], ["created_at", "2019-05-18 17:22:26.459793"], ["updated_at", "2019-05-18 17:22:26.459793"]]
   (1.6ms)  commit transaction
=> true
irb(main):011:0> ActiveRecord::Base.transaction do
irb(main):012:1*   task = Task.new
irb(main):013:1>   task.id = 1
irb(main):014:1>   task.save!
irb(main):015:1> end
   (0.1ms)  begin transaction
  SQL (1.0ms)  INSERT INTO "tasks" ("id", "created_at", "updated_at") VALUES (?, ?, ?)  [["id", 1], ["created_at", "2019-05-18 17:23:01.683041"], ["updated_at", "2019-05-18 17:23:01.683041"]]
   (0.1ms)  rollback transaction
Traceback (most recent call last):
        2: from (irb):11
        1: from (irb):14:in `block in irb_binding'
ActiveRecord::RecordNotUnique (SQLite3::ConstraintException: UNIQUE constraint failed: tasks.id: INSERT INTO "tasks" ("id", "created_at", "updated_at") VALUES (?, ?, ?))

1回目の登録は、 commit されていて

2回目の登録は、 rollback が実行されていることが分かります

参考

【Rails】絶対に抑えたいTransactionのポイントを三つにまとめてみた。【必須】 - Qiita

Rails5 でスコープを使う

2019-05-19

やったこと

Rails5 でスコープを使ってみます。

確認環境

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

$ rails -v
Rails 5.1.6.2

調査

スコープについて

スコープを設定することで、関連オブジェクトやモデルへのメソッド呼び出しとして参照される、よく使用されるクエリを指定することができます。スコープでは、where、joins、includesなど、これまでに登場したすべてのメソッドを使用できます。どのスコープメソッドも、常にActiveRecord::Relationオブジェクトを返します。

default scope を使う

あるスコープをモデルのすべてのクエリに適用したい場合、モデル自身の内部でdefault_scopeメソッドを使用することができます。

app/models/user.rb

class User < ApplicationRecord
  default_scope -> { order(name: :asc) }
end

モデルを呼び出すときは、default_scope が適用されます

app/controllers/users_controller.rb

class UsersController < ApplicationController
  def index
    @user = User.all
  end

発行されたSQL

SELECT "users".* FROM "users" ORDER BY "users"."name" ASC

default_scpe が適用されて name の昇順になっていることが分かります。

参考

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 は、インスタンス化した後に取り込むときに使うことができるようです。

参考