St_Hakky’s blog

プログラミング/心理学/人事/留学/データサイエンス/機械学習/Deep Learning/バイオインフォマティクス/日頃思ったこと/人事のデータサイエンスしてみたい

データ分析とか学習回したりするときのPythonのログ出力について

こんにちは。

もう少し勉強していきたいなと思うものの、こればっかり一生懸命になっているとあんまりコードを書く手が進まなくなるので、ぼちぼち勉強して行こうと思っているのが、ログ出力(笑)

分析とかしていると、途中で学習が止まっていたり、思っていたのと違う挙動を実はしていたなんていうことがあって、それを回避するためにログとかも出力したいなぁと思うわけです。

○モデルの学習のログはライブラリに任せる

モデルの学習のログは、Tensorflowとかだと標準でTensorboardなんていう素晴らしい機能が使えるようになっていますし、学習の進捗とかも普通に標準で出力できるようにサポートしているものが多いと思います。


それはそういうライブラリに任せておけばいいとおもっていて、ここでは自分でチェックしたい時にどうするかみたいなのを書きます。

○とりあえずこれコピーしておけばいいんじゃね的なコード

ライブラリなどがおっきくなってきたらこうも行かないと思いますが、自分でデータ分析なコードを書くんだったらこれでいいんじゃねと思っています。

以下で、実行した時間とかメッセージとかが表示されます。使う時は、logger.debug('log message')みたいな感じで使えます。

from logging import getLogger, StreamHandler, DEBUG, Formatter, FileHandler

logger = getLogger(__name__)
handler = StreamHandler()

logger.setLevel(DEBUG)
handler.setLevel(DEBUG)
formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

fh = FileHandler(filename='log.txt')
fh.setLevel(DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)

以上。

【Python】数量データの正規化 ( 標準化 ) について

こんにちは。

今回はデータの正規化についてです。

いろんな文脈で様々な意味で使われている「正規化」っていう言葉ですが、今回は統計や機械学習で扱う数量のデータに対して行うことに絞り、まとめていきたいと思います。

Introduction

◯データの正規化とは

こちらの記事を読んでいたところ、Wikipediaを引用されていたので、Wikipediaの正規化のページも合わせてみることにしました。

すると、正規化とは

データ等々を一定のルール(規則)に基づいて変形し、利用しやすくすること。別の言い方をするならば、正規形でないものを正規形(比較・演算などの操作のために望ましい性質を持った一定の形)に変形することをいう。

だそうです。いちばん有名なのは後でも紹介するz-scoreだと思いますが、それでイメージしちゃえばわかりやすいかなと。文章の正規化とかもありますね。

つまり、データを一定の方法で変形し、例えば身長と体重みたいな次元が違うものに対してもなんとかして取り扱えるようにしよう、というのが正規化の狙いと言えます。

データの正規化手法

ここからは様々なデータの正規化手法についてまとめていきたいと思います。

まとめる際には、

  • 目的
  • 条件
  • 定義
  • 実装
  • 所感

の順番で紹介していきたいと思います。

◯z-score normalization (標準化)

標準化と言い換えられることも多い、z-scoreです。

これは、元データを平均0、標準偏差が1のものに変換する正規化法のことをさします。

■目的
  • 元データを平均0、標準偏差が1のものに変換する正規化法
  • 外れ値のあるデータに対して有効
  • 最大値・最小値に上限、下限がない場合は、z-scoreを使うとよい。
■条件
■定義

z-scoreの定義は以下の通り。

$$
x_{z-score}^{i} = \frac{x^i - \mu}{s}
$$

$\mu$ と $s$ はそれぞれ平均と標準偏差になります(はてなブログだと、なんかわからんけど、sigmaだと下線引かれちゃう汗)。

■実装

これは、Numpy / Scipy / Scikit-learnの3つのパッケージで実装されています。

ぶっちゃけそんなにたいしたことをしていないので、numpyの配列を以下の関数にぶちこめば一応計算はできます。

def zscore(x):
    xmean = x.mean()
    xstd  = np.std(x)

    zscore = (x-xmean)/xstd
    return zscore
■所感

正規分布に従っているデータは結構多いので、これが一番使われている印象だし、普通に使っている。何でもかんでもぶち込むのはあれだけど。

◯min-max normalization

■目的
  • 最小値を0、最大値を1とする正規化。
■条件
  • 最大値と最小値が予め決まっている様な場合には有効な手法
  • データとして外れ値が存在していないこと(これがあるとうまく正規化できない)
  • データの分布が一様分布であること
■定義

$$
x_{min-max}^{i} = \frac{ x^i - min }{ max - min }
$$

■実装

これも実装はめちゃめちゃ簡単で、普通にやります。

def min_max_normalization(x):
    x_min = x.min()
    x_max = x.max()
    x_norm = (x - x_min) / ( x_max - x_min)
    return x_norm
■所感

もともと母集団レベルで最大値と最小値の範囲が決まっているときなどはmin-maxを扱う方が計算しやすい。でも、データが一葉に分布していないと、結構この正規化だとずれが出てくるので、簡単だけど使いどころが難しいなぁと。

参考

◯z-scoreによる正規化とmin-max normalizationの違いについて

これについては以下の記事で説明されています。基本的には、上であげたとおり、データに仮定を置く分布形状が違うという点が異なっています。

正規化を行う際には、解析者が正規化を行う前に、各次元の特徴量がどのような分布形状になっているかを確認し、その上で仮定をおいて使うべきですね。

◯正規化による効果

正規化を行ったことによる効果について、ロジスティック回帰を用いて検証している例がありました。

この例は、でももうちょっと次元毎に分布とかを変えたら結果が変わるのかなと思いましたがどうなんでしょうか…そのうちやるかもしれません。

