統計とイモリとバーベルと

勉強の備忘録メイン

なぜFGOを始めてしまったのか

Missing Data: ① ありがちな対処法とその影響

個人的に,欠測値の処理はデータ分析にあたって考えたくないことの筆頭です.
とりあえず早く結果を出したいから暫定の処理をして分析を進めるも,「欠測値をなんとかしなければ」というのは常に頭の片隅にこびりついている.それをストレスに感じつつも,目の前のタスクに追われていたり,モデル選択・特徴量設計に取り組む魅力のほうが大きかったりと,つい後回しにしてしまう.そんなこんなで,気づいた頃には分析も佳境に......
治験関係の統計解析では,欠測値の処理も含めてすべての条件を本番データが揃う前に決定してしまうので,ここまでわたわたすることもないのですが,それにしても,欠測処理が退屈で考えたくないことだ,という印象に変わりはありません.

欠測値について考えたくない理由5選
1. 理論はともかく,実データの欠測処理は面白くない(賛否ありそうですが…)
2. 早く何らかの分析結果を出したい
3. うまくやったところで評価されない
4. どのような害がどの程度起こるのか想像しづらい
5. いざ実データに相対すると,何をするのが正しいのかわからない

3は諦めるしかないでしょうね.前処理全般に言えることなのでしょうが…. 今回はシリーズで欠測処理についてまとめる予定です.可能な限り手早く,頭を使わずに欠測値処理を行えるように勉強を進めます.

シリーズを通して,こちらの書籍を参考にしていきます.調査観察データの統計科学で有名な星野崇宏教授も編集・執筆に加わっておられるようです.

欠測データの統計科学――医学と社会科学への応用 (調査観察データ解析の実際 第1巻)

欠測データの統計科学――医学と社会科学への応用 (調査観察データ解析の実際 第1巻)

今日のお題は「① ありがちな対処法とその影響」. 「とりあえずデータがあるものだけで分析した」「とりあえず平均値を代入しておいた」といった方針がどの程度結果を歪ませるのかを見ていきます.

続きを読む

筋トレログ 2017.12.14

体組成晒し

ジムに体組成計があるので,月イチで測定して結果を晒していく予定. まずは約1ヶ月前,昨年12/14の測定記録から...

f:id:kaizu_3324:20180108202810j:plain

ザコ過ぎて泣けてくる. 辛うじて上腕が標準以上の筋肉量を示しているものの,それなりにあると思っていた脚が標準未満. デッドをやっていた頃は脚は実質週2でトレーニングできていたが,現環境でデッドは厳しいので,何か考えなければ. 胸の日か背中の日にレッグプレス1セット挟んでいこうかな.

現時点のセット重量

BP: 60kg SQ: 90kg

メモ: 学習済み単語ベクトルについて

学習済み単語ベクトルとは?

メモ: Embeddingについて で触れたように,文章を単語化して生成されたSequenceは,Vocabularyに対するone-hot表現のまま用いるのではなく,分散表現に変換した上でNNなり他の分類器なりに投じることで,次元の削減による計算量の節約と,分散表現に変換することによる情報の保存が期待される.
学習済み単語ベクトル(Pre-trained word vectors)は,その名の通り,wikipediaなどのオープンデータを用いて作成された膨大な数の単語の分散表現データセットである.データソースや作成方法の違い,言語の違いからいくつもの学習済み単語ベクトルが公開されている.

なぜ学習済み単語ベクトルを用いるのか?

単語ベクトルの作成には,① 文章データの取得,② 文章データの前処理, ③ 単語ベクトルの学習 の各ステップが必要になるが,これらは多大な労力を要する場合が少なくない.また,分析したいデータセットではデータ量が十分でなく,適当な分散表現に変換できないこともあると思われる.

学習済み単語ベクトルにはどのようなものがあるのか

下記リンク等を参照

いますぐ使える単語埋め込みベクトルのリスト - Qiita

以下ではStanford大学のGloVeを使用した. https://nlp.stanford.edu/projects/glove/

