俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

エピソード3-11: 正則化L1ノルム(Lasso)を使って特長量選択。(KaggleでKickstarter Projectsに挑戦する。)

「Kaggle」のデータセットKickstarter Projects」に取り組んで、Leakageにハマってしまいましたが、気を取り直して、再度取り組み開始です。

ハマってしまった「Leakage」については、以下にまとめてあるのでご参照ください。

oregin-ai.hatenablog.com

さて、今回は、前回country,main_category,categoryをOne-Hotに変換したことで、説明変数の数(次元)が大幅に増えてしまったので、正則化L1ノルム(Lasso)を使って特長量選択に取り組んでみたいと思います。

正則化L1ノルム(Lasso)は、過学習を予防するために重みの絶対値の合計を損失関数にくっつけることで、重みが大きくなりすぎないようにする仕組みです。

重みの合計を小さくするために、関係なさそうな特長量の重みがどんどん小さくなり、結果として特長量選択につながるといった感じです。

 では、頑張ってみます。

 

1.まずは、関係するモジュールをインポートする。

sklearnから、モデルから特長量選択をするSelectFromModelと、線形モデルとしてLassoCVをインポートします。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV

2.正則化L1ノルム(Lasso)を使って特長量選択をしてみる

# LassoCVを使って、正則化の強さを自動決定したモデル(estimator)を作成
estimator = LassoCV(normalize=True, cv=10)

# モデルの情報を使って特徴選択を行うためSelectFromModelを使う
# 今回は係数がしきい値(threshold)が1e-5以下である特徴を削除する
sfm = SelectFromModel(estimator, threshold=1e-5)

# fitで特徴選択を実行
sfm.fit(X_train, y_train)

予測モデルにLassoCVを利用し、SelectFromModel()の引数に、モデルとしきい値(threshold)を指定することで、特長量削除を行うインスタンスができます。

当該インスタンスで、fit()の引数に、説明変数と、目的変数を渡すことで、特長量選択が実行されます。 

3.特長量選択された結果を確認する。

特長量選択の結果を確認します。

# 削除すべき特徴の名前を取得 
removed_idx  = ~sfm.get_support()
train_data.columns[removed_idx] 

Index(['ID', 'usd_goal_real', 'country_CA', 'country_CH',
'category_Children's Books', 'category_Comics', 'category_Crafts',
'category_Design', 'category_Fabrication Tools', 'category_Fashion',
'category_Food', 'category_Glass', 'category_Graphic Design',
'category_Literary Spaces', 'category_Music', 'category_Photography',
'category_Poetry', 'category_Pop', 'category_Romance',
'category_Taxidermy', 'category_Woodworking', 'category_World Music',
'main_category_Art', 'main_category_Film & Video',
'main_category_Games', 'main_category_Journalism',
'main_category_Publishing'],
dtype='object')

get_support()関数で特長量ごとのTrue、Falseが得られるので、Falseのインデックスをremoved_idxに格納して、削除すべき特長量のカラム名を取得。

「usd_goal_real」まで削除対象に入っているのが驚き。

結果的に、期間と国とカテゴリできまるということでしょうか?

4.特長量選択された結果を確認する。(グラフでも見てみる。)

各特長量の係数(重み)をグラフでも見てみます。

# 係数を棒グラフで表示
fig = plt.figure(figsize=(12, 50))
plt.barh(np.arange(0, len(abs_coef)), abs_coef, tick_label=train_data.columns.values) plt.show()

f:id:kanriyou_h004:20190602174611p:plain


 削除対象になった特長量(カラム)の係数(重み)が小さくなっていることが視覚的にもわかりました。  

前回のLeakageの気づきで大きく手戻りしましたが、特長量の新たな選択方法の勉強ができたので、大きな前進でした。

次回は、この選択した特長量で再度分類に挑戦です。

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com