ためすう

How to Win a Data Science Competition (Week2-2 part1)

2019-05-26

EDA examples

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Springleaf competition EDA I

データの形状を知る

x.shape

訓練データはターゲットのカラムが1つ多い(モデルを構築するときは削る)

何行か出力してみる

訓練データ、テストデータともに出力してみる

x.head

欠損値を調べる

各特徴、各行に対して調べる

例 (各行に対して)

train.isnull().sum(axis=1).head(15)

例 (各特徴に対して)

train.isnull().sum(axis=0).head(15)

データをクリーニングする

まずデータの種別を決めていく

  • 特徴ごとのユニークな値の数を調べる

feats_counts = train.nunique(dropna = False)
feats_counts.sort_values()[:10]
  • 一意の特徴を削除する

constant_features = [削除するカラム]
xxx.drop(constant_features,axis = 1,inplace=True)
  • 重複を削除する

欠損値を埋める

traintest.fillna('NaN', inplace=True)

ラベルエンコードする

train_enc[col] = train[col].factorize()[0]

訓練データ(生)、訓練データ(ラベルエンコード済み)で重複カラムを見つける

削除処理

traintest.drop(dup_cols.keys(), axis = 1,inplace=True)

処理に時間がかかった場合、dump しておくと便利

参考

Ruby の Gem のバージョン指定方法

2019-05-26

やったこと

Gem のバージョンを設定する方法について調べます。

確認環境

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

$ rails --version
Rails 5.2.3

調査

$ gem ライブラリ [バージョン]

例. hoge というライブラリをインストールします。

最新版インストール (バージョン指定なし)

gem 'hoge'

バージョン固定 (4.5.6 に固定)

gem 'hoge' '4.5.6'

x.x.x 以上のバージョン (4.5.6 以上)

gem 'hoge' '>= 4.5.6'

x.x.x 以上、y.y.y 未満 (4.5.6 以上 4.7.0 未満のバージョン)

gem 'hoge' '>= 4.5.6, < 4.7.0'

~> (4.5 以上 4.9 以下)

gem 'hoge' '~> 4.5'

参考

Rails5 で rspec をインストールする

2019-05-26

やったこと

Rails5 で rspec を使えるようにします。

確認環境

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

$ rails --version
Rails 5.2.3

調査

Gem のインストール

Gemfile

group :development, :test do
  gem 'rspec-rails', '~> 3.8'
end

bundle インストール

$ bundle install

rspec のインストール

$ rails generate rspec:install
Running via Spring preloader in process 3674
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

rspec を実行 (※ まだテストは空です)

$ bundle exec rspec
No examples found.


Finished in 0.00034 seconds (files took 0.09629 seconds to load)
0 examples, 0 failures

これで rspec の準備が整いました。

参考

Rails5 で http ヘッダーリクエストのキーが変換される件

2019-05-25

やったこと

Rails で http ヘッダーリクエストについて調査をしていて、ハマった時の話しです。

http ヘッダーリクエストのキーが Rails 側で変更されていることにより、ハマりました。

キーがどのように変わっているかについて書きます。

確認環境

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

$ rails --version
Rails 5.2.3

調査

任意のヘッダーを追加した時、Rails側でキーが変換されていることが分かりました。

app/controllers/tasks_controller.rb

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

    logger.debug(1234567)
    request.headers.sort.map { |k, v| logger.info "#{k}:#{v}" }
    logger.debug(request.headers['abc-def'])
    logger.debug(request.headers['HTTP_ABC_DEF'])
    logger.debug(request.headers['abc-xxx-yyy'])
    logger.debug(request.headers['HTTP_ABC_XXX_YYY'])
  end

リクエストを送る

$ curl -H 'abc-def:value' -H 'abc_xxx_yyy: value2' http://localhost:3000/

ログの出力結果

1234567
GATEWAY_INTERFACE:CGI/1.2
HTTP_ABC_DEF:value
HTTP_ABC_XXX_YYY:value2
...
value
value
value2
value2

http のリクエストヘッダーの key に HTTP_ が付与されました。また、- も _ に変更されています。

詳しい処理については、参考のリンクをご覧ください。

参考

Ruby のクラスインスタンス変数

2019-05-25

やったこと

Ruby でクラスインスタンス変数について調べます。

確認環境

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

調査

クラスインスタンス変数

クラスがClassクラスのオブジェクトであるとうことは、クラスオブジェクト自体にインスタンス変数を持たせることができます。

test.rb

class Sample2
  @class_instance_val = :class_instance_val

  def self.hogehoge
    @class_instance_val
  end
