イテレーター(Python)
typing記法で目に止まり、スルーしていたiterator。勉強メモです。
・iteratorはもとのオブジェクトのコピー
イテレーター=iter(オブジェクト)でコピーを生成。オブジェクトがリストなどiterableなものだと、next(イテレーター)でコピーから1こずつ取りだすことができる。取り出すとコピーからは消えるので、nextをやりきるとイテレーターは空っぽになる。
→そう、for x in list1 とかのfor文は実はiteratorを回していたのである!
・def __iter__():はクラス内オブジェクトをiterableにする。
例えば
をいじって
と、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使いたくないときは無情報事前分布を使って計算する。
・ベイズの定理
事後確率は尤度×事前確率に比例する。条件付き確率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: boolhensuu = 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を貼っておきますね未来の自分
google colabの使い方
google colabでディレクトリの相対パスを通そうとしたら通らない!なんで!?となってからの解決の道のりの記録。
-
そもそもgoogle driveをマウントしないとアクセスできない
共有フォルダですら無い自分のフォルダ、ならデフォで読み込んでくれるんじゃないかなと思ったんですけど、そんな仕様じゃなかった。
drive.mount('/content/drive')
で解決。
-
実行場所はgoogle driveじゃない
google colabはデフォルトでホスト形ランタイムになっている。googleのサーバ上にある仮想マシンで動かしているということらしい。で、保存場所がgoogleDrive。見た目通りgoogleDriveで作業するためには見た目の場所に移動しましょう。
%cd "drive/My Drive/(移動したい階層まで)
で解決。直感的なディレクトリ移動ができるようになりました。自分がどこにいるか確かめたいときは
import osprint(os.getcwd())
すれば自分の場所を確かめることが出来ます。
ちなみに、ローカルランタイムすることも可能。この場合作業場所は自分のPCのホームディレクトリになります。
まあ、メリットもあまりないし使わないかな...
調べている間に見つけた、「googleDriveをローカルフォルダのように使う方法」は便利そうだったのでメモ。
パラメータサーチ勉強記録
<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のパラメータをざっくり解説してくれるページ:
ハイパーパラメータを手動でいじるときは一つずつやると良い。自動でいじるときには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のように数式を出すのではないのね