おうちだいすき

自宅警備員からデータサイエンティストになった人の雑記的ななにか。

はじめてのLTを #spoana でしてきました

久しぶりにブログを書きます、こんにちは。
タイトルの通りなのですが、先日、外部の勉強会ではじめてLTをしてきたので、その時の感想などを残しておこうかと思いました。

その時のスライドは以下の通りです。

speakerdeck.com

内容についてはほぼほぼスライドに書いてある通りのことをお話ししたので特に触れるつもりはないです。
どちらかと言うと、どう言う気持ちでお話をしていたかについてここでは触れたいなと思います。

応募してから発表の時間まで

確か募集が開始されてからいの一番で応募したように思います。
この時すでにスライドは半分以上出来ていて、あとはブラッシュアップと言う状態でした。
が、極度の緊張しいなので、応募した直後はすでに目眩を起こしていましたw
もちろん、発表までずっと具合が悪かったわけではないですが「あと何日」って勘定をしだすと具合が悪くなるような始末でした。

発表当日は緊張しないようにしていたのですが、しれっとスマホを忘れて家を出て、すぐ気がついたので取りに戻ったら財布まで忘れている事に気づきました。とてもあぶない…。

会場についてから発表までの間、やはり生きた心地がしなかったです。
いろんな方に「緊張してます?」と聞かれましたが、素直に「はい」と答えましたw
個人的な経験なのですが、緊張は隠さずに認めてしまった方が楽になれる事もあるので「緊張しないようにしよう」という考えは捨てました。
ただ、「多分これをやって成功すれば緊張はほぐれるはず」と言う隠し球だけは持つようにしておきました。

発表する時

「笑いが取れれば緊張はほぐれるだろうな」とは常々思っていたのですが、スライド中に用意していた笑いポイントにたどり着くまで1〜2分かかりそうでした。 ですので、会場に到着してから話す内容を少し変えました。

自分の発表タイトルが他の皆様に比べてかなりゆるすぎる内容だったのでそこを逆手にとってしまう作戦です。
ですので、発表開始時に「すみません、多分、今日の発表の中でイチバンふざけたタイトルだと思います」と話させてもらいました。
ちょっと笑ってもらえました。やったぜ。

なのですが、めちゃくちゃ足が震えているのに気がついてしまいましたw
こればかりはどうしようもなかったので気づかなかったフリをしていたのですが、いつの間にか震えは消えていました。
多分、これは本題に入る前にもいくつか笑いを取れたのが効いたのかなと思いました。

発表中に気を遣った事

バーっと全体を眺めて、見ている人の表情だけは逃さないようにしていました。
リアクションの良い人がどの辺に固まっていて、「あの辺の人たちは結構マニア」「この辺の人たちはマニアではないけど一生懸命聞いてくれる」みたいなのは観察するようにしていました。
少し温度が下がったなと感じた場面がいくつかあったので、そこではプチ笑いのタネを投下したりするようにしました。

余談になるのですが、「小松式ドネーション」の下りで想像以上にリアクションが良かったことが収穫でした。
面白いから見て。

dic.nicovideo.jp

発表を終えて

発表前は「いっそ殺せ」とかも思っていたのですが、発表が終わったら終わったで本当に魂が抜けたかのように死んでいましたw
一緒に来ていた人に「綺麗に締めて拍手されながら帰るの、絶対気持ちいいですよね」と言われたのですが、早く席に戻ることしか考えてなくて全く拍手聞こえてませんでしたすみません。
辺なところに力が入っていたのか普段痛くならない箇所の筋肉が痛かったのを覚えています。

懇親会ではたくさんの方々に「おちんぎんの話、面白かったです」と言って頂いて本当に嬉しかったです。
また次回も今回のように、たくさん笑ってもらえるような発表したい欲が湧いてきています。
スライドに掲載している、今度は予測してみる編にチャレンジしてみたいと思います。

さいごに、いつも楽しい勉強会の場を設けて頂いている運営の皆様、今回もお疲れ様でした。そして、ありがとうございます。
次回もまた是非参加させていただきたいと思います。

Santander コンペをふりかえる。

