Python
scikit-learn
python3

Python3(scikit-learn)を使ってロジスティック回帰

こんにちは!
さて,みなさん,今回はscikit-learnを使ってロジスティック回帰したいと思います.

準備

サンプルコードを動かす上で予めいくつかモジュールを読み込んでおきます.

import pandas as pd
import numpy as np
from sklearn import linear_model
from sklearn.externals import joblib

機械学習

機械学習には様々な種類のものがあります.大きく分けると以下のように なります.

  • 教師あり学習
  • 教師なし学習
  • その他(強化学習など)

今回はロジスティック回帰を使うために簡単に教師あり学習について紹介したいと思います.

教師あり学習(回帰)

教師あり学習ではデータと正解ラベルの2つの情報が渡されます.
大量のデータから「このデータの正解はこのラベルであった」というパターンを見つけ出して,正解ラベルのないデータに対してもそれを予測するものになります.
教師あり学習はさらに正解ラベルの種類によって回帰と分類に分けられます.
回帰は,正解となる値が連続した数値となるものです.

よく見られる例として:
ビールの売り上げは気温に影響すると言われています.
この情報を元に実際の売り上げと気温のデータを利用して機械学習を行うことで、天気予報から得た翌日の気温から売り上げを予測することが可能になります.

学習

  • 学習のプロセスではまず,データの収集・前処理から始まります.機械学習は大量のデータからそのパターンを見つけ出すという処理を行うため,それに十分なデータを準備してやる必要があります.
  • 学習を行うに際しては,アルゴリズム選択・特徴選択・パラメータチューニングが主なプロセスとなります.
  • モデルを作成したら,学習を行ったモデルがどのくらいうまく予想できるのかを評価します.

予測

入力されたデータに対して学習時と同じように特徴抽出を行い,作成したモデルから予測値を求めます.

sckikit-learn

scikit-learn (旧称:scikits.learn) はPythonのオープンソース機械学習ライブラリ[2]である。サポートベクターマシン、ランダムフォレスト、Gradient Boosting、k近傍法、DBSCANなどを含む様々な分類、回帰、クラスタリングアルゴリズムを備えており、Pythonの数値計算ライブラリのNumPyとSciPyとやり取りするよう設計されている。

https://www.weblio.jp/content/scikit-learn

プログラム

学習用データ

excelを使ってランダムで20~100点まで100人のjapとengデータ作ります.
xに関しては,japとengの点数の平均は60点以上であれば1,そうでなければ0とします.

train.csv
image.png

テストデータ

以下の5人は0か1かを判断します.
image.png

コード

import pandas as pd
import numpy as np
from sklearn import linear_model
from sklearn.externals import joblib

def main():
    train = pd.read_csv("train.csv", sep=",") #(1)
    explanatory = train.loc[:, ['jap', 'eng']].values #(2)
    response = train['x'].values #(3)

    # 学習(ロジスティック回帰)
    clf = linear_model.LogisticRegression(random_state=0)
    clf.fit(explanatory, response)

    # ロジスティック回帰の学習結果
    regression_coefficient = clf.coef_
    segment = clf.intercept_
    print("回帰係数:{}".format(regression_coefficient))
    print("切片:{}".format(segment))
    print("決定係数:{}".format(clf.score(explanatory, response)))

    test = pd.read_csv("test.csv", sep=",") #(4)

    # 学習結果の検証(テスト用データjap, engを入力)
    x_test = test.loc[:, ['jap', 'eng']].values
    predict = clf.predict(x_test)

    print("検証結果:{}".format(predict)) #(5)
    joblib.dump(clf, 'train.learn') #(6)

if __name__ == "__main__":
    main()

コード解説

(1): 学習用のデータを読み込み(train.csv)
(2): 説明変数をjap, engと定義
(3): 目的変数をxと定義
(4): テスト用データの読み込み(test.csv)
(5): 検証結果の表示
(6): 学習結果を出力

実行結果は以下の図となります.

スクリーンショット 2018-10-05 17.12.05.png

結果を見てみるとテストデータの2行目は0となっています.点数の平均は41点となっています.これは正確に判断することができました.
テストデータの3行目は1となっていますが,点数の平均は57点となっています.60点以上であれば1だが検証結果は0となっています.これは正確に判断することができませんでした.

このように学習データによって正確に判断することができません.学習データの数をもっと増やすとより正確な判断結果を得られることができます.
是非色々試してください.

以上で,今回のPython3(scikit-learn)を使ってロジスティック回帰は以上で終わります.
読んでいただいてありがとうございます.