基本的な書き方
まず、ネットの偉大な先輩方のソースコードを見ながら学習できる状態にした。
基本的なことであるが、復習も兼ねて説明する。
ちなみに今回はmulti-class loglossを評価指標にしている。
このような状態で学習させたところ過学習してしまったので、特徴量を考える必要がある。
-
pd.read_csv()
csvの読み込み -
train_test_split()
学習用と評価用それぞれの説明変数、目的変数 -
xgb.DMatrix()
xgboost用の行列に変換する -
xgb.train()
xgboostで学習を行う
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import log_loss
from sklearn.preprocessing import LabelEncoder
import category_encoders as ce
df_train = pd.read_csv('/kaggle/input/train_hoge.csv')
df_test = pd.read_csv('/kaggle/input/test_hoge.csv')
y = df_train['hoge']
x = df_train.drop(['hoge','hoge','hoge','hoge'], axis=1)
test = df_test.drop(['hoge','hoge'], axis=1)
list_cols = ['hoge','hoge', 'hoge']
ce_oe = ce.OrdinalEncoder(cols=list_cols,handle_unknown='impute')
x = ce_oe.fit_transform(x)
test = ce_oe.fit_transform(test)
tr_x, va_x, tr_y, va_y = train_test_split(x,y,test_size=0.2, train_size=0.8, shuffle=True)
dtrain = xgb.DMatrix(tr_x, label=tr_y)
dvalid = xgb.DMatrix(va_x, label=va_y)
param = {'max_depth': 3, 'eta': 1, 'objective': 'multi:softprob', 'num_class': 13, 'eval_metric': 'mlogloss'}
evallist = [(dvalid, 'eval'), (dtrain, 'train')]
num_round = 1000
bst = xgb.train(param, dtrain, num_round, evallist, early_stopping_rounds=5)
print('Best Score:{0:.4f}, Iteratin:{1:d}, Ntree_Limit:{2:d}'.format(
bst.best_score, bst.best_iteration, bst.best_ntree_limit))
dtest = xgb.DMatrix(test)
pred = ypred = bst.predict(dtest, ntree_limit=bst.best_ntree_limit)
print("pred:",pred)
xgb.plot_importance(bst)
my_solution = pd.DataFrame(pred)
my_solution.head()
基本的な確認
評価指標と目的関数の一致
目的関数とは学習で最適化される関数である。
評価指標とは予測性能を測る指標である。
現在、評価指標はmulti-class logloss
であることは確定している。
そのときの目的関数はsoftprob
でいいのだろうか?
基本的には、目的関数=評価関数とした。
解決はしていないが、『Kaggleで勝つデータ分析の技術』のP237に以下のような記述があった。
マルチクラス分類の場合はmulti:softprobを設定することで、multi-class loglossを最小化するように学習する
時系列データの取り扱い
ルールに「特徴量として未来情報を予測アルゴリズムに与えることは禁止」とある場合、例えば以下のような工夫が必要である。
2017年の9月と10月のデータを評価データとする。
2017年の3月から8月までのデータを学習データとする。
ちなみにテストデータは2018年と2019年であるとする。
- 将来の目的変数の傾向が最も直近の年の傾向に近いという仮説から、テストデータにしか存在しない年を学習データに存在する最新の年に置き換える方法(外挿による想定外の挙動は避けられる)
問題を理解する
こういうい傾向があるのではないかという仮説を立てて検証する
- 投手の年齢によって、持っている球種に傾向がある
- 持ち球(球種)とコースの関係
- 右打者か左打者か
- アウトサイドかインサイドか
- バッターの打順は
宿題
- なぜ、multi-class loglossが評価指標のときにsoftpredを目的関数にするのか?
- softpredとsoftmaxの違いを出力的に、数学的に理解する
- label encodingが決定木でしか使えない(?)理由
総括
- 機械学習の基本的な記述方式を復習できてよかった。(sklearnによるデータ分割や評価指標、pandasのDataFrameなど)
- xgboostで学習するという経験を積むことができた。
- 特徴量の作り方についてきっかけをつかむことができた。