序説log

備忘録兼動機付け

pyhton組み込み関数のメモ

 

 

dict()

・update()で上書きと付け足しが同時にできる。keyが固定なことに注意!

d1 = {'a': 0, 'b': 1}

d2 = {'a': 2, 'c': 3, 'd': 4}

d1.update(d2)

print(d1)

# {'a': 2, 'b': 1, 'c': 3, 'd': 4}

 

 

zip()

タプルのイテレーターを返す。この時縦横が反転するので、転置行列装置に似ている。

 

随時更新

イテレーター(Python)

typing記法で目に止まり、スルーしていたiterator。勉強メモです。

 

iteratorはもとのオブジェクトのコピー

イテレーター=iter(オブジェクト)でコピーを生成。オブジェクトがリストなどiterableなものだと、next(イテレーター)でコピーから1こずつ取りだすことができる。取り出すとコピーからは消えるので、nextをやりきるとイテレーターは空っぽになる。

 

→そう、for x in list1 とかのfor文は実はiteratorを回していたのである!

 

・def __iter__():はクラス内オブジェクトをiterableにする。

例えば

class Mylist:
def __init__(self):
self._my_list =
 

ml = Mylist()
ml._my_list.extend(['a', 'b', 'c'])

for goods in ml._my_list:
print(goods)

をいじって

class Mylist:
def __init__(self):
self._my_list =
def __iter__(self): # <-付け足し
return iter(self._my_list)

ml = Mylist()
ml._my_list.extend(['a', 'b', 'c'])

for goods in ml:
print(goods)

と、my_listのイテレーターを返すように関数を書いてやることで、スッキリとfor文を回すことができる。他にも、iterableを引数にとる関数がスッキリ使えてコードの抽象度が上がる(=直感的に理解しやすくなる、かも...)。

 

 

 

 

確率分布・統計分布絡みのメモ

・共分散

x,yが同時に変動する度合いを表す。x,yが独立なら0。

 

 

・確率密度

変数xが(x,x+δx)に入る確率が、δx→0のときp(x)δxで与えられる時、p(x)をx上の確率密度という。確率密度の最大値は変数の選び方に依存する。

→(-∞,x)に入る確率を累積分布という。

→xが離散変数の時、確率質量関数ともいう。xの取りうる値のところに、確率の質量が集中しているため。

 

・P(A|B)

Bが起きたと分かっている場合のAが起きた確率

 

・古典的確率とベイズ的確率

古典的確率=ランダムな繰り返し試行の頻度

ベイズ的確率=不確実性の度合い

ベイズでは、事前知識(=事前分布)と尤度(=データ)をかけ合わせて確率を更新する(=事後確率を求める)。人間の試行と同様のプロセスを踏むイメージ。

事前情報がないor使いたくないときは無情報事前分布を使って計算する。

 

ベイズの定理

P\left( w| D\right) =\dfrac{p\left( D|w\right) p\left( w\right) }{p\left( D\right)} 

事後確率は尤度×事前確率に比例する。条件付き確率2本から証明可能。

つまり、事前確率を事後確率に変換する式。

 

・独立同分布(i.i.d.)

データが同じ分布から独立に生成されること

 

・0.01-100の間にある指数分布に従う乱数を生成

1. 一様分布で-2〜2の乱数を作成

rui=np.random.rand() - 2  # from -2 to 2

 

2. 1.で作った乱数を10に累乗する

10 ** rui  # 0.01 ~ 100

 

型ヒント等、python可読性を上げるためだけのもの

型ヒント!!昔勉強したけど忘れてしまったな〜ということで再学習。型ヒントの他にもコードを動かすのにはいらないけど可読性上げるためにちょくちょく入ってるやつ、見つけ次第追加していきます。

 

  • Typing

型を記載する仕組みのことをTypingといいます。基本的なやつはなんの準備もなしにかけますが、ListやDictなどtypingパッケージのimportが必要なものもある。

  • importなしに書けるもの

<変数の型付け>

「変数+:+型」で変数に型をつけられます。例えば

hensuu: bool = True

とか。代入を分割して

hensuu: bool
hensuu = True

とも書ける。

 

<関数、メゾットの型付け>

「def 関数名+->+型+:」で何が返ってくるのかを明記できます。

def func(name : str) -> str:
print("I am {lang}")

というように。(nameのところは変数の型付け)返り値がないときは

def where() -> None:
print(os.getcwd())
と書く。

 

  • importが必要なもの

List、Set、Tuple、Dict、Callable(関数などで、引数の型と返り値の型を指定)など。複数の型を許容したりNoneも許容したりといった芸当もできる。

今勉強する必要に迫られていないので参考URLを貼っておきますね未来の自分

deecode.net

 

future-architect.github.io

google colabの使い方

google colabでディレクトリの相対パスを通そうとしたら通らない!なんで!?となってからの解決の道のりの記録。

 

  • そもそもgoogle driveをマウントしないとアクセスできない

共有フォルダですら無い自分のフォルダ、ならデフォで読み込んでくれるんじゃないかなと思ったんですけど、そんな仕様じゃなかった。

from google.colab import drive
drive.mount('/content/drive')

で解決。

 

google colabはデフォルトでホスト形ランタイムになっている。googleのサーバ上にある仮想マシンで動かしているということらしい。で、保存場所がgoogleDrive。見た目通りgoogleDriveで作業するためには見た目の場所に移動しましょう。

%cd "drive/My Drive/(移動したい階層まで)

で解決。直感的なディレクトリ移動ができるようになりました。自分がどこにいるか確かめたいときは

import os
print(os.getcwd())

