ためすう

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

2019-05-22

Feature extraction from text and images

学習目標

  • 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

Word2vec, CNN

Word2vec

Words

  • Word2vec
  • Glove
  • FastText

Sentences

  • Doc2vec

Bag of words と Word2vec の比較

  • Bag of words

    • ベクトルがかなり大きくなる
    • ベクトルのそれぞれの意味が分かっている
  • Word2vec

    • ベクトルが比較的小さい
    • 意味が解釈される時、不利になることがある
    • 似ている単語はベクトル表現も似ている

画像

  • 畳み込みニューラルネットワークは、画像の圧縮表現を可能にする

以下、画像の分類タスクの内容は今回省きます。

(TODO: 学んだら追記する)

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

2019-05-22

Feature extraction from text and images

学習目標

  • 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

Bag of words

テキストから特徴を抽出する

主に2つの方法がある

  • bag of words を適用する
  • 単語をベクトルにするようなアンサンブルを使う

bag of words

  • 単語ごとに出現数を数える
  • sklearn では CountVectorizer で出来る

後処理

  • サンプルを比較可能にする(特徴のスケーリングに依存しているモデルに対して有効) 単語の出現頻度で正規化する。(全体数で割る)

  • 重要な機能を強化して、不要なものを減らす 特徴を文書数の逆数で正規化する (idf) => 頻度が高い単語に対応する特徴は、頻度が低い単語に対応する特徴より、縮小される

  • sklearn では、TfidVectorizer が使われる

Ngram

  • 単語に対応する列だけでなく、異なる単語に対応する列も追加する
  • 単語ではなく、文字で特徴を持たせた方が手軽なことがある
  • 文字の Ngram はあまり目にしない単語の場合に役立つ
  • sklearn の CountVectorizer は、Ngaram を使うのに適切な Ngram_range というパラメータがある
  • 単語のNgramから、文字のNgramに変更するのに、analyzer というパラメータが使える

前処理

  • Lowercase (小文字化)
  • Lemmatization (語彙化)
  • Stemming (ステミング)
    • 単語の末尾を切り捨て、単語を生成する
  • Stopwords
    • 重要な情報を含まない単語を省く
    • sklearnのCountVectorizerには、max_df というパラメータもある

まとめ

  • 前処理
  • Ngram で分割
  • 後処理 (TF-iDFを使って正規化)

参考

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

2019-05-21

はじめに

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

Handling missing values

欠損値

  • 欠損値を他の値に置き換える

    • -999, -1 など
    • 長所: 木モデルにカテゴリに分類する可能性を与える点
    • 短所: 線形モデル、ニューラルネットワークのパフォーマンスが低下する可能性
    • 平均、中央値
    • 長所: 線形モデル、ニューラルネットワークに有効
    • 短所: 木モデルは、オブジェクトを選択するのが難しい
    • 値の再構築
    • isnull という欠損値かどうかの特徴を作る
      • 平均、中央値を使いつつ、木モデルやニューラルネットワークに関わる問題を解決できる
      • データセットの列が2倍になるのが欠点
    • 時系列データは構築できる可能性がある
  • 欠損値の近くでは、欠損値を置き換えた値との差分が大きくなることがある

  • 外れ値を欠損値として扱うこともある

  • カテゴリ特徴で、テストデータには存在し、訓練データにはない場合、欠損値、カテゴリを変更すると有効なことがある

    • 訓練データに含まれていないカテゴリは、最終的にランダムに扱われる

まとめ

  • データが存在しない NaN を選択するかどうかは、状況による
  • 欠損値を再構築できることもあるが、通常は、欠損値を -999、平均値、中央値に置き換える方が簡単
  • 欠損値はコンペの主催者によって、置き換えられていることがある
  • 欠損値を表す isnull は役に立つことがある
  • 一般的に、特徴の生成前には欠損値を埋めることは避ける
  • Xgboost は欠損値を扱うことができる

参考

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

2019-05-21

はじめに

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

Datetime and coordinates

  • 数値特徴、カテゴリ特徴とは大きく異なる

Datetime

  • Datetime から生成されるほとんどの特徴は2つに分類できる
    • 期間内のある瞬間
    • データ内の繰り返しパータンを捉えるのに役立つ
    • 1週間の何日目、 季節、 年、月、日、時、分、秒
    • 特定のイベントからの経過時間
    • 行に依存しないもの (unix time)
    • 行に依存するもの (直近の休みから、次の休みまでどのくらい期間があるか)
    • 特徴間の差分

coordinates (座標)

下記を特徴として使う

  • 地図上の重要な点までの距離を計算する
  • クラスターの中央の点
  • 座標の周辺の集約統計を計算する
    • 面積
    • 極性 (polarity)

tips

  • decision trees をトレーニングする時、座標を回転させた特徴を作る
    • 回転させる角度のおすすめ (45度、22.5度)

参考

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 万件 (今日のコンペでは中規模のデータ量)
    • あるアイテムが、ある日に、どの店舗で売れたかというデータ
  • 予測するものは、来月のアイテム、店舗ごとの売上
  • すぐに始めて提出し、毎週改善し続ける

参考