まずは公式のチュートリアルの内容を理解するところから始めてみる。
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]