タグ

tree*と*algorithmに関するsh19910711のブックマーク (50)

  • XGBoost と LightGBM に実装されているポジションバイアス除去を試してみた

    はじめに 以前も記事にしたが、ウェブ上のユーザーの行動ログを使って推薦システムを開発している自分のようなMLエンジニアにとって、ランキング学習におけるポジションバイアスの除去は重要なテーマである。サービスのログは通常様々なバイアスに塗れており、特にリストの上位に表示されたアイテムほどクリックが集まりやすくなってしまうポジションバイアスは非常に厄介だ。アカデミアではこの手のテーマはだいぶ研究が進んでいるものの、これまでは論文や書籍で手法が紹介されるだけで、手軽にパッと使えるライブラリは存在しなかった。 しかしどうやら最近になって XGBoost や LightGBM という多くの人が使う強力なGBDTライブラリにポジションバイアスを除去する機能が実装されたらしく、これが使い物になるのであれば実務で利用するハードルがグッと下がると思い、実験して性能を検証してみた。 検証に使うデータセット ここ

    sh19910711
    sh19910711 2024/09/15
    "ポジションバイアス: リストの上位に表示されたアイテムほどクリックが集まりやすくなってしまう / 最近になって XGBoost や LightGBM という多くの人が使う強力なGBDTライブラリにポジションバイアスを除去する機能が実装"
  • セグメント木を使う

    競技プログラミングに慣れ親しんでいる方なら、セグメント木というデータ構造について、一度は聞いたことがあるでしょう。この記事は、セグメント木の構造を理解する必要はないが、使い方を知っておきたいという方のために書かれています。 この記事では、まずセグメント木について紹介し、それからセグメント木を実際に使う際の技法について紹介します。 セグメント木とは セグメント木は、固定長配列にいくつかの操作を加えたデータ構造です。セグメント木は、基的には以下の操作を時間計算量 O(\log n) ですることができます。 i 番目の要素に x を代入 i 番目の要素を取得 l 番目の要素から r 番目の要素のモノイド積[1]を計算 ここで、モノイドを知らない方もいるかもしれませんので、モノイドについて紹介します。 モノイド モノイドは、実数や複素数の足し算や掛け算、文字列の連結といった、集合とその演算をまと

    セグメント木を使う
    sh19910711
    sh19910711 2024/06/08
    "セグメント木: 固定長配列にいくつかの操作を加えたデータ構造 + 𝑙 番目の要素から 𝑟 番目の要素のモノイド積を計算 / 累積和と同様の操作が可能 + セグメント木と累積和の違いは途中で更新ができる" 2022
  • オイラーツアーした木に対するクエリ - Qiita

    この記事に新規性はありません。maspyさんの記事、beetさんの記事がとても分かりやすいです。また、紹介しているテクニックはmaspyさんの記事で紹介されているものです。 maspyさんの記事: Euler Tour のお勉強 beetさんの記事: 2種類のEuler Tourについて オイラーツアーとは? 根付き木を根からDFSして根に戻ってくるような経路(の探索)。競技プログラミングの文脈ではこの行きと戻りの経路について以下のような情報を記録しておくきRMQやRSQを適応することで木に対するいくつかのクエリを高速に処理できる。 各頂点のinとoutの時刻 それまでに辿った辺や頂点の重さなどの情報を記録 各頂点の深さの情報 用語 行きがけ: あるノードから子に移動する 帰りがけ: 子からその親ノードに移動する 実際の例 1を根とする以下の木があるとします。 時刻0は根である1にいてDF

    オイラーツアーした木に対するクエリ - Qiita
    sh19910711
    sh19910711 2024/06/07
    "オイラーツアー: 根付き木を根からDFSして根に戻ってくるような経路 + RMQやRSQを適応することで木に対するいくつかのクエリを高速に処理できる / 各頂点のinとoutの時刻 + 辿った辺や頂点の重さ + 各頂点の深さ" 2020
  • プリム法ベースのシュタイナー木 - bowwowforeachの日記

    AHC020でシュタイナー木を作るような問題がでました。そこでプリム法ベースのシュタイナー木を作ることがあったのでその方法を説明します。 シュタイナー木とは グラフとターミナルと呼ばれる頂点集合が与えられたとき、ターミナルを全てつなぐ木のことをシュタイナー木といいます。 頂点A,B,Cがターミナル シュタイナー木の例 ターミナルでない頂点はつないでもつながなくても構いません。 シュタイナー木のうちコストが最小のものを最小シュタイナー木といい、これを求めるアルゴリズムとしてDreyfus-Wagner法というものがあるらしいです。しかしこの方法はとても計算量が多いです。 今回紹介するプリム法ベースのシュタイナー木は、計算量は少なくて済みますがコストが最小になるとは限りません。ヒューリスティックコンテストにおける焼きなましの最中など、厳密さより速度が優先されるようなケースでの使用を想定していま

    プリム法ベースのシュタイナー木 - bowwowforeachの日記
    sh19910711
    sh19910711 2024/06/06
    "シュタイナー木: ターミナルと呼ばれる頂点集合が与えられたとき、ターミナルを全てつなぐ木 / プリム法ベースのシュタイナー木は、計算量は少なくて済みますがコストが最小になるとは限りません" 2023
  • 【論文解説】TabNetを理解する

    さて今回は、最近テーブルデータの予測においてKaggleでもよく使われているTabNetの解説をしたいと思います。 このサイトでは自然言語処理分野がメインで画像認識分野を少しという感じでしたが、テーブルデータについても面白い発展があるようですね。 以下は簡単にまとめたTabNetの特徴です。 ディープラーニングをベースとしたモデル。特徴量の選択や加工などの前処理が不要で、end-to-endで学習することができる。アテンション・メカニズムを使い、各決定ステップ(decision step)において使用する特徴量を選択する。 アテンション・メカニズムにより解釈性が向上し、重要な特徴量をうまく学習することができる。全サンプル共通ではなくサンプルごとに重要な特徴量を選択する。いくつかの特徴量をマスクし、それを予測するという事前学習を行う。 特徴量の選択が不要で、自動的に、しかも全体ではなくサンプ

    【論文解説】TabNetを理解する
    sh19910711
    sh19910711 2024/05/29
    "TabNet: サンプルごとに重要な特徴量を選択 + いくつかの特徴量をマスクし、それを予測するという事前学習 / ベースはディープラーニング + 決定木の考え方を組み合わせ" 2021
  • Facebook のオープンソース最適化ライブラリAx を使ってXGBoost のハイパラチューニングを行ってみた - Qiita

    製造業出身のデータサイエンティストがお送りする記事 今回はFacebook のオープンソース最適化ライブラリAx を使ってXGBoost のハイパーパラメータをチューニングしてみました。 ##はじめに 勾配ブースティング木に関しては、過去に記事を書いておりますのでそちらを参照して頂けますと幸いです。 勾配ブースティング決定木(XGBoost, LightGBM, CatBoost)を実装してみた Optuna を使ったハイパラチューニングに関しても、過去に記事を書いておりますのでそちらを参照して頂けますと幸いです。 勾配ブースティング決定木(XGBoost, LightGBM, CatBoost)でOptunaを使ってみた ##Ax とは Ax は、Facebook のオープンソース最適化ライブラリです(公式のGitHubページ)。 Ax は、ベイズ最適化(GP-EI)を使ってハイパーパラ

    Facebook のオープンソース最適化ライブラリAx を使ってXGBoost のハイパラチューニングを行ってみた - Qiita
    sh19910711
    sh19910711 2024/05/27
    "Ax: ベイズ最適化(GP-EI) + ガウス過程(GP)により目的関数を予測 + 期待値(EI)を計算して最適化 / 横軸を探索回数、縦軸をベストスコア + 2つのパラメータを軸に取って期待値と標準偏差を表したグラフ" 2021
  • XGBoostとtsfreshでMultivariate time series forecasting 備忘録 - Qiita

    概要 feature-engineがきっかけで最近チェックしているPyDATA この動画を見ながらKaggleの株価予測をsktimeで試してみるか、ってモチベが上がって(よくある)久しぶりのsktimeを触っていたらtsfreshをラップしたapiに気づいたので、先にtsfreshの素性を調べてみるか、と回りくどい流れ。 時系列初心者にはマストな内容の講演動画で超オススメ。ハッ!と思わせるやり取りが質疑応答にあってとても良かった。 今回はおもにtsfreshを使って説明変数を増やすことが目的で、XGBoostは精度確認しSHAPでimportanceを可視化する程度のおまけ。 Daskのように独自の馴染めない世界観がありDocumentsの例もわかりにくく、少し手間取ったので残す。 実施期間: 2022年12月 環境:Colab パケージ:tsfresh, XGBoost, SHAP,

    XGBoostとtsfreshでMultivariate time series forecasting 備忘録 - Qiita
    sh19910711
    sh19910711 2024/05/27
    "tsfreshを使って説明変数を増やす / 時系列関連のmetricsを自動計算 + その中でtargetに関係しそうなmetricsの選定 / FRESH(FeatuRe Extraction based on Scalable Hypothesis tests)というアルゴリズムを使用している" 2023
  • なぜCatboostの推論は速いの? - 簡単なレポート

    前回の記事「AutoML v.s. Catboost」に出てくるCatboostは、XGBoostやLightGBMと比べて30-60倍も推論が速いという特徴があります。 推論時間は、kaggleなどのコンペでは推論に時間をかけられるのであまり気にしませんが、実サービスとなると重要ですよね。 推論時間の比較 以下のグラフは、3大GBDTライブラリでの推論時間比較です。Catboostがずば抜けて速いことがやかります。 そして学習時間の速さに定評があるLightGBMは、なんと最遅です。 この推論時間の速さは、CatboostがGBDTのベースとなる決定木に symmetric tree と呼ばれる、特殊な形の木を使っているからです。 ここで、symmetric treeとは以下の図の右側のような木です。左側は普通の決定木です。 なぜsymmetric treeは速いか 「同一の深さではすべ

    なぜCatboostの推論は速いの? - 簡単なレポート
    sh19910711
    sh19910711 2024/05/27
    "Catboost: 決定木に symmetric tree と呼ばれる、特殊な形の木を使っている + 同一の深さではすべての分岐条件が同じ / LightGBM: 学習時間の速さに定評 / GPUを用いた場合は、学習時間でもCatboostが最速" 2019
  • [python] kd木を使った最近傍探索 - Qiita

    import numpy as np import matplotlib.pyplot as plt import pandas as pd import time class Linear: def __init__(self,pointlist): self.pointlist = np.array(pointlist) def search(self,point,q=1): length = [] for i in self.pointlist: length.append([self.L2(i,point),list(i)]) if q == 1: return [i[1] for i in sorted(length)][0] else: return [i[1] for i in sorted(length)][:q] def L2(self,point1,point2): #

    [python] kd木を使った最近傍探索 - Qiita
    sh19910711
    sh19910711 2024/05/23
    "kd木: データの軸をずらしながら、それぞれの軸の中央値を取る / どれかの軸についての絶対値を比較 + 絶対に最近傍点の存在しない領域を排除する / 次元数を増やすと計算量があまり削減できなくなる" 2022
  • TabNetのアーキテクチャを詳しく解説 - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに kaggleでは2020年ぐらいから当たり前のように使われるようになってきたTabNetですが使ったこともないですし、どんなアーキテクチャなのかも知りませんでした。今回は実装というよりもTabNetについて理解が深められたらと思います。 参考: TabNetとは一体何者なのか? :TabNetの概要についてわかりやすく解説している記事です。 TabNetを使えるようになりたい【追記①lgbmとstacking(ちょっと上がる)】 :atmacup #10のディスカッションで上がっていたものです。恐らくコンペ参加しないと(後から

    TabNetのアーキテクチャを詳しく解説 - Qiita
    sh19910711
    sh19910711 2024/05/18
    "テーブルデータ: 決定木ベースのモデルが強かった + 学習速度も早いし精度も高い + 解釈性も高い / TabNet: maskしてFCしてReLUを通して各stepの出力を足し合わせるという構造 + 決定木でやっているような領域分割に近い" 2022
  • Adversarial Random ForestsによるテーブルデータのAugmentation・モックデータ生成

    はじめに こんにちは。株式会社アイデミーデータサイエンティストの中沢(@shnakazawa_ja)です。 記事ではAdversarial Random Forestsを使ったテーブルデータの生成について、RおよびPythonでの実装を紹介します。 Adversarial Random Forests (ARF) とは ARFは2023年にProceedings of The 26th International Conference on Artificial Intelligence and Statisticsに採択された論文で提案された、テーブルデータに対して密度推定と生成モデリングを行う高速な手法です[1]。 その名の通りGAN[2]とRandom Forestを組み合わせた手法で、生成と識別を交互に繰り返すことで元データの特性を学習し、元のテーブルデータと類似したデータを生成

    Adversarial Random ForestsによるテーブルデータのAugmentation・モックデータ生成
    sh19910711
    sh19910711 2024/05/10
    "ARF; Adversarial Random Forests: その名の通りGANとRandom Forestを組み合わせた手法 + 元のテーブルデータと類似したデータを生成 / 個人情報・秘匿情報をマスクしたモックデータの生成といった場面での活用可能性"
  • Tree Tensor Networkを用いた画像分類器 - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに テンソルネットワークは、量子多体系などの高次元なデータを効率的に扱うための手法として利用される技術ですが、近年、テンソルネットワークを機械学習に応用する研究が様々行われています。 今回は、文献[1]を参考に、Tree Tensor Network (TTN)を用いて、画像の分類を行うモデルをPyTorchで実装し、MNISTとFashion-MNISTに対して、その性能を確認してみます。 概要 今回用いるTree Tensor Network (TTN)は、その名の通り、木構造のテンソルネットワークです。 今回取り上げるTTN

    Tree Tensor Networkを用いた画像分類器 - Qiita
    sh19910711
    sh19910711 2024/05/09
    "TTN; Tree Tensor Network: 葉が画像の各ピクセルに相当 + 愚直に実装しようとすると、葉より上のノードのテンソルの次元数が非常に大きく / CP分解: テンソルをベクトルの直積の和に分解 + 近似的にテンソルを表現" 2023
  • ランダムフォレストをスクラッチで実装したい - Qiita

    非Deepな機械学習手法としてランダムフォレスト (Random Forest) を選択する場面は多々ありますが、基的にライブラリ任せになってあまり中身を意識することがありません。ので、今回はランダムフォレストの内部的な仕組みを確認しつつ、それを踏まえてPythonでスクラッチ実装していこうと思います。 ランダムフォレストについて ランダムフォレストの仕組みに関する分かりやすい記事は探せばいくらでもあるので、ここでは以降が読みやすくなるよう実装の視点から少し解説をつけておきます。 ランダムフォレストはたくさんの決定木から構成され、決定木はノードから構成されます。イメージとしては以下のようになります。 なので、実装の手順としては、 ノード : Node 決定木 : DecisionTree ランダムフォレスト : RandomForest の3つのクラスを実装していきます。 1. ノード

    ランダムフォレストをスクラッチで実装したい - Qiita
    sh19910711
    sh19910711 2024/05/09
    "sklearn.tree は使わない縛り / RandomForest: 入力されたデータからランダム抽出したサブセットを各決定木への入力とすることで多様な木を構築 + 抽出の際、使用する特徴量についても選択" 2020
  • 勾配ブースティング(Gradient Boosting)を理解する - Liberal Art’s diary

    (↑from scikit-learn User Guide Gradient Boosting Out-of-Bag estimates — scikit-learn 0.24.1 documentation) 当記事では勾配ブースティング(Gradient Boosting)について簡単に確認を行います。 勾配ブースティングについては少々フォーマルな記載が多く理解が大変なのですが、上記の「scikit-learnとTensorFlowによる実践機械学習」の記述が比較的わかりやすいので、こちらを元に簡単に確認したのちにWikipediaの記載を簡単に確認します。 以下、今回の目次になります。 1. 概要の把握 2. Wikipediaの確認 3. まとめ 1. 概要の把握 1節では「scikit-learnとTensorFlowによる実践機械学習」の記述を主に参考にしながら簡単な確認を行

    勾配ブースティング(Gradient Boosting)を理解する - Liberal Art’s diary
    sh19910711
    sh19910711 2024/05/03
    "Gradient Boosting: 「scikit-learnとTensorFlowによる実践機械学習」の記述が比較的わかりやすい + フーリエ展開に発想としては近く / それまでの分類器と正解の値の差を以降の学習器で学習" 2021
  • これでわかるB-treeアルゴリズム / B-tree algorithm

    ・二分探索木 (binary search tree) ・AVL tree ・B-tree ・B+ tree について順を追いながら説明。 流れを細かく書いたので、わかりやすいと思います。

    これでわかるB-treeアルゴリズム / B-tree algorithm
    sh19910711
    sh19910711 2024/05/01
    "B-tree: 各ノードに持たせる値を1つでなく複数にし木の高さを抑える + より多くの枝を持つ / 最大で持つ枝の数に応じて「オーダmのB-tree」という言い方をする / B+ tree: 最下層のノードがポインタでつながっている" 2018
  • ランキング学習を使って有馬記念を予想してみた - Qiita

    日は12/24です。何の日か、みなさんお分かりですよね?🎅 そう、みんな大好き有馬記念の日です。🐎 ボートレースファンからはグランプリの優勝戦の日だろ!という主張もありそうですが、今回は数年ぶりに競馬予想ネタを書きたいと思います。 私自身、過去に2回、競馬予想をテーマにした記事を掲載してきました。 機械学習の初心者がpythonで競馬予測モデルを作ってみた 機械学習の初心者がpythonで有馬記念を予想してみた レースは相対評価で予想したい 過去記事では、ロジスティック回帰やランダムフォレスト等を使用してましたが、実は違和感を少々感じていました。それは、データセット全体から絶対評価で、購入対象馬を予測しているからになります。 ちょっと分かりにくいかもしれませんが、例として、以下のデータセットの場合、レース番号に関係なく、賞金の高い馬が購入対象になりやすいという傾向があります。 レース

    ランキング学習を使って有馬記念を予想してみた - Qiita
    sh19910711
    sh19910711 2024/04/29
    "LightGBM: 2種類のAPIが存在 + sklearnに馴染みがあるので、Scikit-learn API(LGBMRankerクラス)を使用 / NDCG: ランキング学習モデルの評価指標の一つ + 生成したランキングが真の並び順にどれだけ適合しているか" 2023
  • Target Encoding はなぜ有効なのか

    分析コンペLT会 https://kaggle-friends.connpass.com/event/154881/

    Target Encoding はなぜ有効なのか
    sh19910711
    sh19910711 2024/04/25
    "明らかに良いとわかっている情報は明示的にモデルに渡した方が良い / Target Encoding: カテゴリ変数を各水準における目的変数の期待値で置換 + モデルを単純化させるような効果 + 注意点や実装方法はKaggle本で確認" 2019
  • NGBoost論文読んでみた

    @ Connehito Marché vol.6 〜機械学習データ分析市〜

    NGBoost論文読んでみた
    sh19910711
    sh19910711 2024/04/25
    "NGBoost: 出力の不確実性(自信の無さ)を確率値として出力 + 今までのGBDTでは予測の値のみを出力 + Andrew Ng先生が共著者に入ってる / 学習率以外にさらにスケーリングファクターが必要" 2019
  • 回転をサボるAVL木を落とす - Qiita

    この記事では$N$を二分探索木中の要素数(ノード数)として以後断りなく用います。 今回はAVL木をsetのような平衡二分探索木として扱いますが、配列型(平衡二分木)として使ってもほとんど同じことがいえます。 前提知識 二分探索木について (分かってると嬉しい) : AVL木の平衡方法 正しい平衡 ノードの平衡係数は(左の子の高さ) $-$ (右の子の高さです)。 説明によっては一重回転をやるケースと二重回転をやるケースとを完全に別のものとして区別していますが、二重回転は一重回転を2回やってるだけで、かつその2回目が一重回転をやるケースの一重回転と一致するので以下のように実装することができます。 ノード$x$の平衡係数が2の場合 $x$の左の子の平衡係数が-1なら左の子を左回転 $x$を右回転 ノード$x$の平衡係数が-2の場合(上の全く左右対称) $x$の右の子の平衡係数が1なら右の子を右

    回転をサボるAVL木を落とす - Qiita
    sh19910711
    sh19910711 2024/04/23
    "AVL木: いろんなサボり方がある + 平衡係数の絶対値が2だったらいい感じの方向に1回転させて終わり / なんで二重回転するかを考えれば間違ってるのは明らかですが困ったことにこいつ適当なケースでは落ちません" 2020
  • 深層学習VS決定木:テーブルデータ分析の未来|PKSHA Delta

    深層学習の技術が著しく進歩した結果、コンピュータビジョンや自然言語処理、音声信号処理などの分野では深層学習モデルの性能が古典的な手法のを大きく上回っており、すでにスタンダードなアプローチになっています。 しかし、テーブルデータを扱うタスクにおいては、深層学習の有効性は明らかになっていません。記事では、AI Solution 事業部のアルゴリズムエンジニアよりテーブルデータにおける従来手法と深層学習の比較論文のご紹介をしていきます。 背景近年、テーブルデータを扱う深層学習モデルも登場し、一部の論文では決定木ベースのモデルと同等かそれ以上の性能を示しています。しかし、私が実務で試す中では決定木ベースのモデルの方が性能が高く、学習と推論が速く運用コストでも優れているため、深層学習モデル採用には至っていません。 より一般的なテーブルデータのタスクにおける、決定木ベースモデルと深層学習モデルとの性

    深層学習VS決定木:テーブルデータ分析の未来|PKSHA Delta
    sh19910711
    sh19910711 2024/03/08
    "テーブルデータのデータセットを用いて、決定木ベースモデルと深層学習モデルの性能比較 / 回転不変性: 特徴量に任意の回転行列をかけても同じ学習ができる / 大規模データセットでの実験はできなかった" arXiv:2207.08815