超絶今更ながらになってしまいました。
結果は銀メダルとれました。嬉しいです。
ですが、どこか心のモヤモヤがあったり。

どんなコンペだったの?

スペインだったかその辺の国にSantanderって銀行があるらしいです。
その銀行における、顧客取引の二値分類問題でした。
しかし、カラム200列全て匿名化された上、全て連続値ヒストグラムをとるとおおよそ正規分布、評価指標はAUCで適当にモデルに放り込むだけでもスコア.897(最終日銅メダルLBスコア : .901)みたいなコンペでした。
ぶっちゃけ、「ここまでスコア出てたらもうええやんけ」となっていました。

何故参加し、何故やり続けたのか

単刀直入にいうと、モデリングに不慣れだったためです。
前処理なしでモデルに放り込めそうな点において、私にとっては格好の練習場所だと感じました。 どなたかのコピペなどではなく、自分でバリデーションを切りながらモデルを組む時間をたっぷりと取れました。

ついでに言うと、courseraで習ったstackingも同時に試せたので良い復習にもなりましたし、今後使いまわせる関数が出来たのでこちらも私に取ってプラスになったのではと考えます。

ラスト1週間までの取り組み

ラスト1週間の時点で銅メダルLBボーダーラインは.901でした。
以下に取り組み内容を示しますが、特に大したことはやっていません。

  1. CatBoostでValidation切りながら学習 → 0.898
  2. CatBoostでDataAugmentation → 0.900(以降チームマージするまで全てのモデルにaugmentationを適用)
  3. ひたすらハイパラチューニング → 0.900
  4. 公開kernelのLGBモデルとstacking → 0.900
  5. 効いてる特徴をカテゴリ変数化。何も処理せずCatBoostのcat_featureに放り投げる → 0.900(なお、この時のCVは過去最高を記録し0.9014くらい)

これ、チームマージする際に送ったDMをほぼそのまま貼り付けたのですが、最後の5番、、、、、うっすらMagic Featureにかすってる(と思う)のでこの段階で本コンペで効いた特徴「カウントエンコーディング」を試していればと後悔がまた蘇ります。。。
この時、頭に思い浮かんでいたのは「ターゲットエンコーディング」で、それが故にとりあえずcat_featureにぶん投げてみようと横着をしてしまいました。
猛省します。

チームマージしてからコンペ終了まで

チームメイトの@nekoumeiさんとはチームマージ最終日にお願いしてチームを組んでもらいました。
マージ直後は互いのこれまでの取り組み内容の共有、お互いの最強モデルのアンサンブル、気になるカーネルやディスカッションの共有を行いました。

それ以降は手分けして、手当たり次第に実験していた気がします。kdeプロット見てスパイクしたカラムについて代表値取ってみたり等々。。。 カウントエンコーディングは最後の最後で@nekoumeiさんが気付いたのですが、時すでに遅し。submit制限を超えてしまいました。
結局、最終的なLBスコアは.901で、Leader Board の 銅メダルボーダーは超えられませんでした。
最後に提出したのは@nekoumeiさんの最強のLGBモデルと私のCatBoostモデルと、KernelのLGBM w/ DataAugmentationモデルをBayesian Ridge Regression で stacking したものを提出しました。

テンションだだ下がりで乗車した電車内

結局、最後の最後まで何もわからず、そしてボーダーラインも越えられず、何もかも諦めた状態で眠たい目をこすりながら通勤電車に乗って順位発表を確認しました。
↓その時の様子がこちらです。↓

一瞬何が起こったかわかりませんでした。 どうせ取れるとも思ってなかったし、順位確認するつもりだけでした。
電車の中でギョッとしてたのを思い出します。
大きくshake upしたようです。
stackingの関数作っといて正解だったかもしれません。

順位繰り上がりで得た銀メダル

銀メダルって棚から落ちてくるのですね。初めて知りました。
そもそもあと4〜5人で銀メダルだったところ、私たちより上の20名ほどが失格になったらしく、その繰り上がりで銀メダルになってしまいました。
銀メダル、とても嬉しいです。
嬉しいのですが、銀メダルの上位陣のスコアは.920くらい。
これって、

  • カウントエンコーディング
  • テストデータのFake Data とReal Dataに対する処理を行なっている

