ためすう
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 の返却値と曜日の配列を紐づけます。
参考
はじめに
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 が実行されていることが分かります
参考
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 の昇順になっていることが分かります。
参考
はじめに
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 は特徴のスケーリングに依存する
- データの理解によって良い特徴が生成できる
参考
はじめに
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 万件 (今日のコンペでは中規模のデータ量)
- あるアイテムが、ある日に、どの店舗で売れたかというデータ
- 予測するものは、来月のアイテム、店舗ごとの売上
- すぐに始めて提出し、毎週改善し続ける
参考
はじめに
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つの選択肢に過ぎない。
参考
はじめに
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 は、インスタンス化した後に取り込むときに使うことができるようです。