スポンサーリンク

ロジスティック回帰で2値分類する方法

Python

機械学習で分類をやってみたいけど、
何から勉強したらいいかわからない。。。

という方は、ロジスティック回帰からやってみましょう。
簡単に実装できるので初心者におすすめです。

データセット

そもそも使えるデータを持ってない。。。

という人はscikit-learnのデータを使いましょう。
Pythonの実行環境がない場合は、Google Colaboratoryを使うと良いです。
>>Google Colaboratoryの使い方

import pandas as pd
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()
df = pd.DataFrame(data["data"], columns = data["feature_names"])
df["target"] = data["target"]
df
load_breast_cancerのデータ

targetが予測したいデータです。01で分類されています。
これは医療系のデータセットで、0だと陰性、1だと陽性です。

import matplotlib.pyplot as plt

c = "mean perimeter"
plt.hist(df.loc[df.target == 0, c], label = "label_0", alpha = 0.75)
plt.hist(df.loc[df.target == 1, c], label = "label_1", alpha = 0.75)
plt.legend()
plt.show()

こんな感じで、01ごとに特徴(列)の分布が異なっています。
なので、各列の特徴を学習させて、targetが0か1かを予測させましょう。

データ分割

データを学習用と検証用にわけましょう。
モデルの精度を検証する場合は、学習時に答えを教えていないものを使います。

from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size = 0.1)
print(train.shape, test.shape)

# ========== output ==========
# (512, 31) (57, 31)

train_test_splitで分割できます。
test_sizeを0.1にすると1割が検証用(test)になります。

features = [c for c in df.columns if c != "target"]
print(features)

#学習用データ
X_train = train[features]
y_train = train["target"].values

#検証用データ
X_test = test[features]
y_test = test["target"].values

print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

# ========== output ==========
# ['mean radius', 'mean texture', 'mean perimeter', 'mean area', ...
# (512, 30) (512,)
# (57, 30) (57,)
X_train: 学習に使う特徴
y_train: 教える答え
X_test: 検証に使う特徴
y_test: 教えない答え

モデル作成

学習

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

これだけで学習が実行できます。
簡単ですね。

検証

preds = model.predict_proba(X_train)
print(preds[:5])

# ========== output ==========
# [[9.99999933e-01 6.69413576e-08]
#  [9.36861079e-01 6.31389208e-02]
#  [2.14735561e-03 9.97852644e-01]
#  [9.28606720e-03 9.90713933e-01]
#  [1.33766714e-02 9.86623329e-01]]

predict_probaで予測ができます。
出力は確率になっていて、1列目(左)がラベル0である確率、
2列目(右)がラベル1である確率です。

これだけだとわかりにくいので、図示してみましょう。

preds = model.predict_proba(X_train)
train["prob"] = preds[:, 1]#ラベル1になる確率
plt.hist(train.loc[train.target == 0, "prob"], label = "label_0", alpha = 0.75)
plt.hist(train.loc[train.target == 1, "prob"], label = "label_1", alpha = 0.75)
plt.legend()
plt.show()

青色がラベル0のデータ、橙色がラベル1のデータです。
だいたいそれぞれのラベルに近い位置に分布していますね。

ただし、モデルの精度を確かめる場合は検証データで計算しましょう。
学習データだとすでに答えを知っているからです。

preds = model.predict_proba(X_test)
test["prob"] = preds[:, 1]
plt.hist(test.loc[test.target == 0, "prob"], label = "label_0", alpha = 0.75)
plt.hist(test.loc[test.target == 1, "prob"], label = "label_1", alpha = 0.75)
plt.legend()
plt.show()

検証データでもいい感じに分類できてそうですね。
ヒストグラムだけではわかりにくいので、正解率も計算してみましょう。

from sklearn.metrics import accuracy_score
score = accuracy_score(y_test, preds[:, 1] > 0.5)
print(score)

# ========== output ==========
# 0.9473684210526315

正解率は94.7%でした。
簡単に分類できるデータなので精度も良かったですね。

まとめ

今回は初心者向けに、ロジスティック回帰の分類モデルを作る方法を解説しました。
fitだけで学習してくれるので意外と簡単にできますね。
ちょっと難しめのモデルに挑戦したい人はLightGBMがおすすめです。

コメント

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