#1.目的
以前の投稿で、kaggleのKickstarter Projectsを題材に、各モデルの精度検証を行いました。
[kaggleを題材に、機械学習モデルの精度比較をしてみた]
(https://qiita.com/Hawaii/items/4f0dd4d9cfabc4f6bb38)
※kaggleのKickstarter Projectsのサイトはこちら
https://www.kaggle.com/kemical/kickstarter-projects
今回はそちらも参考にしつつ、3月に発売されたKaggleスタートブックを用いてより精度を向上させる過程を発信することが目的です。
今回は新しいことの学びが多いので、前編・後編に分けていこうと思い、
本日の投稿は前編です。
###◆扱う題材
主には、私が知らなかった箇所に絞って取り組みたいと思います。
具体的には**「Pandas-Profiling,LightGBM,アンサンブル学習」**の3つです。
→今回はこの中のPandas-Profiling,LightGBMに取り組みます。
###◆その他
それぞれの題材で困ったこと、エラーになったこととその解決した過程も記載しているので、すんなりうまくいかなかった方は是非ご一読いただけますと幸いです。
#2.データ分析~Pandas Profiling~
KaggleスタートブックでPandas Profilingというものが紹介されていて、全く知らなかったので挑戦してみました。
##(1)インストール
下記サイトを参考にさせていただきました。
https://qiita.com/h_kobayashi1125/items/02039e57a656abe8c48f
Pandas-Profilingはpip等でインストールする必要があるようで、私もインポートしてみました。
pip install pandas-profiling
####<補足-私がインストールで困った話->~上記で問題なくインストールできた方は読み飛ばしてください~
基本はこれでOKのようですが、実は私はここでエラーが出てしまったので色々サイトを検索して、試してみました。
ただ、このエラーから抜け出せず1日かかってしまったので、その体験記を書いておきます。
ですので、私と全く同じ道を歩んでしまった方向けに、こうしたら私は解決できましたよという主旨で記載しておきます。
※やり方が必ずしも正しいことは保証できないので、試す際はご自身でもよく調べてから行ってください。
参考にしたのはこちらです。
https://gammasoft.jp/support/pip-install-error/
私はこれの原因2に当たったので、
pip install pandas-profiling --user
と記載し、インストールしてみました。
すると、エラーではないのですが赤字で警告が出てしまい、一旦jupyternotebookを閉じて再度立ち上げると、立ち上がらなくなってしまったのです・・・。
出ているエラーが「AttributeError: 'module' object has no attribute 's'」だったのでこちらも調べ、下記を行ったところ、無事に再度立ち上げることができました!
pip uninstall attr
pip install attrs
※私はこのpipの手前で焦ってanacondaを再インストールしてしまい、その後上記を行った後にあらためて下記を行ったところ、エラーなくインストールができました。
pip intall pandas-profiling
このあたりの知識がないので、ふわっとした書き方で申し訳ありません・・少しでもお役に立てると幸いです。
##(2)必要なもののインポート
今回直接必要ないものもありますが、一括でインポートしています。
#numpy,pandasのインポート
import numpy as np
import pandas as pd
#日付データに一部処理を行うため、インポート
import datetime
#訓練データとテストデータ分割のためにインポート
from sklearn.model_selection import train_test_split
#標準化のためにインポート
from sklearn.preprocessing import StandardScaler
#精度検証のためにインポート
from sklearn.model_selection import cross_val_score
#pandas_profiling
import pandas_profiling as pdp
##(3)データ読み込み
df = pd.read_csv(r"~\ks-projects-201801.csv")
スタートブックにも書いてあるのですが、膨大なデータだとpandas-profilingには時間がかかるので、データをサンプリングしていきます。
※今回のデータは約38万行あるので、全データでpandas-profilingしたところ1.5時間では終わらず、処理をしたまま寝て、起きたらできていたというレベル感でした。
#全体の3割をサンプリング
df_sample=df.sample(frac=0.3,random_state=1234)
##(4)Panads-Profilingの実行
本来的にはdf_sample.profile_report()
でOKのようですが、なぜか私はエラーにはならなかったのですが結果が表示されず、こちらのやり方でHTML形式で吐き出してみました(作業している同じ場所にHTML形式でファイルが出来上がると思います)。
report = pdp.ProfileReport(df_sample)
report.to_file('profile_report.html')
無事に実装することができました!!たしかに、これでデータの外観をざっとつかめそうですね。これからも適宜使っていきたいです。
#3.モデル構築~LightGBM~
続いて、LightGBMのモデルを構築してみます。
名前は聞いたことがあったのですがあまり書籍等にまとまった記載がなく実装したことが
なかったので、取り組んでみます。
※今回はハイパーパラメータチューニング等はせず、オーソドックスなやり方のみで実装してみます。
◆参考サイト
Kaggleスタートブックのほかに、下記のサイトも参考に致しました。
##(1)必要なもののインポート
※pandas-profilingと基本同じですが、LightGBMのインポートもあるので
最初から行っていきます。
#numpy,pandasのインポート
import numpy as np
import pandas as pd
#日付データに一部処理を行うため、インポート
import datetime
#訓練データとテストデータ分割のためにインポート
from sklearn.model_selection import train_test_split
#標準化のためにインポート
from sklearn.preprocessing import StandardScaler
#精度検証のためにインポート
from sklearn.model_selection import cross_val_score
#pandas_profiling
import pandas_profiling as pdp
#LightGBMのインポート
import lightgbm as lgb
##(2)データ読み込み
df = pd.read_csv(r"C:\\ks-projects-201801.csv")
##(3)前処理
詳細は割愛しますが、コードのコメントに何をしているか記載しています
#目的変数のstateを、成功か失敗かのみのデータに絞っている(途中で中止のようなカテゴリもあるのでそのデータは削除)
df = df[(df["state"] == "successful") | (df["state"] == "failed")]
#その上で、成功を1に、失敗を0にしている
df["state"] = df["state"].replace("failed",0)
df["state"] = df["state"].replace("successful",1)
#日付データの処理。開始日(launched)と終了日(deadline)があるので、差分を取って募集期間(days)にしている
df['deadline'] = pd.to_datetime(df["deadline"])
df["launched"] = pd.to_datetime(df["launched"])
df["days"] = (df["deadline"] - df["launched"]).dt.days
#今回は割愛しているがデータ分析の結果、不要と思われる説明変数を削除している
df = df.drop(["ID","name","deadline","launched","backers","pledged","usd pledged","usd_pledged_real","usd_goal_real"], axis=1)
#カテゴリ変数処理
df = pd.get_dummies(df,drop_first = True)
##(4)データ分割
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)
##(5)LightGBMの実装
###(ⅰ)データセット作成
lgb_train = lgb.Dataset(X_train,y_train)
lgb_eval = lgb.Dataset(X_test,y_test)
params = {"objective":"binary"}
###(ⅱ)モデル構築
model = lgb.train(params,lgb_train,valid_sets=[lgb_train,lgb_eval],verbose_eval=10,num_boost_round=1000,early_stopping_rounds=10)
###(ⅲ)精度検証
#テストデータで予測し、y_predに結果を格納
y_pred = model.predict(X_test,num_iteration=model.best_iteration)
#y_predが0.5より大きければ整数の1にする
y_pred = (y_pred>0.5).astype(int)
y_pred_max = np.argmax(y_pred)
# 精度 (Accuracy) を計算する
accuracy = sum(y_test == y_pred_max) / len(y_test)
print(accuracy)
そうすると、精度が0.597469と出て、無事にLightGBMの実装ができました!
###(ⅳ)注意点
私が今回躓いたのは、y_pred = (y_pred>0.5).astype(int)
を記述していなかったので当初精度が0になってしまったことです。
→本にはしっかり書かれていますが、私が他のサイトも参考にしながらコードを書いていたので飛ばしていました。
LightGBMの結果は0~1の連続値として出力される一方で、y_testは最初私が失敗を0、成功を1にしたので0or1になっています。
その2つを純粋に比較してしまったので精度が最初0でしたが、0.5より大きい値を1に置き換えることで、無事に精度を出すことができました。
#4.結び
いかがでしたでしょうか。
pandas-profilingは全く知らなかったのでデータ分析で使えそうだなと思いますし、
以前から気になっていたLightGBMを今回は初めて実装してみることができたので、
超初心者の方にも参考になる点があれば幸いです。
次回はアンサンブル学習について試してみようと思います。