中野智文のブログ

データ・マエショリストのメモ

oom killer に python を優先的に狙わせるワンライナー

EC2 のマシンなどで、jupyter notebook で python カーネルを起動した後、次のコマンドを実行

pgrep python | xargs -l1 -I{} sh -c 'echo +15 > /proc/{}/oom_score_adj'

原理的には、python 以外のカーネルでもOKなはず。

追記

2017/11/07

/proc/23715/oom_adj is deprecated, please use /proc/23715/oom_score_adj instead.

だそうなので、こちらに修正

sklearn の DictVectorizer を使って学習して再び重みを dict 形式にする

背景

sklearn のライブラリに、学習データがdict の配列のときに、sklearn で使えるスパース(疎)な形式に変換する DictVectorizer がある。 この DictVectorizer の説明を見ると、たしかに色々な形式に変換できるようではあるが、実際にどのような形式に変換すれば学習が行えるかまでは書かれていない。 学習器の種類によりスパースな形式が扱えないものも存在するが、liblinear はスパースに対応しているので、liblinear でも使用例が多そうな logistic regression の例を示そうと思う。

DictVectorizer を使って logistic regression で学習する例

次のようなデータを学習したい、すなわち、dict 形式がリストになっている。

measurements = [
    {'city': 'Dubai', 'temperature': 31.0, 'country': 'U.A.E.'},
    {'city': 'London', 'country': 'U.K.', 'temperature': 27.0},
    {'city': 'San Fransisco', 'country': 'U.S.', 'temperature': 24.0},
]

DictVectorizerを初期化する。下記ではデフォルトで初期化するが、separator などが設定できることが分かる。

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
vec
DictVectorizer(dtype=<type 'numpy.float64'>, separator='=', sort=True,
        sparse=True)

そして、sklearn で学習できる、sparse matrix に変換

X = vec.fit_transform(measurements)
print X
  (0, 0)    1.0
  (0, 3)    1.0
  (0, 6)    31.0
  (1, 1)    1.0
  (1, 4)    1.0
  (1, 6)    27.0
  (2, 2)    1.0
  (2, 5)    1.0
  (2, 6)    24.0

次のようにすれば、sparse matrix の各番号に対応した素性名が取得できる。

print vec.get_feature_names()
['city=Dubai', 'city=London', 'city=San Fransisco', 'country=U.A.E.', 'country=U.K.', 'country=U.S.', 'temperature']

では、学習を始めるために、教師データ(y)を作成

import numpy as np
y = np.array([1,0,0])

この y と先に作った sparce matrix の X で学習。

from sklearn.linear_model import LogisticRegression
logistic = LogisticRegression()
logistic.fit(X, y)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
          verbose=0, warm_start=False)

学習は完了したので、重みを取り出してみよう。

logistic.coef_
array([[ 0.43215653, -0.25978198, -0.26661549,  0.43215653, -0.25978198,
        -0.26661549, -0.01603272]])

今回は2クラス分類なので、配列の0番目のを取れば良い。これを再び先の素性名と組み合わせ、辞書の形式にしてみる。

w = dict(zip(vec.get_feature_names(), logistic.coef_[0]))
w
{'city=Dubai': 0.43215653143933291,
 'city=London': -0.25978198285599019,
 'city=San Fransisco': -0.26661548568954441,
 'country=U.A.E.': 0.43215653143933291,
 'country=U.K.': -0.25978198285599019,
 'country=U.S.': -0.26661548568954441,
 'temperature': -0.016032719041480584}

切片を決して忘れるなよ。

b = logistic.intercept_[0]
b
-0.094240937106201683

まとめ

  • vec.fit_transform(dict) でdict形式から学習形式に変換できる
  • 変換後の素性名は vec.get_feature_names() で取得

jupyter notebook から dataflow する超短いメモ

背景

jupyter notebook から dataflow 使いたい。

やること

setup_options = options.view_as(
    beam.options.pipeline_options.SetupOptions)
setup_options.save_main_session = True
setup_options.requirements_file = 'requirements.txt'

requirements.txt:

ipython==5.5.0

これがないと、IPython.core がないみたなエラー。

