第8章 そのほかのアルゴリズム
1 ロジスティック回帰
ロジスティック回帰は回帰式を分類に応用したものです。回帰と付いていますが、分類に使用するものです。各結果について予測する回帰式を組み立て確率を出して分類を行います。
あやめの分析で行ってみます。other.ipynbに記述します。
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv("iris.csv")
x = df[["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]
y = df["Name"]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)
# ロジスティック回帰
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=1000)
model.fit(x_train, y_train)
model.score(x_test,y_test)
予測はpredictで可能です。
model.predict([[5.5, 3.8, 1.9, 1.2]])
ロジスティック回帰は各種類になる確率で答えを出すので、各種類別の確率を表示することが出来ます。データフレームに入れて分かりやすく出してみます。
result = model.predict_proba([[5.5, 3.8, 1.9, 1.2]])
pd.DataFrame(result, columns=model.classes_)
ロジスティック回帰では、通常の回帰分析と同じく、係数と切片が表示できます。係数の表示は通常の回帰分析と同じです。
model.coef_
あやめの場合、3種類ありますので種類毎に係数が表示されます。各種類にどのような特徴があるかが分かります。分かりやすくするためデータフレームで表示してみます。
pd.DataFrame(model.coef_, columns=x_train.columns, index=model.classes_)
なお、回帰式であるため、特徴量に差がある場合、標準化が必要です。
2 LightGBM
LightGBM は勾配ブースティング(Gradient Boosting)のアルゴリズムです。決定木を多数作成し、前の決定木を元により正解率が高まるように進化させます。その投票で決定しますが、投票には重み付けをし、より正解率が高い木ほど投票数が多くなります。LightGBMはデータに欠損があってもそのまま使用できます。
LightGBMを使うには別途インストールが必要です。なお、LightGBMはMicrosoftが開発しています。
pip install lightgbm
使い方は2種類あり、一つはscikit-learn APIと呼ばれ、scikit-learnと同じように使うことが出来ます。 通常通り、データを訓練用とテスト用に分割します。
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv("iris.csv")
x = df[["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]
y = df["Name"]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state=0)
インポートし、学習・実行します。
import lightgbm as lgb
model = lgb.LGBMClassifier(verbose=-1,random_state=0)
model.fit(x_train, y_train)
model.score(x_test, y_test)
なお、LightGBMは決定木ですので、ランダムフォレスト同様にmax_depth(階層の深さ)とn_estimators(決定木の数)を指定できます。それ以外にも、さまざまなパラメータが有り、それをどのように指定するかが重要です。num_leaves(葉の数。初期値:31)、min_data_in_leaf(葉に含まれる最小データ数。初期値:20)などがあります。
import lightgbm as lgb
model = lgb.LGBMClassifier(max_depth=7, num_leaves = 200 ,
min_data_in_leaf= 20, n_estimators=200,
verbose=-1,random_state=0)
model.fit(x_train, y_train)
model.score(x_test, y_test)
決定木ですので特徴量の重要度を表示できます。グラフで表示する機能があります。
lgb.plot_importance(model)