end

p Sample2.hogehoge

出力結果

$ ruby test.rb
:class_instance_val

参考

Ruby でインスタンス変数へのアクセスをラクにする

2019-05-25

やったこと

Ruby で インスタンス変数へのアクセスについて調べます。

確認環境

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

調査

アクセサを自動的に定義するには、attr_accessor を使います。

test.rb

class Sample
  attr_accessor :hogehoge
end

s = Sample.new
s.hogehoge = 'init'

p s.hogehoge

出力結果

$ ruby test.rb
"init"

ちなみに

  • 「参照するためのメソッド」だけを定義: attr_reader
  • 「代入するメソッド」だけを定義: attr_writer

を使います。

参考

  • パーフェクトRuby

Ruby でシングルトンを使ってみる

2019-05-25

やったこと

Ruby で singleton を使ってみます。

今回は用意されているライブラリを使います。

確認環境

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

調査

test.rb

require 'singleton'

class SingletonSample
  include Singleton

  attr_accessor :count

  def initialize
    @count = 0
  end
end

p 'obj1'
obj1 = SingletonSample.instance
puts obj1.count
obj1.count += 1
puts obj1.count

p 'obj2'
obj2 = SingletonSample.instance
puts obj2.count
obj2.count += 1
puts obj2.count

p 'id'
p obj1.object_id
p obj2.object_id

出力結果

$ ruby test.rb
"obj1"
0
1
"obj2"
1
2
"id"
70354869597880
70354869597880

参考

アジャイルソフトウェア開発の奥義 第3章 プランニング

2019-05-25

「アジャイルソフトウェア開発の奥義」の読書メモです。

時々、個人の見解入りです。

この章は、XPの「計画ゲーム (planning game)」についてです。

流れ

  • ユーザーストーリを洗い出す
  • 相対的な見積もりをする
    • ある機能を1とした時、他の機能はどれくらいのボリュームとなるかを決める
  • 「速度」を掴むため、1 ~ 2つのストーリーを試作してみる
    • かかる時間が見積れる
  • イテレーションプランニング(たいていは2週間程度)
  • タスクプランニング
    • ストーリーをタスクレベルに分割する

チームの全員が、何を成し遂げるべきか、いつそれを成し遂げるべきかを把握している。

同意。チーム単位でこれを把握していれば、遅れているタスクがあっても手伝ったりできる。

「速度」について

見積もるために「速度」という概念が必要。

これは、例えば1週間ごとにどれくらいこなしたかを実測値として取り、将来の計画も決めていく。

個人的に思うこと

プロジェクトを進める中で予期せぬことはよく発生すると思いますが、

主にその予期せぬことは下記2つの問題に分けられると考えています。

  • 技術的課題
  • 仕様的課題 (既存システムに組み込むという観点、法律の観点など)

最初のうちに気付ければ良いのですが、気付けなかった場合、計画立て直しになるので、

プロジェクト着手前には慎重に検討したいところです。

How to Win a Data Science Competition (Week2-1 part5)

2019-05-25

Exploratory Data Analysis

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Dataset cleaning and other things to check

  • データセットクリーニング

    • 一定の特徴
    • 重複している特徴
  • 他にチェックすること

    • 重複レコード
    • データセットがシャッフルされているかどうか

コンペの主催者はデータの一部を提供する(全部ではない)

traintest.nunique(axis=1) == 1
  • サンプリングが原因で、全てのデータ(訓練データ、テストデータ)で同じものを取ることがある

特徴の重複

traintest.T.drop_duplicates()

※ 関数はビデオに出てたものを写経しました。動作は確認していません。

参考

How to Win a Data Science Competition (Week2-1 part4)

2019-05-25

Exploratory Data Analysis

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Visualizations

  • 個別の特徴を探索する
    • ヒストグラム
    • プロット
    • 統計
  • 特徴の関連を探索する
    • 散布図
    • 相関プロット
    • プロット (インデックスと特徴の統計)

個別の特徴を探索する

ヒストグラム
plt.hist(x)
プロット
plt.plot(x, '.')
散布図
plt.scatter(range(len(x)), x, c=y)
統計値
df.describe()
x.mean()
x.var()
x.value_count()
x.isnull()

特徴の関連を探索する

単一の特徴で結論を出すのが難しいことが分かる

散布図
plt.scatter(x1, x2)
pd.scatter_matrix(df)
df.corr(), plt.matshow(...)
df.mean().plt(style='.')
df.mean().sort_values().plt(style='.')

※ 関数はビデオに出てたものを写経しました。動作は確認していません。

参考