最低この2つを行わないと辿りつけなくて、シンプルなようでここに気づくか気づけないかで大きくスコアが変わる印象を持っています。(もし間違っていたり足りない部分があったら、こっそり教えていただければ幸いです)
気付くべきところに気付いて獲得した銀メダル、闇雲にコードぶん回して乱雑にスタッキングして獲得した銀メダル、私はどうしてもこの差が気になってしまいます。
言い出したらキリがない話ではあるとは思いますし、外から見ればどちらも同じ階級に違いはないのですが、とても大きな実力差を感じます。
シンプルに銀メダルという結果に満足することなく、これからも自分が納得出来るように精進していきたいと思います。

ただ、今回の結果はチームメイトの@nekoumeiさんがいなければ獲れなかったのは間違いありません。
寧ろめっちゃ迷惑かけたと思います。。。
沢山のことを教えてもらい、沢山の知識を得ることができました。
感謝してもしきれません。

さいごに

いつも最後までやりきるとそうなのですが、今回もしんどいコンペでした。
ですが、コンペ終盤になって出てきた「木のお気持ち」的な話題は分析初心者の私にとってとても参考になりましたし、コンペ終了後に出てきた以下のKernelは何故カウントエンコーディングが効いたかの説明もなされていて大変参考になりました。
勉強勉強アンド勉強です。

www.kaggle.com

また、@0verfitさんの2nd place solutionから飛べる、Githubリポジトリソースコードの管理方法含めて現在進行形で参考にさせていただいています。
本当はこのリポジトリを読み切ってから書こうと思ったのですがなかなか終わらず、中途半端な状態で記事を書いてしまっているのはナイショです。

メダルを取れたっちゃ取れたのですが、やはり課題を無限に感じるコンペとなってしまいました。
少しでも自分が納得出来るKaggle Lifeを送れるように精進していきたい次第です。

coursera - How to Win a Data Science Competition コースを修了して

