Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Kaggleで過去案件を実施してみる(Otto Group Product Classification実施してみた)

kagglerの仲間入りを果たしたく先日kaggler jaに参加してみました!!
https://kaggler-ja-wiki.herokuapp.com/
f:id:Elsammit:20210324232123p:plain

そこでタイタニック案件を実施した後は過去の案件をいくつか実施した方がよいとのこと。
そして、その中でおすすめされていたのが
Otto Group Product Classification
という案件です。
データが少なめでわかりやすいとのこと。

せっかくなので実施してみることにしました!!



■Otto Group Product Classificationのご紹介

Otto Group Product Classificationでは、
与えられる数値機能からどの商品に分類されるのかを判定・分類することを目的としたコンペとなります。
数値の数は93種類あり、この93種類のデータ値を元にClass1~Class9に分類していくことになります。

■データ

次に与えられたデータです。
trainデータ、testデータに対して

train.head()
test.head()

を実行してデータの形態を確認します。
結果trainデータは、
f:id:Elsammit:20210323224113p:plain
といった形になっており、
testデータは、
f:id:Elsammit:20210323224421p:plain
といった形になっております。

■データ加工

今回のコンペでは93種類のデータからどの商品に分類するのかを判定するのですが、
trainデータを確認すると目的変数がClass_1からClass_9と文字列になっております。
そこで、こちらのClass_1からClass_9を文字列から数値に変換していきます。
コードはこちら。

train["target"][train["target"] == "Class_1" ] = 0
train["target"][train["target"] == "Class_2" ] = 1
train["target"][train["target"] == "Class_3"] = 2
train["target"][train["target"] == "Class_4" ] = 3
train["target"][train["target"] == "Class_5" ] = 4
train["target"][train["target"] == "Class_6"] = 5
train["target"][train["target"] == "Class_7" ] = 6
train["target"][train["target"] == "Class_8" ] = 7
train["target"][train["target"] == "Class_9"] = 8

train.head()

こちらを実行することで、
f:id:Elsammit:20210324220403p:plain
と言ったようにtargetがClass_1 ⇒ 0に変わっていることが確認できます。

では学習のためにtrainデータを目的変数と説明変数に分けたいと思います。
コードはこちら。

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

X = train.drop(['id','target'],axis = 1)
y = train['target']
result = LabelEncoder()
y = result.fit_transform(y)

Xに説明変数であるfeat_1 ~ feat_93を格納し、
yに目的変数であるtargetを格納しております。
ここで、目的変数はこのままだと学習を行う際にラベルがないとのエラーが発生してしまいます。
そこで、

result = LabelEncoder()
y = result.fit_transform(y)

と変換を行っております。

LabelEncoderとは、、、
文字列や数値で表されたラベルを,0~(ラベル種類数-1)までの数値に変換してくれるもの
です。
https://gotutiyan.hatenablog.com/entry/2020/09/08/122621

これで機械学習を行う上でのデータ加工は完了です。

機械学習行ってみる

では得られたデータを元に機械学習を行っていきたいと思います!!

まずはロジスティック回帰で分類してみたいと思います。

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

lr = LogisticRegression(C=1.0)
lr.fit(X_train, y_train)

y_pred = lr.predict_proba(X_test)

print(log_loss(y_test,y_pred))

今回はどれだけ間違えたのかを判定するためにLog lossでの判定を行いました。
結果は、、、

0.639

ちょっと誤判定多いですね😅

う~~ん。。
微妙ですね😅

ということで、過去の案件では何を使用しているのか確認!!
結果、
・RandomForest
・xgboost
の2種類を用いているようでした。

そこで2種類のアルゴリズムで確認を実施!!
まずはRandomForest。
コードはこちら。

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier().fit(X_train, y_train)
y_pred = model.predict_proba(X_test)
from sklearn.metrics import log_loss

print(log_loss(y_test,y_pred))

結果は、、

0.604

ロジスティック回帰よりも精度が良くなりましたね。

では次にxgboost。
コードはこちら。

from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb

model = xgb.XGBClassifier().fit(X_train, y_train)
y_pred = model.predict_proba(X_test)
from sklearn.metrics import log_loss

print(log_loss(y_test,y_pred))

結果は、、

0.481

アルゴリズムと比べて大幅に改善しました!!

Score上位ランカーは0.4を切っているようです。
いやはやすごい。。

■最後に

もっと他の方のコードも確認して、
どのようにして判定すればより誤判定を少なくすることが出来るのか勉強していきたいと思います!!

ただ、、、
機械学習は独学は結構厳しいですね😅
以前Qiitaを見ていた時にCoursaで勉強している人がいたので自分もやってみようかな?🤔
後はkaggleで他者のkernelを読み漁っていこうかな?と思います!!
コードを見ると勉強になりますからね!!