liblinear の切片を忘れていませんか?

背景

liblinear の学習で、切片を忘れているのを見た。幸いプロダクトではない。

切片とは、英語で言うと intercept (知っとるわw)

このページを見に来た人は特に切片の説明自体はしなくてもよいと思う。どのように取得するのかは、

scikit-learn だと、

sklearn.linear_model.LogisticRegression — scikit-learn 0.19.0 documentation

Attributes という項目にあるので、忘れないように。

intercept_ : array, shape (1,) or (n_classes,)

    Intercept (a.k.a. bias) added to the decision function.

    If fit_intercept is set to False, the intercept is set to zero. intercept_ is of shape(1,) when the problem is binary.

とある。どのように使うかはいい例が見つからなかったので書かないが、切片の意味が分かっていれば特に必要ないと思う。

python ライブラリの gcloud(google.cloud) の storage の blob_name とは

背景

python ライブラリの gcloud(google.cloud) の storage の get_blob において、

https://googlecloudplatform.github.io/google-cloud-python/0.20.0/storage-buckets.html#google.cloud.storage.bucket.Bucket.get_blob

とあるが、試してみると、google cloud storage 上の

gs://my-bucket に、/path/to/blob.txt

は存在するのに、なぜか、 None が返ってくる。ほえ?

blob_name には 始めのスラッシュはいりません

すなわち、blob_name

path/to/blob.txt

ということです。だったらそのように例を(次のように)

>>> from google.cloud import storage
>>> client = storage.Client()
>>> bucket = client.get_bucket('my-bucket')
>>> print(bucket.get_blob('path/to/blob.txt'))
<Blob: my-bucket, path/to/blob.txt>
>>> print(bucket.get_blob('does-not-exist.txt'))
None

と書いてよ、と思う。

sklearn にて `class_weight` が `balanced` か「なし」の探索

背景

sklearn の GridSearchCV はパラメータサーチに利用される。

sklearn.model_selection.GridSearchCV — scikit-learn 0.19.0 documentation

ところが、パラメータなし、の設定例はみつからない。

sklearn.linear_model.LogisticRegression — scikit-learn 0.19.0 documentation

には、dict"balanced" かと書いてある。

パラメータなしは、None

class_weightbalanced か「なし」の探索

"class_weight": ["balanced", None]

Arduino (Uno R3互換)を Mac でLチカくらいまで。

準備

購入したもの

amzn.to

マニュアル

CD 内の K4 というマニュアル/K4/k4 Japanese tutorial.doc

ダウンロード

Arduino - Software

インストール

本体の準備

本体(UNO R3)をUSBケーブルで接続。緑LEDの点灯を確認。

ソフトのセットアップ

  • 上記のファイルをダウンロード後、解凍し、起動。
  • 次にメニュー、ツール→ボード→Arduino/Genuino Uno を選択。
  • 次にメニューの、ツール→シリアルポート→/dev/cu.usbmodemFD131 (Arduino/Genuino Uno) を選択
  • 次にメニューの、ツール→ボード情報を取得 で無事表示されれば準備完了。

Lチカ

Lチカとは、LEDチカチカの略であるが、次のようにまず example から blink を選ぶ

f:id:nakano-tomofumi:20171007215924p:plain

そして、画像のように、左から二個目のボタンを押すと

f:id:nakano-tomofumi:20171007224244p:plain

USBケーブルを通じて、Arduino に書き込まれ、リスタートして、Lチカが始まる。 もしかしたら、初期状態でもLEDが1秒毎に点滅していたので、Lチカが動いていたのかもしれない。

その他

チュートリアルはマニュアルが雑で、画像が間違ったポート番号に刺さっていたりとか普通にあるので注意した方がいいし、 マニュアル中のコードは word 上で貼り付けられているので、インデントが死んでいるし、// のコメント行の最後に改行した後に書かれなければならない、} が書かれていたりするので、 そのままだとコンパイルできないことがあったりするが、C言語をやったことがある人なら、それくらいのノイズは大したことなく、こなせることであろう。

CDの K4 の中に、code というフォルダがあるので、その中にまともなコードが有るかと思ったら、pde ってなんだろう。