機械学習よりのインターンに行ってきた感想と特徴量について
タイトル通り機械学習よりのインターンに行ってきた。理由は3年生だからそろそろインターンの体験を積みたいというのが一番でかかったりする。
どこのインターンに行ったのかは言えません。東京湾に沈められますからね。
オフィスは綺麗でリラックマのひよこのぬいぐるみがふかふかしてたのが印象に残ってます。おやつが出て、ま○泉というお店の小さいバーガーが個人的にめっちゃくちゃ美味しくて感動した。東京はすごい。
インターン内容
データセットを渡されて何かを出力するモデルを構築して精度を競争しました。
何のデータセット、何を出力するモデルなのかは言えません。NDAもありますが、東京湾にコンクリートで詰められますからね。
モデルの構築、試行錯誤について
最初はデータの観察方法の講義があったので、それを参考にして各データが何を表すのか、散布図を表示して相関はあるのかなどを観察した。
散布図見ても理屈ではなく直感でこれとこれは相関ありそう!!!と判断したりしてた。後はモデルを構築するにおいてデータセットにおけるどの特徴量が一番出力に貢献しているかの確認もしたりした。
あまり識別には関係ないデータを特徴として渡しても次元が増えてモデルが無駄に複雑になるだけな可能性もありうる。いらないと思っていたデータが実は他のデータと組み合わせると精度が向上した、なんてケースもありえそうだし難しそうなとこだ思う。
そんなこんなで使う特徴を選択しつつモデルの構築に取り掛かった。最初はTensorflowを使ってロジスティック回帰のモデルを作った。
結果としては精度は悪かった。多層にしたり、単層にしたり、重み減衰、L2正則化などを追加したりしたり試行錯誤した。
精度が上がらなくてしょんぼりして帰り道を歩いていた時、S○nS○nのCMが店のモニターで流れていた。有名な白いTシャツの人たちがスタイリッシュな動きをするやつ。
実はそこの会社の勉強会の生放送を視聴していて、その時にXGBoost
、Stacking
という単語が出たのをCMを見たその時思い出した。
ニューラルネットのモデルで精度が出ないなら、線形SVMだったりランダムフォレストとやらを使えばいいじゃないかと閃いたので早速XGBoostを使ってモデルを構築した。
そしたらめっちゃ順位が上がった。XGBoostすげえ!!!!!
次に悩むのは過適合についてだった。高い順位に行くためには汎化能力の高さも大事だと思ったからである。
ブログ記事にもしたが自分はSPPnetの論文を読んだ。そこで
「XGBoost,SVM,ロジスティック回帰など複数のモデルからそれぞれ予測値を出して、その平均をとったものを出力として渡したらより精度が向上するかもしれないし、一つのモデルが過適合起こしても平均をとるからいい感じに過適合な予測値を避けることができるんじゃないか!?」
とSPPでのプーリング処理もどきをやってみようと思いついた。
そこでXGBoost
、Elasticnet
,MLP
,単層のロジスティック回帰
この4つのモデルを最終的に使用することにした。
この考えが後の思考を鈍らせるとはこの時の自分は思いもよらなかった・・・
最終順位
結構下でした^^
とても残念。しかし1位の人もXGBoostを使用しているらしかったので
「自分もXGBoost使ってるから実質優勝じゃん」
3秒で開き直りました。
実はXGBoost
単体と複数のモデルの組み合わせではXGBoost
単体のが精度が出ているのはわかっていました^^
しかし過適合を恐れて後者の方を提出してしまった。結果として平均を取った自分の作戦は他のモデルが足を引っ張ったという感じか。
特徴の整形や選択において、形態素解析を行なっている人もいたらしく、何というかモデルの構築って芸術センスがものを言うところあるよな・・・と思った。
振り返り
特徴の観察、抽出、選択の大切さが一番身にしみた。MNISTとか加工せずそのままモデルに渡せばいいデータセットしか使用していなかったため自分で特徴量を観察、抽出という行為をあまりしたことがなかったからである。
モデルのハイパーパラメータをいじるのではなく、もっと特徴量の観察をすればよかった。
あとは機械学習のインターンってメンターからのフィードバックを得るのが難しいと感じた。モデル構築においてこれが正解、というのがないからアドバイスを得難い。。自分からガシガシ質問に行けばよかったのかなという反省もあった。
機械学習と深層学習の違いって個人的には
データからパターンを人が見つけて、モデルを構築したりするのが機械学習
データからパターンを機械が見つけて、モデルを構築するのが深層学習
こんな感じだと判断している。だから機械学習のインターンでは良い特徴量、パターンを見つけることができるかが一番大切だと思った。
深層学習の勉強もいいが、特徴量エンジニアリング、データセットの可視化、観察あたりの知識もつけるべきということに気づけてとてもよかった。