すれば自分の場所を確かめることが出来ます。

 

ちなみに、ローカルランタイムすることも可能。この場合作業場所は自分のPCのホームディレクトリになります。

a1-style.net

まあ、メリットもあまりないし使わないかな...

 

調べている間に見つけた、「googleDriveをローカルフォルダのように使う方法」は便利そうだったのでメモ。

www.infact1.co.jp

パラメータサーチ勉強記録

<os>

ディレクトリ作ったりファイル名変えたり、OSの操作ができる。

 

<Numba>

PythonやNumpyのコードを高度な機械語に変換してくれるJITコンパイラJITコンパイラ=Just In Timeコンパイラ=実行時にコードのコンパイルを行うコンパイラ

・デコレーターを関数につけるだけで実行してくれる

デコレーターとは?

・関数を受け取り、関数を戻り値とする関数のこと。関数定義の前に「@デコレーター名」を付けると関数を修飾できる。

・自分で作った「関数を受け取り、関数を戻り値とする関数」をデコレータとして使うこともできる。当たり前!この記事がわかりやすかった。

・@numba.jit(nopython=True)にすると最適化できないものはエラーにして返す。これで最適解できているか否かがわかる。

・pandasとかは使えない。

 

<Pickle>

・プログラム実行後もオブジェクトを保存してくれる。

・How?→オブジェクトをバイト列などに変換して保存する。

・Merit→実行した状態(ふつうプログラムは終わったらメモリから削除されるしオブジェクトもプログラムが実行終了したら消える)を保存して終わった後でも呼び出せるようにする。

・(セーブデータみたいなものかなあ)

 

<tqdm>

プログレスバー機能。

 

<itertools>

・あらゆる順列組み合わせを考えてくれる。すごい。便利そう。

PythonではじめるKaggleスタートブック やりながらのメモ

図書館で借りて書き込めないのでここにメモ。

 

<PandasのDataFrame文脈>

DataFrameとは二次元の表のこと。

・replaceでinplace=True にすると元のDataFrameが変更される。(Falseもしくは何も書かないと新しいDataFrameが作られる)

・fillnaは欠損値NaNを置換する。NaNのところは全部平均値にしちゃうとか。

→欠損値をどう扱うかは考えるべし。欠損してることに意味がある場合もある、闇雲に埋めてもだめ。LightGBMとかいう機械学習アルゴリズムでは欠損値をそのまま使えるらしい。

drop関数を使うと特定の行/列を消せるぞ!どこから消すかとかの指定もできるぞ!

・dropna()はNaNを消してくれる。

 

機械学習文脈>

機械学習アルゴリズムはハイパーパラメータの値で制御するぞ。

・sklearn.liner_modelのLogisticRegressionを使ってロジスティック回帰分析ができるらしい。

・大半は乱数を利用するが、これでは再現性がない。(試行によって予測が変わってしまう)seedを固定するのが吉。この固定もハイパーパラメータの設定の一つ。すべての乱数seedを固定する関数が使われることも。

 

<予測に寄与する新しい情報量の見つけ方:探索的データ分析>

 

・カテゴリ変数は安易に数値化しないように。LightGBMはカテゴリ変数用の特別な処理を実行してくれるのでOK

・pandas_profilingでデータの概要をつかもう

sns.countplot(x='SibSp',hue='Survived',data=train1)
plt.legend(loc='upper right',title='Survived')

 

を各カテゴリで見ていくだけでも予測材料になる。

・KaggleならSubmitのスコアを見て特徴量の有用性をある程度判断できる。が、Submitは無限にできないし過学習の可能性あるしで、学習性データセットから検証用データセットを作成して性能を測るのが普通。

 

 

<機械学習アルゴリズム>

・sklearnすごい。documentationのSupervised learning(=教師あり学習)にいろいろな機械学習アルゴリズムが有る。試してみよう!

・LightGBM:決定木を作って誤差確認して誤差が小さくなるように新しい決定木作って...を繰り返して大量の決定木を創りながら学習する。最終的な予測値はすべての決定木の予測値を使って算出するよ。過学習(サンプルデータのみに過度に適合してしまい未知の値に対する予測性能が劣化する)を避けるためにearly stoppingすることが一般的。

LightGBMのパラメータをざっくり解説してくれるページ:

qiita.com

ハイパーパラメータを手動でいじるときは一つずつやると良い。自動でいじるときにはOptunaとか使えるよ。まあ優先度は低め。特徴量探しに注力すべき。

 

<交差検証(Cross Validation CV)>

学習用データセットをtrain(学習用)とvalidation(検証用)をわけるのがホールドアウト検証。この分けるのを複数回やってそれぞれでホールドアウト検証するのが交差検証。

・分けた最小単位をfoldと呼ぶ。

・各分割で学習に使われなかったfoldをoof(Out-of-fold)と呼ぶ。

・各分割でのスコアの平均をスコアという。この平均スコアを CVスコアもしくはCVと呼ぶ。

☆分割の仕方に注意!Survivedの比率をtrainとvalで揃えるとか。時系列性を揃えるとか。(12日後の予測をしたいなら12日感覚になるようtrainvalを分ける)元データにグループがないかとか(同グループ内での予測は比較的かんたんなので性能が盛られる)。

 

<アンサンブル>

複数のアルゴリズムで予想した結果の多数決をとったものを予測とすると精度が上がる!

seedを変えた複数予想を単純平均するだけでもok

 

 

 

 

trainデータで学習して予測したpredictファイル(csv?)をsubmitして当たり具合を競うのがkaggleなんだとわかりました。Atcoderのように数式を出すのではないのね