<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>XGBoost on Marketechlabo</title><link>https://www.marketechlabo.com/tags/xgboost/</link><description>Recent content in XGBoost on Marketechlabo</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Mon, 03 Dec 2018 00:00:00 +0900</lastBuildDate><atom:link href="https://www.marketechlabo.com/tags/xgboost/index.xml" rel="self" type="application/rss+xml"/><item><title>Rを使ったXGBoostの高度なパラメータチューニングと細かいノウハウ</title><link>https://www.marketechlabo.com/machine-learning/r-xgboost-tuning/</link><pubDate>Mon, 03 Dec 2018 00:00:00 +0900</pubDate><guid>https://www.marketechlabo.com/machine-learning/r-xgboost-tuning/</guid><description>
&lt;p&gt;XGBoostは機械学習手法として&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比較的簡単に扱える&lt;/li&gt;
&lt;li&gt;目的変数や損失関数の自由度が高い（欠損値を扱える）&lt;/li&gt;
&lt;li&gt;高精度の予測をできることが多い&lt;/li&gt;
&lt;li&gt;ドキュメントが豊富（日本語の記事も多い）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで大変便利。
ただチューニングとアウトプットの解釈については解説が少ないので、このあたりについて説明する。&lt;/p&gt;
&lt;h2 id="xgboostとは"&gt;XGBoostとは？&lt;/h2&gt;
&lt;p&gt;勾配ブースティングのとある実装ライブラリ（C++で書かれた）。イメージ的にはランダムフォレストを賢くした（誤答への学習を重視する）アルゴリズム。RとPythonでライブラリがあるが、ここではRライブラリとしてのXGBoostについて説明する。
XGBoostのアルゴリズム自体の詳細な説明はこれらを参照。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tjo.hatenablog.com/entry/2015/05/15/190000"&gt;https://tjo.hatenablog.com/entry/2015/05/15/190000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;グラフィカルな説明
&lt;a href="https://arogozhnikov.github.io/2016/06/24/gradient_boosting_explained.html"&gt;https://arogozhnikov.github.io/2016/06/24/gradient_boosting_explained.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この記事では具体的なライブラリの使い方を中心に説明する。
2値分類だけでなく、連続量の回帰分析、多クラス分類、ポアソン回帰、Cox回帰（生存時間分析）などにも対応している。&lt;/p&gt;
&lt;h2 id="データセットと前処理"&gt;データセットと前処理&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.kaggle.com/datasets/harlfoxem/housesalesprediction"&gt;House Sales in King County, USA&lt;/a&gt;
米国のワシントン州のキング郡の住宅価格のデータ。価格（連続量）を予測する回帰モデルを構築する。
データセットの主な留意点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;21613行21変数&lt;/li&gt;
&lt;li&gt;最初の列が識別子（&lt;code&gt;id&lt;/code&gt;）→除外&lt;/li&gt;
&lt;li&gt;2列目が&lt;code&gt;20141009T000000&lt;/code&gt;形式の日付（&lt;code&gt;date&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;3列目が目的変数（&lt;code&gt;price&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;位置情報は&lt;code&gt;zipcode&lt;/code&gt;と&lt;code&gt;lat&lt;/code&gt;と&lt;code&gt;long&lt;/code&gt;があるが、&lt;code&gt;zipcode&lt;/code&gt;を&lt;code&gt;factor&lt;/code&gt;にして&lt;code&gt;lat&lt;/code&gt;と&lt;code&gt;long&lt;/code&gt;を除外&lt;/li&gt;
&lt;li&gt;それ以外は数値型変数なので型変換の必要なし&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上の処理をしたデータのうち80%を学習データ、20%をテストデータとして分割する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(data.table)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fread&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;kc_house_data.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,id&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,date&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as.Date&lt;/span&gt;(date, format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;%Y%m%d&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,zipcode&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as.factor&lt;/span&gt;(zipcode)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,lat&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data.dt[,long&lt;span style="color:#f92672"&gt;:=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nr &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(data.dt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;train &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sample&lt;/span&gt;(nr, nr&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;train.dt &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; data.dt[train] &lt;span style="color:#75715e"&gt;# 学習データ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;test.dt &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; data.dt[&lt;span style="color:#f92672"&gt;-&lt;/span&gt;train] &lt;span style="color:#75715e"&gt;# 検証データ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="手順"&gt;手順&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;モデル構築用行列データの生成&lt;/li&gt;
&lt;li&gt;パラメータチューニングしながらモデルの構築&lt;/li&gt;
&lt;li&gt;予測、評価&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="モデル構築用行列データの生成"&gt;モデル構築用行列データの生成&lt;/h2&gt;
&lt;p&gt;XGBoostではデータをDMatrixという固有の形式で扱う。これは説明変数と目的変数が入った特殊な行列の形式で、Rの他のパッケージでは扱うことができない。DMatrixデータそのものをバイナリファイルとして保存することも可能で、Rで生成したDMatrixのバイナリをPythonで読み込むことや、その逆もできる。
まずこの形式のデータを生成する。
データフレームやdata.tableを
matrixまたはdgCMatrix形式のモデル行列に変換し、
それを&lt;code&gt;xgb.DMatrix()&lt;/code&gt;関数でDMatrix形式にする。
学習データ&lt;code&gt;train.dt&lt;/code&gt;というdata.tableの正解ラベルの列が&lt;code&gt;price&lt;/code&gt;で、それ以外のすべての列を説明変数とする場合&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(xgboost)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(Matrix)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;options&lt;/span&gt;(na.action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;na.pass&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;train_dmat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xgb.DMatrix&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sparse.model.matrix&lt;/span&gt;(price &lt;span style="color:#f92672"&gt;~&lt;/span&gt; ., data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; train.dt),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; train.dt[, price]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;options&lt;/span&gt;(na.action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;na.omit&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;欠損値を含むデータを扱う場合&lt;/strong&gt;、行列の生成関数を実行する前に&lt;code&gt;options(na.action='na.pass')&lt;/code&gt;を実行しておく必要がある（このデータには欠損値は含まないが、説明のため入れておいた）。
この例ではいったんMatrixパッケージの&lt;code&gt;sparse.model.matrix()&lt;/code&gt;関数でdgCMatrix形式の行列（疎行列）を生成した。
&lt;code&gt;xgb.DMatrix()&lt;/code&gt;関数は&lt;/p&gt;</description></item></channel></rss>