こんにちは、ミナピピン(@python_mllover)です。この記事は決定木を実務で使う上で自分が指摘された点をつらつらと書いています。これは他人用じゃなくて自分用なので、読ませるものじゃないです。意味が分からないときはツイッターとかで質問ください。
アルゴリズム
決定木のアルゴリズムは有名なのが3つくらいあるが、大抵CHAIDを使えばOK。ちなみにPythonのscikit-learnの決定木にはCHAIDのアルゴリズムは用意されていないので実務で決定木分析をPythonでやるのはちょっとめんどくさい
余談ですが、Scikit-learnの決定木分析にはCART(指標:giniまたはentropy)他が採用されていますが、CARTは下記の2点を含め、さまざまな理由から実務ではあまり使われていません。
- 2分岐のみのため単純すぎる
- 過学習させるアルゴリズムのため、小さすぎる区分が出現するので扱いにくい
つまり分析しても分岐が細かすぎて分析結果がよくわからないというオチになってしまうパターンが多いということです。
参考記事:https://webmaking.rei-farms.jp/webmaking/python/5615/
データの質をそろえる
データの質がそろっていないと分析しても意味のない結果になってしまいます。そうならないようにクラスタリングでユーザーの質を揃える必要があります。
クラスタリングには主成分分析(PCA)とk-mean法が良く使用されます。よくやるのは説明変数が数十個あるデータとかに対してまず主成分分析をかけることで次元削減(説明変数の量をデータの性質を損なうことなく減らすこと)を行い、変数をいくつかの主成分に変換します。この主成分のうち累積説明度合いが80%以上を超えた(例えば20個くらい主成分がでていて5つの主成分でデータの80%が説明されていたら、その5つの成分を説明変数とします)主成分でk-mean法を使ってデータをいくつかのセグメントに分割したりします。
参考記事:【Python】主成分分析(PCA)で学習データをクラスタリングする
学習データの偏りを排除する
決定木分析にかけるデータの1と0の割合にも注意です。クリック予測とかだとクリックした:クリックしないの割合が1:99くらいなので、このまま学習させるととりあえずクリックしないにしておけば正解率が上がってしまうので、全然予測になりません。
こういう説明変数の正解と外れに大きな差がある場合はそれを解消するためにデータの水増し(ダウンサンプリング)したり無作為抽出(ランダムダウンサンプリング)したりします。
第2要因の確認方法
決定木の第一要因はもちろん最初の分岐に出てくる説明変数な訳ですが、第二要因どうやって解釈するのか?という点についてです。研修とかだと第二分岐に出てくるものを第二要因としている資料をたまに見るのですが、これは悪手です。決定木の第2分岐に出てくる変数=第2要因とは言えません。
決定木で第2要因を把握したいときは、分析にするデータから第1要因に上がってきた説明変数を削除してサイド決定木分析を行い、その決定木の第1分岐に出てきた説明変数を第2要因としたほうがいいです。ちなみに第2要因の説明変数が当たり前だろ的な要素であった場合はその説明変数もさらにデータフレームから削除して再度決定木分析を行ったりします。
XGBoostを使う
これは決定木のアルゴリズムの進化形で、ざっくりいうと内部で何個も決定木を作り直して前の決定木の結果を学習することでより精度を高めていく、ニューラルネットワーク決定木みたいなものです。これを使うだけで基本的に普通の決定木より精度が良くなります。
また決定木があまり活躍しない予測の分野であってもまず「XGBoost」を行うことで説明変数の重要度がある程度確認でき、どの変数を工夫すれば予測精度が改善できるかが把握できるので有効です。
関連記事:【Python】元最強アルゴリズム「XGBoost」で機械学習をやってみた
まとめ
- アルゴリズムはCHAIDを使う
- クラスタリングでユーザの質を揃える
- 1と0の比率をできるだけ同じにする
- 決定木の第2要因は第2分岐じゃない
- 困ったらXGBoostを使おう
分析をするだけなら最近はノーコードも増えていますし、だれでもできますが、分析結果の解釈や細かい部分は実際に仕事で分析をしてみないと分からない点が多いです。これは分析会社に入って気付いたことなので、今の会社に入ってよかったなと思います。
コメント