はじめに
本記事ではデータ分析コンペでよく使用される手法であるlightgbmによる分析を行っていく。
またlightgbmによる分析が本記事の目的であるため特徴量の生成・選定などは行っていませんのでご了承ください。
使用されるデータについてはSIGNATEに記載されている【練習問題】ガラスの分類(https://signate.jp/competitions/125)をしようしております。
ライブラリのインポート
1 2 3 4 5 6 |
import pandas as pd from sklearn.model_selection import train_test_split import lightgbm as lgb from sklearn.metrics import precision_score from sklearn.metrics import recall_score from sklearn.metrics import f1_score |
1行目についてはファイルの読み込みを行うたっめのライブラリ、2~3行目についてはデータを分割するためのライブラリとlightgbmを使用するためのライブラリ、4~6行目については本分析の評価を行うためのライブラリとなっております。
データの読み込み・確認
1 2 |
df = pd.read_table('./data/train.tsv') df.head() |
データの分割
1 2 3 |
x = df[["RI", "Na", "Mg", "Al", "Si", "K", "Ca", "Ba", "Fe"]] y = df["Type"] X_train, X_test, Y_train, Y_test = train_test_split(x, y, random_state=0) |
今回はxの値として、RI, Na, Mg, Al, Si, K, Ca, Ba, Feの値をすべて用います。yの値は分類の対象となるTypeを用います。
モデル構築と予測
1 2 3 |
lgbm = lgb.LGBMClassifier() lgbm.fit(X_train, Y_train) Y_pred = lgbm.predict(X_test) |
モデルの評価
1 2 3 4 |
print(f"正解率:{accuracy_score(Y_test,Y_pred)}") print(f"適合率:{precision_score(Y_test,Y_pred, average=None)}") print(f"再現率:{recall_score(Y_test,Y_pred, average=None)}") print(f"F1値:{f1_score(Y_test,Y_pred, average=None)}") |
1 2 3 4 |
正解率:0.7777777777777778 適合率:[0.9, 0.66666667, 1.0, 10., 0.5] 再現率:[0.81818182, 0.8, 0.5, 0.66666667, 1.0] F1値:[0.85714286, 0.72727273, 0.66666667, 0.8, 0.66666667] |
本記事では本モデルの評価方法として正解率, 適合率, 再現率, F1値を用いさせていただいています。
提出用ファイルの作成
1 2 3 4 5 6 |
df_test = pd.read_table('./data/test.tsv') x_test = df_test[["RI", "Na", "Mg", "Al", "Si", "K", "Ca", "Ba", "Fe"]] pred = lgbm.predict(x_test) df_test["Type"] = pred df_test["id"] = df_test["Unnamed: 0"] df_test[["id", "Type"]].to_csv("submit_test_lgbm.csv", header=False, index=False) |
提出ファイルを提出したところ
0.5887850と非常に正解率の低い結果となりました。評価時の正解率よりも大きく正解率が低かった原因としてはxの値にすべての値を用いてしまったため過学習が起きてしまっているためだと考えられます。