LightGBMのチュートリアルを読み解く(入力データ)

LightGBM
この記事は約5分で読めます。
スポンサーリンク

まずは公式のチュートリアルの内容を理解するところから始めてみる。
Python-package Introduction

データ形式

LightGBMで使用できるデータ形式は4種類。一般的にはNumpy形式を使用することがほとんどだと思います。データはDatasetオブジェクトとして保持されます。

LibSVM (zero-based) / TSV / CSV format text file
NumPy 2D array(s), pandas DataFrame, H2O DataTable’s Frame, SciPy sparse matrix
LightGBM binary file
LightGBM Sequence object(s)

numpyでのデータ読み込みはサンプルでは以下のようになります。
lgbのデータセットとして読み込む場合、「データ」と「ラベル」の2つを引数として指定しています。

import numpy as np
import lightgbm as lgb

data = np.random.rand(500, 10)
label = np.random.randint(2, size=500)
train_data = lgb.Dataset(data, label=label)

lightgbm.Dataset

データ読み込み部分の引数を確認してみます。
lightgbm.Dataset

と思ったんですが、データとラベルはチュートリアルと同じことしか書いてない・・・・
「data」に指定するのは学習/予測を行う「元データ」になります。
「data」に指定したデータセットを使用して予測していく形になります。

「ラベル」に指定するのは「data」の結果です。
「data」の値に対する答えと言ってもいいでしょう。
サンプルでは「data」について500×10の1データを用意しています。
10個のデータを持った500種類のデータとなります。
それに対して500個の答えを用意しています。

データセットの内容を確認してみます。
データを表示する方法が見つからなかったけど、表示できないのかな?

データセットの内容確認する場合は「construct」を実行しないとエラーになります。
「ラベル」の一覧とデータの次元取得ができました。

train_data.construct()
print(train_data.get_label())
print(train_data.num_data())
print(train_data.num_feature())
------------------------------------------------------------------
[0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 0 1
 1 1 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0 0
 1 1 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 1
 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 0 0
 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0
 1 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1
 0 0 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1
 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 1
 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1
 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1
 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
 0 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0
 1 0 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1
 1 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0]
500
10

グループの塊を指定する

デフォルトだと、1行が1データとして扱われます。
ただ、複数のデータを1つの塊として扱いたい場合があります。
例えば、ボートレースの分析する場合は1レースで6艇が走るので6艇のデータ(6行のデータ)を1つの塊として扱いたいですよね。

その場合は「group」を使います。
groupはデータの塊を「配列」として指定していく形になります。
例えば、データを10個ずつの塊にしたい場合はgroupの値として[10,10,10,10,10,10」という形で指定します。
「10」を指定して繰り返し10個ずつの塊にしてくれればもっと楽なんですが、LigthGBMとしては塊の指定を全部指定する必要があります。

サンプルだと500のデータがありますが、これを100個の塊として扱う場合、このように100を5回指定する必要があります。

data = np.random.rand(500, 10)
label = np.random.randint(2, size=500)
train_data = lgb.Dataset(data, label=label,group=[100,100,100,100,100])

train_data.construct()
print(train_data.get_group())
--------------------------------
[100, 100, 100, 100, 100]

タイトルとURLをコピーしました