#覚書
# xgboostのimportのためにしたこと
# 1. cmakeのinstall(!pip3 install cmake)
# 2. pipを最新にする
# 今のバージョン確認(!pip3 --version)
# 最新に(!pip3 install --upgrade pip)
# 3. xgboostのinstall(pip install xgboost)
# なぜか!pip3だとimportエラーになった
#必要かわからないがやったこと(conda install libgcc)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
dataset = load_breast_cancer()
x = dataset.data
t = dataset.target
#XGBのモデル作成
#2値分類の時は引数にobjective="binary:logistic"を入れること
#デフォルトではmax_depthは6
model_XGB = xgb.XGBClassifier(objective="binary:logistic", max_depth=10)
#分割方法は今回はcross_validationにする(テストデータの場所を変えていく)。交差検証。
#https://newtechnologylifestyle.net/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92%e3%80%81%e3%83%87%e3%82%a3%e3%83%bc%e3%83%97%e3%83%a9%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%a7%e3%81%ae%e5%ad%a6%e7%bf%92%e3%83%87%e3%83%bc%e3%82%bf%e3%81%a8/
#データに偏りがあった時にその効果を薄めることができる
from sklearn.model_selection import cross_validate, KFold
#cross_validationで何分割するか決める(普通は5, 10くらい)
kf = KFold(n_splits=5, shuffle=True)
#return_estimatorで重要な特徴量がどれかを後で見るためにTrueにする
score = cross_validate(model_XGB, x, t, cv=kf, scoring="accuracy", return_estimator=True)
score
#これを実行して得られるscoreの値が重要
#テストデータに対するaccuracyである。
#結果が5つあるのは交差検証で5つにしたため
#5つを平均
score["test_score"].mean()
#重要な特徴量がどれかを確認
#今回cross_validationで5つ検証したが、その一つひとつに対してその時重要だった特徴量がそれぞれ排出される。
score["estimator"][4].feature_importances_ #[]の中はcross_validationの数
#リスト内包表記で1-5を表示
[score["estimator"][i].feature_importances_ for i in range(5)]
#ただしこれだと見づらいので列で平均を取ってdf形式にする
mean_score = np.mean([score["estimator"][i].feature_importances_ for i in range(5)], axis=0)
pd.DataFrame({"説明変数": dataset.feature_names, "重要度":mean_score}).sort_values("重要度", ascending=False)
終了!