どのように使用するか

  1. 使用する単語ベクトルの種類を決める(Wikipediaから学習したものか,Twitterか,Common Crawlのものか)
  2. 単語ベクトルをダウンロード
  3. pythonで読み込み
   embeddings_index = dict()
   f = open('/hoge/glove.twitter.27B/glove.twitter.27B.100d.txt')
   for line in f:
       values = line.split()
       word = values[0]
       coefs = np.asarray(values[1:], dtype='float32')
       embeddings_index[word] = coefs
   f.close()
   print('Loaded %s word vectors.' % len(embeddings_index))
  1. 必要なものだけ抽出するなどして適宜保存する
  2. keras.layers.Embeddingに突っ込む等
Embedding(input_size, 100, weights=[embedding_matrix], input_length=hoge, trainable=False)

その他参考リンク

How to Use Word Embedding Layers for Deep Learning with Keras - Machine Learning Mastery

2018年,始めました

ついうっかり抱負などを立ててしまいました. 数が多すぎるのはわかっているので,この中で半分くらいは達成できたらいいなぁと思っています. とにかく時間がないので,無駄(主に単純作業による残業とか,ぼーっとスマホをいじっている時間とか)を減らしていかないと.

以下,抱負の各項目についてコメントしていきます.

kaggle competitions expert達成

言わずと知れたkaggle.まずは目下進行中のメルカリコンペで主要な分析手法・scikit-learn流のデータ前処理を一通り身に着けて,その次あたりからメダル狙いで本格参戦の予定.もちろんメルカリコンペも可能な限りブロンズ以上を狙っていきますが. 時間の関係でsubmission数を重ねるのが厳しいのと,計算能力もアレ(corei5-6700K, memory 16GB, GTX1060 6GB)なので,画像処理・音声処理を避けてオーソドックスなデータ分析と自然言語処理あたりで継続できたらいいですね. GCPとかAWSはとりあえず保留で…

pythonでblue coder以上

scikit-learnのもろもろのツール(LabelEncoderとか)を使っていると,scikit-learn API以外を触れなくなる気がしたので,Coding能力の向上ととnumpyの扱いに慣れることを目的に設定しました.
欲を言えばyellow以上を目指したいのですが,別にエンジニアになりたいわけではないので,とりあえずはblueを目指します.それでもアルゴリズム周辺は必須と思われるので,勉強になりそう.

情報理工に受かる程度の数学力

線形代数とかグラフ理論とか,難しいよね…(遠い目)
昨年も微積線形代数,確率統計,離散数学あたりはやっていましたが,まだまだ不足という感覚....次は複素関数論,グラフ理論微分方程式,最適化数学あたりでしょうか(レベル感とか順序が違うのは気にしない). 深層学習とか,界隈の論文に出てくる数学が,読めば概略がわかる程度には数学力を身に着けたいと考え,設定.

残業月20h以下

これ以上やってたらほかの事がまともにできません.ロングスリーパーはつらい.標準労働時間短くならないかな.

給料以外の収入源を作る

これはまぁ(笑)ノープラン(笑)

BP80kg SQ120kgでセットを組む

最近ようやくBP60kg,SQ100kgの人権ラインを回復したので,1年あれば達成できそうなレベルで設定.週3で継続すれば不可能ではないかな.

爬虫類を飼う

無難にレオパか,少し冒険してフトアゴにするか….最近はニシアフが気になっています.

Cカード取得

Cカードはダイビングの基本ライセンスです.申し込めば十中八九取得できるのですが,お金がかかるし,取ってもペーパーダイバーになりそうなので検討中.

入門機的なカメラを買って一通り使えるようになる

うちのイモリをかわいく撮りたい.以上.

半端記事でもいいからブログを週1更新

半端記事,駄文でお目汚しをするかと思いますが,生暖かく見守っていただければ幸いです.書いていることが間違っていたり,議論の余地があったりするときはバンバンご指摘ください.

以上,ぼちぼち頑張っていきますので,本年もよろしくお願いいたします.

メモ: Embeddingレイヤについて [keras]

いろいろ間違って理解していそうでアレ

Embeddingとは?

このスライドのp11以降がわかりやすい. カテゴリカル変数をone-hot表現から分散表現に変換する. 名義変数で表現された分析対象を複数の特徴量の組み合わせで表現する. レコードごとの因子得点を計算する操作に近い. 近くもなかった.

言語と画像の表現学習

ていうかこれ書いたの学部1年生なのね…恐ろしい...

なぜEmbeddingするのか?

