Scikit-learnを使ってロジスティック回帰分析をしてみました


Webエンジニアなのでデータ分析の経験はないのですが、業務上で関わったデータサイエンティストから手軽に試せるとの噂をきいたので、機械学習ライブラリscikit-learnを使ってロジスティック回帰分析をしてみました。
今回はscikit-learnに付属しているサンプルデータを使って簡単な動作確認をしています。




*Scikit-learn(サイキット・ラーン)とは

Google製のOSSで、Pythonの代表的な機械学習ライブラリです。誰でも無料で使うことができます。実装が手軽なことやサンプルデータが付属していることもあり、初学者でも試しやすいライブラリとなっています。


*ロジスティック回帰分析とは

一般化線形モデルともいい、Yes/No の2値分類で確率を出す手法のことです。
ビジネスではリスク予測や、キャンペーン施策に対しての顧客の反応有無、病気の発症予測などに使われることが多いようです。


*環境

  • MacOS
  • Python 3.6.3
  • matplotlib 3.1.1
  • numpy 1.17.0
  • Pillow 6.1.0
  • pip 19.2.1
  • scikit-learn 0.21.2
  • scipy 1.3.0
  • setuptools 41.0.1
  • seaborn 0.9.0


*参考



*環境構築

任意のディレクトリ配下に仮想環境を構築します。
$ python3 -m venv env
$ source env/bin/activate

(env) $ python -V
Python 3.6.3

機械学習に必要なライブラリをインストールします。
pandasは最新バージョンだと実装時にimportでエラーになってしまったので、古いバージョンを指定してインストールしています。
$ pip install --upgrade pip
$ pip install --upgrade setuptools
$ pip install numpy
$ pip install scipy
$ pip install scikit-learn
$ pip install matplotlib
$ pip install Pillow
$ pip install pandas==0.24.2
$ pip install jupyter
$ pip install seaborn

下記コマンドを実行し、Jupyter を起動します。
ここから先は、Jupyter でコードを実行しています。
$ jupyter notebook


*データの前処理

機械学習に必要なライブラリをインポートします。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression as LR

CSVからデータを取得する場合はread_csv()を使いますが、今回はscikit-learnに用意されている癌の判定を行うサンプルデータを使います。
# CSVデータ取得
# data = pd.read_csv("test.csv", sep=",")

# サンプルデータの取得
cancer = datasets.load_breast_cancer()

サンプルデータから説明変数を取得します。
予測に影響を与える要因を説明変数とよびます。説明変数に対して、予測結果となる目的変数を1つ定める必要があります。
dataX = pd.DataFrame(cancer.data, columns= cancer.feature_names)

# 先頭5行を表示
dataX.head()












サンプルデータから目的変数を取得します。
dataY = pd.DataFrame(cancer.target)
dataY.head()










カラム名が「0」になっているので「judge」に変更します。
dataY = dataY.rename(columns={0: 'judge'})
dataY.head()











欠損値を確認します。
今回は欠損値はありませんでしたが、値がないと正確な結果が出ないので 0 などに置き換えます。
data.isnull().sum()



















値の種類を確認します。細かすぎる場合は集約します。
dataY['judge'].unique()






他にも必要であれば新しいカラムを追加したりといった処理をして、正確な分析結果がでるようなデータにします。


*グラフ描画

グラフ描画をして、影響を与えている要素を調べていきます。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
sns.set_context("paper")
plt.figure(figsize=(10,6))
%matplotlib inline

dataX['judge'] = dataY
sns.countplot(
    'judge',
    data=dataX, palette='coolwarm')














*モデルの作成/実行

scikit-learnに用意されているtrain_test_split()を使って、学習データとテストデータに分割します。
今回は 8割のデータで学習させ、2割の検証データを適用させて結果を確認するようにしています。
random_stateを指定しないと、実行するたびに結果が変わってしまいます。
X_train, X_test, y_train, y_test = train_test_split(
        dataX, dataY, random_state=1234)

モデルを作成し、学習させます。
clf = LR()
clf.fit(X_train, y_train)







*結果の確認

確率を評価します。
# 評価(確率)
df = pd.DataFrame(clf.predict_proba(X_test))
df = df.rename(columns={0: 'NG', 1: 'OK'})
df.head()











判定を評価します。
df = pd.DataFrame(clf.predict(X_test))
df = df.rename(columns={0: 'judge'})
df.head()










正答率を出します。
clf.score(X_test, y_test)







*所感

予測の実行は簡単にできるのですが、前提知識がなさすぎたので分析手法や専門用語を調べることに時間がかかりました。データサイエンティストからデータの準備が大変という話は聞いていたのですが、自分で実際に触ってみて大変さを実感することができました。今回は取り急ぎ動かしてみただけですが、本来であればチューニングをして予測の精度を上げる必要があるかと思うので、地道な作業が必要そうです。
実装よりも予測した結果をどう使うかに興味があるので、そういったことについても勉強しておこうと思います。

Previous
Next Post »

人気の投稿