htomblog.com
Open in
urlscan Pro
183.181.85.32
Public Scan
URL:
https://htomblog.com/python-xgboost
Submission: On August 27 via api from US — Scanned from JP
Submission: On August 27 via api from US — Scanned from JP
Form analysis
2 forms found in the DOMPOST https://htomblog.com/wp-comments-post.php
<form action="https://htomblog.com/wp-comments-post.php" method="post" id="commentform" class="comment-form">
<p class="comment-notes"><span id="email-notes">メールアドレスが公開されることはありません。</span> <span class="required">*</span> が付いている欄は必須項目です</p>
<p class="comment-form-comment"><label for="comment">コメント <span class="required">※</span></label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea></p>
<p class="comment-form-author"><label for="author">名前 <span class="required">※</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required="required"></p>
<p class="comment-form-email"><label for="email">メール <span class="required">※</span></label> <input id="email" name="email" type="text" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required="required"></p>
<p class="comment-form-url"><label for="url">サイト</label> <input id="url" name="url" type="text" value="" size="30" maxlength="200" autocomplete="url"></p>
<p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"> <label for="wp-comment-cookies-consent">次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。</label></p>
<p><img src="https://htomblog.com/wp-content/siteguard/478584699.png" alt="CAPTCHA" data-src="https://htomblog.com/wp-content/siteguard/478584699.png" decoding="async" class=" lazyloaded" data-eio-rwidth="72" data-eio-rheight="24"><noscript><img
src="https://htomblog.com/wp-content/siteguard/478584699.png" alt="CAPTCHA" data-eio="l"></noscript></p>
<p><label for="siteguard_captcha">上に表示された文字を入力してください。</label><br><input type="text" name="siteguard_captcha" id="siteguard_captcha" class="input" value="" size="10" aria-required="true"><input type="hidden" name="siteguard_captcha_prefix"
id="siteguard_captcha_prefix" value="478584699"></p>
<p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="コメントを送信"> <input type="hidden" name="comment_post_ID" value="2273" id="comment_post_ID">
<input type="hidden" name="comment_parent" id="comment_parent" value="0">
</p>
<div class="inv-recaptcha-holder">
<div class="grecaptcha-badge" data-style="inline" style="width: 256px; height: 60px; box-shadow: gray 0px 0px 5px;">
<div class="grecaptcha-logo"><iframe title="reCAPTCHA"
src="https://www.google.com/recaptcha/api2/anchor?ar=1&k=6LflO-wUAAAAADp56KUFG0ZDlrX4ySgoPmzGTsa8&co=aHR0cHM6Ly9odG9tYmxvZy5jb206NDQz&hl=en&v=0hCdE87LyjzAkFO5Ff-v7Hj1&size=invisible&badge=inline&cb=dyxgbaabancp"
width="256" height="60" role="presentation" name="a-d2lz0hlvt6kw" frameborder="0" scrolling="no" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-top-navigation allow-modals allow-popups-to-escape-sandbox"></iframe>
</div>
<div class="grecaptcha-error"></div><textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response"
style="width: 250px; height: 40px; border: 1px solid rgb(193, 193, 193); margin: 10px 25px; padding: 0px; resize: none; display: none;"></textarea>
</div><iframe style="display: none;"></iframe>
</div>
</form>
GET https://htomblog.com/
<form class="search-box input-box" method="get" action="https://htomblog.com/">
<input type="text" placeholder="サイト内を検索" name="s" class="search-edit" aria-label="input" value="">
<button type="submit" class="search-submit" aria-label="button"><span class="fa fa-search" aria-hidden="true"></span></button>
</form>
Text Content
VBA / Python HTOMblog * TOP * VBA * Python * プロフィール * プライバシーポリシー * お問い合わせ 【PYTHON】XGBOOSTの実装方法と特徴量重要度 Python 2023.06.032020.09.19 スポンサーリンク XGBoostは簡単に実装できるわりに精度が高いので、ベースラインモデルとして優秀です。 import xgboost as xgb # データ形式の変換 dtrain = xgb.DMatrix(X_train, y_train) dtest = xgb.DMatrix(X_test, y_test) # パラメータ設定 params = { "objective": "reg:squarederror" # 回帰 #"objective": "binary:logistic" # 二値分類 #"objective": "multi:softprob" # 他クラス分類 #"num_class": 3 # 他クラス分類 } # 学習 model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dtest, "test")], ) 似たモデルにLightGBMがあります。こっちの方がメモリ消費が小さいです。 一方、XGBoostはGPUを使って学習を高速化できるメリットがあります。 今回紹介するコードを全部コピペしていくだけで実装できるので、 わからなくなったらとりあえずコピーしてみてください。 当ブログでは、もし私が機械学習初心者だったらどう勉強するかも解説しています。 >>コスパよく機械学習を勉強するロードマップ -index- * 回帰モデル * データセット * データ分割 * モデル作成 * 予測結果 * 学習状況可視化 * 過学習抑制 * early_stopping_rounds * 特徴量重要度 * 二値分類モデル * データセット * データ分割 * モデル作成 * 予測結果 * 多クラス分類モデル * データセット * データ分割 * モデル作成 * 予測結果 * まとめ 回帰モデル データセット import pandas as pd from sklearn.datasets import load_diabetes data = load_diabetes() df = pd.DataFrame(data["data"], columns = data["feature_names"]) df["target"] = data["target"] df “age” ~ “s6″までの特徴量を使って”target”を予測しましょう。 データ分割 from sklearn.model_selection import train_test_split train, test = train_test_split(df, test_size = 0.1) print(train.shape, test.shape) # ========== output ========== # (397, 11) (45, 11) train_test_splitで学習用データと検証用データとにわけました。 test_size = 0.1にすると10%が検証用になります。 【関連記事】交差検証でよく使うデータ分割法 モデルの精度を評価する際は、答えの知らない検証用データを使いましょう。 features = [c for c in df.columns if c != "target"] print(features) #学習用データ X_train = train[features] y_train = train["target"].values #検証用データ X_test = test[features] y_test = test["target"].values print(X_train.shape, y_train.shape) print(X_test.shape, y_test.shape) # ========== output ========== # ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6'] # (397, 10) (397,) # (45, 10) (45,) Xがモデルに入れる特徴量、yが答えです。 モデル作成 import xgboost as xgb # データ形式の変換 dtrain = xgb.DMatrix(X_train, y_train) dtest = xgb.DMatrix(X_test, y_test) # パラメータ設定 # regression: 回帰, squarederror: 二乗誤差 params = {"objective": "reg:squarederror"} # 学習 model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dtest, "test")], ) xgboostは学習と検証を繰り返し、徐々に精度を上げていくモデルです。 なので、上図のように各回での学習データと検証データでの精度が出力されます。 rmse(平均二乗誤差の平方根)が改善されていることがわかりますね。 回帰モデルを作りたいなら”objective”は”reg:squarederror”にします。 パラメータの項目についての詳細は公式ドキュメントを見るといいですよ。 予測結果 pred = model.predict(dtest) print(pred[:5]) print(y_test[:5]) # ========== output ========== # [237.90706 84.91177 77.13369 219.08762 129.09122] # [230. 97. 93. 220. 200.] predictで予測できます。だいたい正解していそうですね。 誤差を計算してみましょう。 import numpy as np from sklearn.metrics import mean_squared_error print(np.sqrt(mean_squared_error(y_test, pred))) # ========== output ========== # 66.3967555643605 誤差はおおよそ66.4でした。 学習状況可視化 import xgboost as xgb import matplotlib.pyplot as plt # データ形式の変換 dtrain = xgb.DMatrix(X_train, y_train) dtest = xgb.DMatrix(X_test, y_test) # パラメータ設定 # regression: 回帰, squarederror: 二条誤差 params = {"objective": "reg:squarederror"} # 履歴保存用の変数 history = {} # 学習 model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dtest, "test")], evals_result = history, # ここに渡す ) plt.plot(history["train"]["rmse"], label = "train") plt.plot(history["test"]["rmse"], label = "test") plt.legend() plt.show() “evals_result”にカラの辞書型データを渡せば、学習の履歴を保存できます。 青が学習データでの結果なので、過学習していますね。 過学習抑制 import xgboost as xgb import matplotlib.pyplot as plt # データ形式の変換 dtrain = xgb.DMatrix(X_train, y_train) dtest = xgb.DMatrix(X_test, y_test) # パラメータ設定 params = { "objective": "reg:squarederror", "max_depth" : 1, # 決定木の深さ } # 履歴保存用の変数 history = {} # 学習 model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dtest, "test")], evals_result = history, num_boost_round = 100, # 学習回数 ) plt.plot(history["train"]["rmse"], label = "train") plt.plot(history["test"]["rmse"], label = "test") plt.legend() plt.show() “max_depth”を小さくすると過学習を抑制できます。 “num_boost_round”を増やして学習回数も増やしています。 EARLY_STOPPING_ROUNDS “num_boost_round”を増やせばいくらでも学習を繰り返せますが、どこかで頭打ちします。 なので、無駄な時間を作らないように、”early_stopping_rounds”を設定しましょう。 import xgboost as xgb import matplotlib.pyplot as plt # データ形式の変換 dtrain = xgb.DMatrix(X_train, y_train) dtest = xgb.DMatrix(X_test, y_test) # パラメータ設定 params = { "objective": "reg:squarederror", "max_depth" : 1, # 決定木の深さ } # 履歴保存用の変数 history = {} # 学習 model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dtest, "test")], evals_result = history, num_boost_round = 100, # 学習回数 early_stopping_rounds = 10, # 打ち切り条件 ) plt.plot(history["train"]["rmse"], label = "train") plt.plot(history["test"]["rmse"], label = "test") plt.legend() plt.show() “early_stopping_rounds”を10にすると、10回検証データでの精度が改善されないと止まります。 50回目くらいで打ち切られていますね。 “num_boost_round”を大きめにして、”early_stopping_rounds”を設定すると無難です。 特徴量重要度 xgb.plot_importance(model) plt.show() plot_importanceに作成したモデルを入れると、特徴量の重要度を出してくれます。 ただデフォルトでは、どれだけ予測に寄与したかを示すわけではないようです。 予測への寄与度を知りたいなら、“importance_type”を”gain”に変えましょう。 xgb.plot_importance(model, importance_type = "gain") plt.show() どちらの結果にせよ、”s5″と”bmi”が重要みたいですね。 このデータセットは糖尿病に関するものらしいので、”bmi”が効くのも納得です。 二値分類モデル データセット imimport pandas as pd from sklearn.datasets import load_breast_cancer data = load_breast_cancer() df = pd.DataFrame(data["data"], columns = data["feature_names"]) df["target"] = data["target"] df 見切れていますが、30列の特徴量から”target”が0か1かを分類しましょう。 データ分割 from sklearn.model_selection import train_test_split # stratifyに設定したデータが均一になるように分割 train, test = train_test_split(df, test_size = 0.1, stratify = df["target"]) features = [c for c in df.columns if c != "target"] print(len(features)) #学習用データ X_train = train[features] y_train = train["target"].values #検証用データ X_test = test[features] y_test = test["target"].values print(X_train.shape, y_train.shape) print(X_test.shape, y_test.shape) # ========== output ========== # 30 # (512, 30) (512,) # (57, 30) (57,) やっていることは回帰モデルとほとんど同じなので割愛します。 “train_test_split”の”stratify”を設定して、”target”が均一になるようにしています。 例えば学習用データに”target = 1″が入っていないと、すべてを0と予測するモデルになるからです。 モデル作成 import xgboost as xgb import matplotlib.pyplot as plt # データ形式の変換 dtrain = xgb.DMatrix(X_train, y_train) dtest = xgb.DMatrix(X_test, y_test) # パラメータ設定 # binary: 二値分類 params = { "objective": "binary:logistic", } # 履歴保存用の変数 history = {} # 学習 model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dtest, "test")], evals_result = history, num_boost_round = 100, early_stopping_rounds = 10, ) plt.plot(history["train"]["logloss"], label = "train") plt.plot(history["test"]["logloss"], label = "test") plt.legend() plt.show() 主に回帰モデルと違うところは、パラメータ設定です。 “objective”を”binary:logistic”にしましょう。 予測結果 pred = model.predict(dtest) print(pred[:5]) print(y_test[:5]) # ========== output ========== # [9.9614751e-01 2.9195013e-04 9.9872178e-01 9.9986887e-01 4.2042270e-04] # [1 0 1 1 0] predictで予測すると、ラベルが1である確率を出力します。 なので、01のラベルとして結果を得るには、四捨五入したり、閾値を決める必要があります。 pred = model.predict(dtest).round() print(pred[:5]) print(y_test[:5]) # ========== output ========== # [1. 0. 1. 1. 0.] # [1 0 1 1 0] 正解していそうですね。正解率も計算してみましょう。 from sklearn.metrics import accuracy_score print(accuracy_score(y_test, pred)) # ========== output ========== # 0.9824561403508771 正解率は98%でした。 多クラス分類モデル データセット import pandas as pd from sklearn.datasets import load_iris data = load_iris() df = pd.DataFrame(data["data"], columns = data["feature_names"]) df["target"] = data["target"] df “load_iris”は花の種類を0,1,2の3種類で分類するデータセットです。 データ分割 from sklearn.model_selection import train_test_split # stratifyに設定したデータが均一になるように分割 train, test = train_test_split(df, test_size = 0.1, stratify = df["target"]) features = [c for c in df.columns if c != "target"] print(features) #学習用データ X_train = train[features] y_train = train["target"].values #検証用データ X_test = test[features] y_test = test["target"].values print(X_train.shape, y_train.shape) print(X_test.shape, y_test.shape) # ========== output ========== # ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] # (135, 4) (135,) # (15, 4) (15,) 今回も”train_test_split”で”stratify”を設定して分割しました。 モデル作成 import xgboost as xgb import matplotlib.pyplot as plt # データ形式の変換 dtrain = xgb.DMatrix(X_train, y_train) dtest = xgb.DMatrix(X_test, y_test) # パラメータ設定 # binary: 二値分類 params = { "objective" : "multi:softprob", "num_class": 3, } # 履歴保存用の変数 history = {} # 学習 model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dtest, "test")], evals_result = history, num_boost_round = 100, early_stopping_rounds = 10, ) plt.plot(history["train"]["mlogloss"], label = "train") plt.plot(history["test"]["mlogloss"], label = "test") plt.legend() plt.show() “objective”を”multi:softprob”にしましょう。 次に”num_class”にラベル数を渡します。今回は3ですね。 途中で過学習が起きて検証データでの精度が落ちています。 ただ、モデルは検証データで最も性能の良い状態を保存しているので、このままでOKです。 予測結果 pred = model.predict(dtest) print(pred[:5]) print(y_test[:5]) # ========== output ========== # [[0.00542975 0.97914153 0.01542874] # [0.9911123 0.00577696 0.00311077] # [0.0250621 0.15813866 0.8167992 ] # [0.00334191 0.00430827 0.9923498 ] # [0.00829999 0.05322199 0.938478 ]] # [1 0 2 2 2] predictで予測すると、各ラベルに該当する確率を出力します。 「データの行数 x 3」の配列で、左からラベル0,1,2の確率です。 pred = model.predict(dtest).argmax(axis = 1) print(pred[:5]) print(y_test[:5]) # ========== output ========== # [1 0 2 2 2] # [1 0 2 2 2] argmaxを使うと”値が最も大きいデータの位置”が出力されます。 正解していそうですね。 from sklearn.metrics import accuracy_score print(accuracy_score(y_test, pred)) # ========== output ========== # 0.9333333333333333 正解率を計算しました。だいたい93%くらいです。 まとめ 今回はXGBoostの実装方法を解説しました。 XGBoostが使えるようになったら、LightGBMも勉強するといいですよ。 なんか適当に独学してるだけで、 どうやって勉強を進めたらいいかわからんな。。。 と悩んでいる人向けに、 もし私が初心者ならどう勉強するかを解説しているので、参考にどうぞ。 >>コスパよく初心者が機械学習を勉強する方法|ロードマップ Python スポンサーリンク シェアする Twitter Facebook はてブ Pocket LINE コピー ToMo HTOMblog 関連記事 Python 【PYTHON】機械学習の勉強で読んだ本5冊|KAGGLE EXPERTになるまで 社会人になってからプログラミングを始め、Pythonを勉強してKaggleExpertになりました。今回はそれまでに読んだ本を5冊紹介します。大事な前提ですが、本を読んだところでKaggleのメダルが取れるようにはなりませんなんとかメダルを... Python 【PYTHON】GRADCAMで画像分類モデルがどこを見ているか確認する方法 GradCAMで画像分類モデルが見ている場所を確認したかったのですが、意味不明でエラーを連発しました。何とか使えるようになったので、初心者向けに共有しておきます。注意点として、この記事に書かれていることが最新とは限りません。エラーが起きたと... Python 【PYTHON】PYTORCHで画像分類モデルを作る方法 pytorchとtimmを使えば、簡単に画像分類モデルを作ることができます。#resnet18dを作るmodel=timm.create_model("resnet18d",pretrained=True,num_classes=10)#モ... Python 【PYTHON】TENSORFLOW(KERAS)とBERTで文章分類モデルを作る方法 今回はTensorFlowでBERTモデルを作り文章分類をする方法を解説します。"input_ids","attention_mask"の意味がわかれば簡単です。importtensorflow.keras.layersasLimportt... Python 【PYTHON】コスパよく初心者が機械学習を勉強する方法|ロードマップ 機械学習を勉強してみたいけど初心者すぎて何から始めたらいいかわからん。。。という悩みを解決します。私は独学で機械学習を勉強して、Kaggleで銀2枚を獲得しました。もともと別の職種でしたが、今はデータサイエンス系の仕事をしています。私の勉強... Python 【PYTHON】線形回帰(RIDGE, LASSO)の作り方 Pythonで機械学習を始めたいけど、何から勉強すれば良いかわからない。。。という方は、まずは線形回帰から始めてみましょう。めちゃくちゃシンプルなので初心者向きです。fromsklearn.linear_modelimportLinearR... 【Python】相関関係のヒートマップを作る方法 【1年以上使用済】ポップインアラジンのデメリットと注意点|買って後悔しない? コメント コメントを書き込む コメントをどうぞ コメントをキャンセル メールアドレスが公開されることはありません。 * が付いている欄は必須項目です コメント ※ 名前 ※ メール ※ サイト 次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。 上に表示された文字を入力してください。 プロフィール トモ ToMo Kaggle Competition 銀3 知識0からVBA, Pythonを始めました ToMoをフォローする カテゴリー * Gadget * Python * Tableau * VBA 【VBA】Excelマクロでコピー&ペーストを自動化する方法 2020.04.302023.06.03 【VBA】Excelマクロでファイル(ブック)を開く方法 2020.04.262023.06.03 【VBA】Excelマクロでファイル名を取得する方法 2021.01.042023.06.03 【VBA】Excelマクロで最終行(列)を取得する方法(End, Count) 2020.05.042023.06.03 【VBA】Excelマクロで日付を入れた名前を付けて保存する方法 2020.06.082023.06.03 アーカイブ アーカイブ 月を選択 2023年6月 2023年5月 2023年4月 2023年3月 2023年2月 2022年11月 2022年8月 2022年7月 2022年5月 2022年2月 2021年11月 2021年9月 2021年8月 2021年1月 2020年12月 2020年11月 2020年9月 2020年8月 2020年6月 2020年5月 2020年4月 2019年12月 スポンサーリンク ホーム Python HTOMblog © 2019 HTOMblog. * メニュー * TOP * VBA * Python * プロフィール * プライバシーポリシー * お問い合わせ * ホーム * 検索 * トップ * サイドバー モバイルバージョンに移動 タイトルとURLをコピーしました