自然言語処理において,keras.preprocessing.text.Tokenizerなどを用い,ボキャブラリを構築して各単語にIDを割り当てるが,IDそのものは意味を持たず,単語間に存在しうる有力な情報が失われている ② 疎なデータセットの構築につながるため,有効な学習のためには多くのデータが必要になる ③ 文章をトークン化したSequenceでなはない,単一のカテゴリカル変数に対しても,Embeddingをする意味はある.カテゴリカル変数は種々の分析でone-hot vectorに変換して利用されるが,カテゴリ同士が独立であることを仮定していたり,カテゴリ間の意味的な距離関係やカテゴリ間の順序性などが失われたりと,不十分な点も少なくない.また,カテゴリが多い場合には,次元が大きくなりすぎる問題もある.

Embeddingレイヤは具体的に何をしているのか

一般論

one-hot vectorを連続的なベクトル空間にマッピングする.
この結果,意味の近い単語同士が近い位置にマッピングされる等,意味がある程度保存される.また,連続変数に変換される点は,NNを使用する点で重要.

Skip-gramの場合

単語同士の隣接確率を目的変数として隠れ層1のNNを学習する. 学習のoutput(隣接確率のNNベースの予測値)ではなく,学習により得られた隠れ層の重み行列を利用する.

keras.layers.Embeddingでは何をしているのか

input(None, n)をone-hotに変換(None, n, m)してからembedding matrix(m, m)を学習して,output(None, n, m*)のテンソルを返している.
ただし,肝心の学習方法がよくわからない.Skip-gramを使用している? いずれにせよ,学習済みのembedding matrixを掛けているわけではなく,何らかの形で学習をしている模様.テキストをNNに突っ込むなら学習済みの行列を使用したほうが良さそう.

どうやって使うのか

このリンクを参照すればOK. pre-trained matrixを使用する場合についても書いてある.

How to Use Word Embedding Layers for Deep Learning with Keras - Machine Learning Mastery

その他参考リンク集

Embeddingレイヤー - Keras Documentation

qiita.com

qiita.com

[1604.06737] Entity Embeddings of Categorical Variables

データ読み込みでハマった話

痛めていた腰が治ったので,2週間ぶりにスクワットやってきました. ケガ明けで輪をかけてショボい重量ですが,それでも楽しいからスクワットはすごい. みなさんもスクワットしましょう.

概要

Double Pipe(||)区切りファイルに出会い,読み込みでハマったのでメモ.

問題

pd.read_tableでDouble Pipe(||)区切りファイルを読み込もうとしたら怒られた.

X = pd.read_table('hogehoge.txt',
                  sep='||',
                  encoding='utf-8')
実行結果
__main__:3: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
Traceback (most recent call last):...

2文字以上の文字列(空白文字除く)はサポートされていないらしい. アドバイス通りにengine=‘python'としてもうまくいかなかったので,別の方法で実装することに.
一行目(フィールド名)だけカンマ区切りとかいうファイルな上,そう何度も使わないので関数は実装せず. おまけに改行コードも削除.

output = []
f = open('hogehoge.txt', encoding='utf-8')
i = 0
line = [f.readline().replace('\n','').split(',')]
output = line
while line:
    i += 1
    line = f.readline()
    tmp = line.replace('\n','').split('||')
    output.append(tmp)
f.close

hogehoge = pd.DataFrame(output[1:-1])
hogehoge.columns = [output[0]]

ちなみにpandasに文字数の制限はなく,メモリ上限値に依存するらしい. Spyderのプレビューで見ると途中で文字切れしているように見えるが,実際には切れていない.

【Python.math】剰余計算,指数表示の仕様

剰余計算の戻り値の型は入力の型に依存する

Y X return
Y % X int int int
int int int
int float float
float float float

指数表示はfloat

# 指数表示はfloat
1000 == int(1e3)
0.001 == 1e-3

階乗の計算(再帰定義関数,math)

# 再帰定義関数
def fact(n):
    if n == 0: return 1
    else n * fact(n-1)
'''
RuntimeError: maximum recursion depth exceeded
が出てくることがある.
再帰回数は上限値があるので,以下の方法で確認,設定する.
'''
import sys
sys.getrecursionlimit()
sys.setrecursionlimit(10000000)

# math package
import math
n_fact = math.factorial(n)