Hi, kagglers !!(一度言ってみたかった
昨日、オンライン講座 coursera の How to Win a Data Science Competition コースを修了しましたので本日はこのコースを受けた感想を述べたいと思います。
受講を検討されておられる方に対し、何かしらのご参考になれればと思います。

www.coursera.org

おすすめ度は★★★☆☆くらい

コースを終えて得たものは確かにたくさんありました。
かといって、「みんな!!よかったよ!!超おすすめだよ!!」とは言い切れないです。
以下にコースに関する感想を示します。

  • よかった点

    • 実際にコンペに臨むにあたって必要な作業が網羅的に触れられている
    • プログラミング課題(誘導付き)を解くことにより手を動かしながら学べる
    • 最終課題は実際にInClassコンペで総復習できる
    • 達成感がすごい(語彙
  • 気になった点

    • 英語が苦手だと大きなビハインドとなる
    • 結構時間を取られる可能性があり、計画的に行う必要がある
    • プログラミング課題において、ライブラリのバージョンが違うと不正解になる問題がある
    • 理解度確認のためにある練習問題の正解に疑問が残るものが散見する

コンペに臨むにあたって必要な手順とその解説を受けること、そして実際に手を動かして学ぶ事ができる点についてはプラス。
一方で結構な時間を取られる上に、出題される課題に対する少しの不満がチラホラあったのが、微妙な星づけの理由になっています。
この不満は、私自身の英語や機械学習に関するスキルが低いことに起因している可能性がありますので参考程度に聞き流していただければと思います。

マジで時間を取られた

受講対象者は機械学習の知識をある程度会得した人でかつ、Pythonによるプログラミングに慣れている人とのこと。
私の場合は「Kaggleでつよくなりたい!」と言う思いから始めたので、機械学習の知識やPythonプログラミングの技量に不安があり、かつ英語力も壊滅的でした。*1

およそ1ヶ月を目安にコースを修了することを想定して設計されていますが、年末年始休みを使ってスタートダッシュを試み、自身のウィークポイントをカバーしようとしましたが、結局最終課題の提出期限は過ぎてしまいました。 *2
年末年始休暇以外におけるコースの進め方としては通勤電車の中でひたすら講義のビデオを見て、帰宅後や休日、仕事で手隙になった際にこっそり解くなど生活の大部分をこの講座に割かねばなりませんでした。

不安にしていた英語については、最初はGoogle翻訳を使いながら見ておりましたが一向に終わる気配がなかったので途中からやめにしました。
代わりに講義でわからない箇所はあとでじっくり調べたり、どうしてもちんぷんかんぷんな箇所のみ翻訳を使うスタンスに切り替えました。

コースを修了して変わった事

  • 英語に対する抵抗力がかなり減った
    なお、講義ビデオを見なくなってから、徐々に抵抗が戻りつつある模様。継続的に英語に触れて減衰を抑えます…。

  • 機械学習に関する知識が徐々に定着してきた
    本を読むだけではなかなかイメージし辛かった部分がスライドと説明を用いた講義により解消された。結果、気になった点を更に深く調べるヒントを得ることも出来た。

  • 手を動かすスピードが速くなった
    かなり悩みながらプログラミング課題に取り組んでいた為、試行錯誤を繰り返していた。結果、自分なりのやり方を見つけるヒントにもつながり、データを見た際に動く手のスピードが向上した。また、問題に対する取り組み方のアプローチへのイメージもつきやすくなった。

さいごに

得るものも大きかったけど、代償にしたものも大きかったように感じました。
「英語も機械学習もプログラミングも大丈夫だぜ!」な方はこの時期に受けても問題はないかもしれません。*3
私のように受講に必要なスキルに不安がある方については「今すぐやったほうがいいよ!!!」とは言い切れないです。
特に社会人の方は長期休暇を利用し、休暇終了後もこの講座に時間を費やすかもしれない可能性を考慮した上で予定を調整しながら進めるのが良いのではないかと考えます。

Kaggleも機械学習もはじめたての私からすれば、得たものと代償にしたものの差し引きで言えばプラスだと思っています。
問題を解くヒントも沢山得ましたので、より多くの問題に早く触れていきたいです!
Kaggle GrandMasterからの講義を直々に受けたのでもう金メダルは余裕だと思う。

*1:根性で押せ!!精神で乗り切ろうとしました

*2:提出期限を過ぎてしまうと受講生同士が評価し合うレポーティング課題が採点してもらえなくなってしまう場合があるとのこと

*3:ただ、そんな方は受ける必要がないようにも感じます。

matplotlibで時系列データをプロットするとき、軸ラベルを上手く表示させたいだけの人生だった

「年末年始はcourseraのkaggleコースを一気に受けるぞ!」と意気込むもひょんなことからmatplotlibと大格闘してしまい、色々と無に帰してしまいました。あけてましたおめでとうございます。

今回は取り扱うテーマがテーマなだけに実際のモデリングや効率良い計算のTipsにはならないです。
想定しているシーンとしては皆様がお客様に分析結果を報告する際に

「もうちょい目盛りをわかりやすくしてくれたらなぁ(ねっとり)」

と、ビンタの一発や二発お見舞いしたくなるような嫌味をかまされた際、ミーティングルームを赤く染め上げないため、皆様の清きその右手を汚さないために共有できたらなと思います。
ではよろしくお願いします。

  • 目指したいプロット
  • 利用するデータについて
  • とりあえずプロットする
  • TimeSeriesに変換してプロットする
  • せめてグリッド線だけでもつけてあげる
  • 目盛りが欲しいんだろ?ほらよ
  • ちっちゃい目盛りの数を減らしてラベルを与えてみる
  • ちっちゃい目盛りにもグリッド線をつけてあげる
  • ほ〜らこんなこともできるんだよ(ねっとり)
  • 参考サイトなど
  • ソースコード
続きを読む

はじめて参加したKaggleは学びしかなかった

Kaggle、ずっと参加したいなぁとか思いつつ結構尻込みしてました。
理由はいくつかあります。

  1. 英語
  2. 分析に対する自信のなさ
  3. 時間的制約

こんな感じといったところでしょうか。
しかし、そんな思いとは裏腹に初めて参加したKaggleのコンペは思った以上に得るものが沢山ありました。

こんにちは。
今回はデータ分析コンペティションサイト、Kaggleにて開催されたコンペに初めて参加したのでそこで得た体験をお話ししたいなと思います。
よろしくお願いいたします。

  • 赤信号、みんなで渡れば怖くない
  • コンペのおはなし
    • titanicチュートリアルと同じノリでかかったら死んだ
    • Kernelは最高の参考書である(しかもタダ)
    • ならばDiscussionは英語の参考書だ(半分マジ)
    • コンペ終了4日前で見えてきたメダル
    • そして逃したメダル
  • コンペを終えて
    • コンペに参加するメリットデメリット
    • 会社のお集まりの運用
  • さいごに
続きを読む

Pythonで簡単!2行で描ける100%積み上げ棒グラフ(帯グラフ)

Python 100%積み上げ棒グラフ」「Python 帯グラフ」「Python barplot percentile」などいろんな条件で検索してもなかなか直感的に100%積み上げ棒グラフを描く事ができる記事に巡り逢う事がありませんでしたので、同じ様な悩みを持つ方を減らす目的で今回の記事を投稿します。
先日社内で共有したから記事の投稿が楽という話はないしょにしといてください。

答えは簡単。pandasのcrosstabで集計取ったdfでpandasのplot機能を使えばイッパツです。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# pd.crosstabで瞬殺クロス集計
# 引数なしだとただのカウント
# normalize='index'で行ごとの割合で集計される
cross_survive1 = pd.crosstab(df['sex'], df['survived'], normalize='index')
# データフレーム形式なのでpandasのplotを使う
# stacked=Trueで積み上げ機能オン
cross_survive1.plot.bar(stacked=True)


f:id:hiro-i2:20181205232257p:plain

プロット
f:id:hiro-i2:20181205232401p:plain

複雑な集計もあら不思議

# 第二引数をリスト化するとさらに複雑なクロス集計が可能
cross_survive2 = pd.crosstab(df['class'], [df['sex'], df['survived']], normalize='index')
# 複雑な100%積み上げ棒グラフの描画が可能
cross_survive2.plot.bar(stacked=True)


f:id:hiro-i2:20181205232630p:plain

プロット
f:id:hiro-i2:20181205232726p:plain

凡例の位置にケチつけるのは勘弁してください>< 少ないタイプ量でザザッとEDAしたい時なんかには有効かと思います。

是非ご活用くださいませ

人を惹きつける文章には何が隠されている?文章の感情の揺れを測ってみた。

自分のブログ、もっと人に読んでもらいたいな〜〜〜。
ブログを書いていらっしゃる方であれば一度は思った事、ないでしょうか。
ありますよね?(迫真)

PV数上げるためにSEO対策したり、地道にフォロワー増やしたり。

こういった努力も大切かとは思うのですが、今回はよく読まれている文章には何が隠されているか、文章から読み取れる感情の動きに着目していくつか文章を採取し、調査してみました。

例えば、イケハヤさんのこちらの記事だとこんな感じです。
www.ikedahayato.com

項目 平均得点 標準偏差
タイトル -0.34 -
文全体 -0.49 0.22
f:id:hiro-i2:20181021110518p:plain

いい感じになんか揺れてます。
人を惹きつける文章にはこうした感情のアップダウンがあったりするのですかね。

今回はこんな感じで昨年よく読まれた記事などを中心にブログの文章における「感情の揺れ」を測りましたのでお話ししていきたいなと思います。

はじめに

「色んな文章の感情をスコアリングすると面白そう」と素敵なアイデアを頂いたのが本記事のきっかけです。
そして、仕事で試しに作った関数が結局使わなくなりましたので、綺麗に成仏させることが今回の記事の大きな目的です。
明確な解答を出すような記事ではありませんので予めご了承ください。
(そもそも明確な解答を出してこそ成仏するのではというツッコミは受け流します)

では、よろしくお願いいたします。

続きを読む