Kaggleに手を出してみたいような出してみたくないような話。
約半年前くらい?プログラマーで、ちょいちょい勉強のアドバイスをいただいている友人に直接会う機会があった。
その友人は以前これ↓を勧めてきて、それを(一応)読んだことはこのブログで書いた。
次は何をしたらいいか?という質問をしてみたところ、
「んーKaggleやってみたら」
とのことであった。ど素人の自分でもSNSとかみてると勝手に目に入るKaggle。
当時の印象は(というか今でも)、
「ガチ勢の方がなんかすごい時間かけてなんかすごいことをやってる(英語)」
というわけで「やってみたら」というにはハードルが高すぎて、「もうちょっと勉強したら、、、」という言葉を言い訳にはや半年が過ぎた。
Label encording
カテゴリ変数を数値化する方法。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
for c in ["Sex", "Embarked"]:
le = LabelEncoder()
train_x[c]=le.fit_transform(train_x[c].fillna('NA'))
#LabelEncoderはNaNを扱えないので変換する必要がある。
fit_transformで数値化可能。
クロスバリデーション
データをk個に分割し、そのうち一つを検証用データとして使う。
これをk通りの組み合わせで繰り返す。
from sklearn.metrics import log_loss, accuracy_score
from sklearn.model_selection import KFold
from xgboost import XGBClassifier
import numpy as np
#クロスバリデーション
"""学習データを4つに分割し、うち一つをValidationとして使う。これを4通りの組み合わせで行う。"""
#各Foldのスコアリスト
scores_accuracy = []
scores_logloss = []
kf = KFold(n_splits=4,shuffle=True, random_state=71)
for tr_idx, va_idx in kf.split(train_x):
tr_x, va_x = train_x.iloc[tr_idx], train_x.iloc[va_idx]
tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx]
model = XGBClassifier(n_estimators=20, random_state=71)
model.fit(tr_x, tr_y)
va_pred = model.predict_proba(va_x)[:, 1]
logloss = log_loss(va_y, va_pred)
accuracy = accuracy_score(va_y, va_pred > 0.5)
scores_logloss.append(logloss)
scores_accuracy.append(accuracy)
logloss = np.mean(scores_logloss)
accuracy = np.mean(scores_accuracy)
※accracyとlogloss
Accuracy(正解率):分類後のモデルの正答率。モデルの分類の精度を表す。
logloss(クロスエントロピー誤差):分類前( 確率)がどれだけ近しいか。陽性、陰性への近さを表す。
パラメータチューニング
グリッドサーチ:ハイパーパラメータの全探索を行い、最適化したものを使用
#ハイパーパラメータ
param_space = {
'max_depth':[3, 5, 7],
'min_child_weight':[1.0, 2.0, 4.0]
}
param_combinations = itertools.product(param_space['max_depth'], param_space['min_child_weight'])
params = []
scores = []
#各組み合わせでクロスバリデーション
for max_depth, min_child_weight in param_combinations:
score_folds = []
kf = KFold(n_splits=4, shuffle=True, random_state=123456)
for tr_idx, va_idx in kf.split(train_x):
tr_x, va_x = train_x.iloc[tr_idx], train_x.iloc[va_idx]
tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx]
model = XGBClassifier(n_estimators=20, random_state=71, max_depth=max_depth, min_child_weight=min_child_weight)
model.fit(tr_x, tr_y)
va_pred = model.predict_proba(va_x)[:, 1]
logloss = log_loss(va_y, va_pred)
score_folds.append(logloss)
score_mean = np.mean(score_folds)
params.append((max_depth, min_child_weight))
scores.append(score_mean)
#最適化したパラメータを使用
best_idx = np.argsort(scores)[0]
best_param = params[best_idx]
アンサンブル
複数モデルを組み合わせて精度を向上させること。
例えばxgboostとロジスティック回帰の予測値を加重平均して新たなスコアにする。
例:xgboostの予測値*0.7+ ロジスティック回帰の予測値*0.3 = アンサンブル後の予測値