ためすう

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 (高次元データの次元を圧縮するアルゴリズム)
    • パラメータ調整
    • モデルのアンサンブル

参考

Ruby でファイルを操作する

2019-05-14

やったこと

Ruby でファイルの書き込み、読み込み、削除をやってみます。

確認環境

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

調査

ファイルの書き込み

File.open('test.md', 'w') do |file|
  file.puts 'hogehoge'
end

ファイルの読み込み

File.open('test.md', 'r') do |file|
  file = file.read
  p file
end

ファイルの削除

File.delete('test.md')

ファイルの存在チェック

if File.exist?('test.md')
  p 'test.md is exist'
end

参考

Rails5 でコールバックを使う

2019-05-14

やったこと

Rails5 で Active Record のコールバックを使ってみます。

確認環境

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

$ rails --version
Rails 5.2.3

調査

コールバックについて

コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。

動作確認

今回は、 after_initialize を使ってみます。

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  def index
    @task = Task.new
  end
end

app/models/task.rb

class Task < ApplicationRecord
  after_initialize :hogehoge

  def hogehoge
    logger.debug('called hogehoge with after_initialize')
  end
end

after_initialize を使えば、initialize をオーバーライドしなくても良くなります。

after_initializeコールバックは、Active Recordオブジェクトが1つインスタンス化されるたびに呼び出されます。インスタンス化は、直接newを実行する他にデータベースからレコードが読み込まれるときにも行われます。これを利用すれば、Active Recordのinitializeメソッドを直接オーバーライドせずに済みます。

参考

第1章 Python ではじめる機械学習 (実践機械学習システム)

2019-05-12

メモ

機械学習の目的は、データの裏側に潜むパターンや関係性を学ぶことで、データについてより深い洞察を得ることです。

作業の流れ

  1. データを読み込み、データを整形する
  2. 入力データの調査および解釈を行う
  3. 学習アルゴリズムにどのような形でデータを入力するのが相応しいか分析を行う
  4. 正しいモデルと学習アルゴリズムを選択する
  5. 結果に対して正確な評価を行う

改良したデータに対して単純なアルゴリズムを用いるほうが、生データに対して洗練されたアルゴリズムを用いるより、結果が良いことがほとんど です。

データを改良する行為を「特徴エンジニアリング (feature engineering)」と呼ばれます。

機械学習の初心者にとって最も間違いを起こしやすい場所は、性能を評価する段階です。

たとえば、まず全データの数%だけを保持 (ホールドアウト) しておき、残りのデータを使って学習を行うとします。そして保持したデータを用い て誤差を計算するのです。

まとめ

大切なこと

  • 機械学習の作業において最も大切なことは、データを理解しデータを扱いやすい形に整形すること。
  • 正しい評価を行うこと。正しい評価を行うにあたって、訓練データとテストデータを区別する。

参考

  • 実践機械学習システム

Ruby で inject を使う

2019-05-12

やったこと

Ruby で inject メソッドについて調べます。

確認環境

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

調査

inject は

リストのたたみこみ演算を行います。

$ rails c
irb(main):001:0> [1, 3, 5].inject { |result, item| result + item }
=> 9
irb(main):002:0> [1, 3, 5].inject { |result, item| result + item**2 }
=> 35
irb(main):003:0> [1, 3, 5].inject(10) { |result, item| result + item**2 }
=> 45
irb(main):004:0> [1, 3, 5].inject(:+)
=> 9

ちなみに、同じ処理をするために each を使っても出来ます。

参考