パーセプトロン・ロジスティック回帰の実践 Python 機械学習 Scikit-learn

Python 標準機械学習ツールであるScikit-learnを用いて、動脈硬化症の発症予測をします。今回もサンプルコードをコピペでとりあえず動かせるようにしています。

※Pythonの導入方法はhttp://costudyinfodatabase.nagoya/2017/01/05/%e3%81%82-2/

元となるデータ(※)は、「動脈硬化症の発生有無」「脂質異常スコア」「性別」「年齢」から構成されます。動脈硬化症の発生有無が目的変数(結果)で、それ以外が説明変数(入力値・特徴量)です。

本データを用いて、パーセプトロンとロジスティック回帰を用いて学習を行い、テストデータの入力に対して動脈硬化の有無を予測し、正答率を見てみましょう。

※出典:http://www.snap-tck.com/room04/c01/stat/stat99/stat0206.pdf

No 動脈硬化症(0=あり) 脂質異常スコア 性(0=男) 年齢
1 0 0 0 36
2 0 0 0 55
3 0 0 1 27
4 0 0 1 42
5 0 1 0 35
6 0 1 0 39
7 0 1 0 41
8 0 1 0 45
9 0 1 1 32
10 0 1 1 42
11 0 1 1 51
12 0 1 1 53
13 0 2 0 43
14 0 2 0 47
15 0 2 1 52
16 1 1 0 46
17 1 1 1 24
18 1 1 1 38
19 1 1 1 58
20 1 2 0 21
21 1 2 0 30
22 1 2 0 37
23 1 2 1 24
24 1 2 1 56
25 1 2 1 58

 

サンプルコード

CSVデータからデータを抽出し、パーセプトロンとロジスティック回帰でトレーニングを行うプログラムです。

ロジスティック回帰では、ある特徴量(X)に対して結果(Y)が2値(0または1)に分類されるときに有効な手法です。

「1」となる事象(正事象)の確率をpとし、あるデータの確率pが0.5を下回るなら「0」、上回るなら「1」に分類します。確率pが適切な予測となるように重みwnを探ります。

今回は以下の流れで実行していきます。

手順

  • Step1 CSVデータをインポートし、トレーニング用データセットと、トレーニング結果検証用データセットに切り分け分けます。※CSVデータは自分で作成してみてください。
  • Step2 トレーニング用にデータの標準化を行います。
  • Step3 Perceptron / Logistic Regression(ロジスティック回帰)各々の手法について、誤分類率を表示します。
  • Step4 Logistic回帰による各データの確率をライブラリを用いて示します。それが上記式から計算した確率に等しいことを確認します。

 

 

import numpy as np

 

##csv resd using numpy

csvdata1=np.loadtxt("Arteriosclerosis.csv",delimiter=",")

 

X1=csvdata1[:,2] #Lipid abnormality score

X2=csvdata1[:,3] #sex

X3=csvdata1[:,4] #age

Y=csvdata1[:,1] #Arteriosclerosis

X=np.c_[X1,X2,X3] #to match the shape of fitting function's iput

 

#==============================================================================

from sklearn.linear_model import LogisticRegression

from distutils.version import LooseVersion as Version

from sklearn import __version__ as sklearn_version

from sklearn.metrics import accuracy_score

 

 

if Version(sklearn_version) < '0.18':

from sklearn.cross_validation import train_test_split

else:

from sklearn.model_selection import train_test_split

 

##Split the data into trainning data and test data at a certain ratio(with shuffuling the data)

X_train, X_test, Y_train, Y_test = train_test_split(

X, Y, test_size=0.2, random_state=0)

 

print('Expected value:',Y_test)

print('------------------------------------------------------')

 

from sklearn.preprocessing import StandardScaler

 

sc = StandardScaler()

sc.fit(X_train)

X_train_std = sc.transform(X_train)

X_test_std = sc.transform(X_test)

 

# perceptron

from sklearn.linear_model import Perceptron

 

ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)

ppn.fit(X_train_std, Y_train)

 

#print("shape of y_test",Y_test.shape)

 

y_pred_perceptron = ppn.predict(X_test_std)

print('Classified by perceptron:',y_pred_perceptron)

print('Misclassified samples: %d' % (Y_test != y_pred_perceptron).sum())

print('Accuracy of Perceptron: %.2f' % accuracy_score(Y_test, y_pred_perceptron))

print('Bias:',ppn.intercept_)

print('Weights after fitting:',ppn.coef_)

print('------------------------------------------------------')

 

 

#Logistic Regression

lr = LogisticRegression(C=1000.0, random_state=0)

lr.fit(X_train_std, Y_train)

y_pred_lr=lr.predict(X_test_std)

print('Classified by Logistic Regression:',y_pred_lr)

print('Misclassified samples: %d' % (Y_test != y_pred_lr).sum())

print('Bias:',lr.intercept_)

print('Weights after fitting:',lr.coef_)

print('Accuracy of Logistic Regression: %.2f' % accuracy_score(Y_test, y_pred_lr))

 

##additional This is to see the probability calculated based on the relation

## equals to the probability calculated in the library

print('probability p,1-p of all test data:\n',lr.predict_proba(X_test_std))

print('probability p of the 1st test datum',(1 / (1 + np.exp(np.dot(X_test_std,-lr.coef_.T) -lr.intercept_)))[0])

 

実行結果

以下のような結果となるはずです。いかがでしょうか?この場合正答率は80%となります。

 

Expected value: [ 0.  0.  1.  1.  0.]——————————————————

Classified by perceptron: [ 0.  0.  1.  0.  0.]

Misclassified samples: 1

Accuracy of Perceptron: 0.80

Bias: [-0.1]

Weights after fitting: [[ 0.17902872 -0.1         0.01490374]]

——————————————————

Classified by Logistic Regression: [ 0.  0.  1.  0.  0.]

Misclassified samples: 1

Bias: [-0.58884717]

Weights after fitting: [[ 1.15017829  0.5128515  -0.11998034]]

Accuracy of Logistic Regression: 0.80

probability p,1-p of all test data:

[[ 0.81112387  0.18887613]

[ 0.87276998  0.12723002]

[ 0.39654165  0.60345835]

[ 0.55972308  0.44027692]

[ 0.64804161  0.35195839]]

probability p of the 1st test datum [ 0.18887613]