◯Numpy / Scipy / Scikit-learnによる実装

別に自分で関数を作っても問題ないレベルの内容ですが、Numpyなどで実装されています。以下でそれぞれの内容についてみることができます。

BitbucketでJupyter Notebookがレンダリングされるようになったらしいので、やってみた

こんにちは。

今一緒にKaggleをやっているメンバーから、slackでレンダリングのサポートがされていることを聞いたので、やってみました(10/25には既に公開されていたのに知らなかったという笑)。

Githubでは既にあるのに今までなかった…

Bitbucketって便利なんですよね。普通にプライベートレポジトリ作れますし。

でも、データサイエンスというか、Python使う人はJupyter Notebookを使うわけです(断定)。

Githubの場合、普通にrepositoryに上がっているJupyter Notebookをブラウザ上で開くと、普通にレンダリングされるんです。

つまり、普通に見えていたのです。こんな感じで。

f:id:St_Hakky:20171211160408p:plain

で、Bitbucketではどうだったかというと、json形式になっていたんです。

f:id:St_Hakky:20171211163248p:plain

これがですね…Pythonを使ってデータサイエンスするユーザーが集まって、プライベートrepository上で無料で使おうとすると、「えっ、Bitbucketか…あれJupyter Notebook外から見れないんですよね…」ってなって、ちょっとモヤモヤする空気になっちゃうんですよね…。

◯Jupyter NotebookがBitbucketでレンダリングできる…だと…?

ですが、出来るようになったんです!

f:id:St_Hakky:20171211161418p:plain

詳細はこちらのissueを。

ちゃんとresolveになっているという笑。

ってことでやってみました。これで、Bitbucketでなんかやる時のモヤモヤが減るかなと思います笑。

◯設定の仕方

今のところ、チーム単位・アカウント単位でAdd onを追加して、Notebookファイルを開く時に、「Ipython Notebook」を設定する必要があるみたいです。

実際にやってみました。手順は以下のとおりです。

■Add onを追加

まず、個人ページに移動し、①「Settings > Find integrations」に移ります。その後、②「Bitbucket Notebook Viewer」を見つけたら、それを「Add」します。

f:id:St_Hakky:20171211162259p:plain

これで準備完了です。

■個人のrepository or チームのrepositoryに移動

移動したら、notebookファイルを見ます。えっ、「jsonのままやん」っておもってもご安心を。下の図にある通り、「Default File Viewer」っていうのが増えていると思います。これを、③クリックします。

f:id:St_Hakky:20171211162646p:plain

すると、プルダウンメニューで④「ipython Notebook」っていうのがあると思うので、これを選びます。

f:id:St_Hakky:20171211162635p:plain

そうすると、以下のように表示されます。

f:id:St_Hakky:20171211161418p:plain

おぉーー笑(感動)

Githubと違って無料でプライベートrepository作り放題なので、便利なのは事実なのですが、今までJupyterがブラウザからみれないのは不便だなぁと思っていたのでよかったです!

それでは。

Centos7にRとRstudio serverをインストール

こんにちは。

Rを使うので、インストールします。これは作業ログ。

〇環境

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

〇Rのinstall

Centos 7でインストールをしていきます。

■EPELのインストール

yumでインストールするために、EPELを入れてない場合は、いれます。

$ sudo yum install epel-release

入れてある人は無視して次からやります。

■Rのインストール
$ sudo yum install R

コレそこそこ時間かかりますので、コーヒー飲みながら待ちます。

〇Rstudio Serverのインストール

このままではRを使う気になれないので(怒られそう笑)、Rstudio Serverもインストールしてあげます。

■ダウンロード
$ wget https://download2.rstudio.org/rstudio-server-rhel-1.1.383-x86_64.rpm
■インストール
$ sudo yum install --nogpgcheck rstudio-server-rhel-1.1.383-x86_64.rpm
■確認

無事にインストールできたっぽかったら、以下のコマンドで確認をします。

$ systemctl status rstudio-server.service

そして、activeになっていることを確認したら、http://localhost:8787/ にアクセスして、Rstudio studioが起動していることを確認します。

〇R / Rstudio Serverのアンインストール

yumでインストールしているので、普通にremoveするだけです。

# Rのアンインストール
$ sudo yum remove R

# Rstudo Serverのアンインストール
$ sudo yum remove rstudio-server

HugoをCentos7にインストールしたのでその作業メモ

こんにちは。

Hugoを導入したので、その作業メモを残します。

〇Hugoとは

静的なHTMLを作成することができるGo言語製の静的ページジェネレーターです。

Markdownで書いたデータをHTMLに変換することができるので、ごちゃごちゃしたタグを書く必要がないです。また、100種類以上のテーマ(css)も設定できます。

Github Pagesとかで公開できたり、出力のフォーマットはHTMLだけじゃなくてAMPにも対応していたりするので、本当にブログとかくらいなら全然できるなぁと笑。

ということで、自分もあるプロジェクトで導入してみたので、その作業メモを書きます。

〇導入した環境

今回の環境は、64bitのCentos7です。

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

〇Prerequisite Tools

インストールの手順とかは公式サイトをみるのがいいと思います。

  • Git
  • Go 1.5+
  • govendor

Hugoは、govendorを自前で持っていないらしく、自分でフェッチしてくる必要があります。

$ go get github.com/kardianos/govendor

〇インストール手順

インストールしたgovendorを用いてHugoをインストールしていきます。govendor getを使うことによって、Hugoに必要なライブラリとかをインストールしてくれます。

$ govendor get github.com/gohugoio/hugo
$ go install github.com/gohugoio/hugo

これで、Hugoがインストールされます。確認してみます。

$ hugo version
Hugo Static Site Generator v0.32-DEV linux/amd64 BuildDate: 2017-12-08T22:06:25+09:00