とりあえず XGBoost を使ってみる。Kaggle 本*1と公式ドキュメントを混ぜたような内容にしつつ 決定木 (6) - らんだむな記憶 の内容を試す。
import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import xgboost as xgb # データセットのロードと訓練データと検証データとテストデータへの分割 iris = datasets.load_iris() X = iris.data[:, [2, 3]] y = iris.target X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=1, stratify=y) X_train, X_val, y_train, y_val = train_test_split( X_train, y_train, test_size=0.16, random_state=1, stratify=y_train) # XGBoost による分類器の作成と訓練 dtrain = xgb.DMatrix(X_train, label=y_train) dvalid = xgb.DMatrix(X_val, label=y_val) dtest = xgb.DMatrix(X_test) param = { 'objective':'multi:softprob', 'eval_metric': 'mlogloss', 'num_class': len(iris['target_names']), 'max_depth': 3, 'eta': 0.1, 'verbosity': 1, 'random_state': 71, } watchlist = {(dtrain, 'train'), (dvalid, 'eval')} bst = xgb.train(param, dtrain, num_boost_round=10, evals=watchlist, early_stopping_rounds=10) y_pred = bst.predict(dtest) y_pred = np.array([np.argmax(ps) for ps in y_pred]) print(accuracy_score(y_pred, y_test))
0.9666666666666667
といった感じでなかなか精度の良い結果になった。
DecisionTree の場合の決定境界の描画ロジックをそのまま使い回して良いのか分からないが、使ったらそれっぽい結果が出ていたのでとりあえず貼っておく。