パーセプトロン・ロジスティック回帰の実践 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]

 

チャイナスタディーツアー@上海(第5回)

11/18 Fri. ~11/20 Sun.で弾丸上海スタディーツアー


管理人の強力な中国ネットワークで現地の友人に上海を案内してもらうという日本人だけでは中々味わえない旅が実現できました。

本場の人に中国を学ぶ、この勉強会グループならではの強みです。

■1日目

マグレブで上海市街まで移動。

東方明珠にて観光。ガスっててあまり遠くまで見渡せません。

空気が悪い日には行かない方が良さそうです。笑

 

夜は、現地の友人の紹介で、翡翠酒家@新天地にて上海料理を楽しみました。

牛、豚、鳥、海鮮まで、一通り楽しめる清潔感のある高級レストランでした。

味は甘めでしたが、上海の味付けだそうです。日本人には馴染みやすい味だと思います。

 

Ubarでタクシーを呼びつけて外灘まで移動しました。

上海ではUbarが浸透しているようで、スマートに配車を済ませていました。日本ではタクシー業界が強い反発をしているようですが、大きな需要があるように感じます

外灘のバーで一杯。外灘ともなると一杯1000円overです。

貞淑なイメージの強い中国人女性ですが、上海女性は一人でもバーにきて外国人に声をかけられるのを待っている人もいるそうです、、

 

◆2日目

蘇州~山塘街~

上海から鉄道で30分程度で行ける蘇州は日本人にも人気の観光地です。

山塘街は観光用側の通りと、住人の生活圏側の通りが隣接しています。

ランチ@松鶴楼

観光地ど真ん中にある老舗松鶴楼。リーズナブルにおいしい料理が楽しめます。写真付きのメニューがあり日本人にも行きやすい店です。

松鼠桂魚という、魚料理が有名なお店です、が、魚料理は頼まず、、笑

 

夜は上海に戻り、現地のテレビ局に勤める日本語が堪能な現地の方(管理人の友人の友人)と日中のイメージ・長所短所について議論をしました。

ただのディスカッションではなく、ブレインストーミングなどの発想法を実践し学びながら議論をしています。

社会人になってからこのように国外の方と議論できる環境があるのはこのグループの強みだとおもいます。(感謝)

 

 

◆3日目

遇到你要的時光での茶会

宝慶路にある中国茶専門店に案内してもらいました。非常におしゃれな外観です。

これぞ中国的な女性(らしいです)に本場のお茶を入れてもらいます。

茶菓子とフルーツのセットをいただきました。

中華料理を楽しむ旅もいいですが、最後に心も胃も休めるのにちょうどよい場所です。中国文化を楽しむなら、観光の選択肢として大いにありだと思います。

 

今後も規模を拡大して、チャイナスタディーツアーfrom愛知を継続していきます。(参加者募集中!)

 

<スケジュール>

交通手段 日付 From (場所・時間) To(場所・時間) 金額
日本航空 883 2016/11/18 NGO 9:00 PVG 11:05  26,570 円
 日本航空 884 2016/11/20 PVG 17:30 NGO 20:55

<宿泊先>

Jin Jiang Pacific Hotel(6000円/人・日)

新春ランニング

年明けにランニングに行ってまいりました。自然豊かなコースでしたので、紹介します。


このコースを往復してきました。


6時半ごろに健康の森(スタート地点)に到着。まだだいぶ暗くて寒いです。


ゴール周辺。コースの途中で写真を撮るのを忘れていましたが、だいぶ自然豊かです。


光芒という現象でしょうか。なんかきれいです。

往復のランニング終了後には関節が痛くてたまらなかったですが、
このランニングコースのいいところの一つは近所にいい温泉があること。
体の痛みも温泉のおかげでかなりよくなりました。

※注意点
タクシーとかあまり走っていないので、途中で脱落することが難しいコースです。体力に自信のある方にお勧め!

中国旅行の心得

你好。半分中国人みたいな運営者が中国に旅行へ行く際の準備を以下にまとめました。中国に行かれる際はどうぞご覧ください。

<準備一覧>
航空券の手配(いつもExpediaを使っています。)
ホテルの手配(いつもBooking.comを使っています。)
海外旅行保険の申し込みいつもAIUを使っています。)
持ち物の準備(次章を参照ください)

<持ち物一覧>
パスポート
航空券
現金
クレジットカード
海外旅行保険
顔写真(パスポートサイズ)
パスポートのコピー
ホテルの予約票
着替え
洗面具
ポケットティッシュ
タオル
ビニール袋
携帯電話
メモ
ペン
ガイドブック
辞書
充電器
コンセントプラグ変換器
折り畳み傘
緊急連絡先(保険会社、カード会社、勤務先、中国での滞在先)
マスク

<留意点>
国際電話:日本の国番号は+86
中国の電圧:220V
中国の電流:交流50Hz
中国のプラグタイプ:CorO
水道水の飲用は控え、ミネラルウォーターを購入したほうがよい
15日以内の滞在はビザ不要
パスポートは残存期間が6か月以上必要
パスポートの余白2ページ以上必要
外国人は自動車の運転はしにくいらしい
消費税は有りません。
ホテル15%のチャージ料が発生する可能性があります
トイレットペーパーの持参が必要(備え付けていないところも多い)
紙を流さない(配管が細く、詰まってしまいます。)
中国内で使えないWEBサービスが多いので、友人との連絡用にWe chatというスマホアプリを事前にインストールしておくこと。

<最後に>
魅力多い国、中国を存分に楽しむためにも、しっかりと準備をして旅行に望みましょう!

異文化交流 ~アメリカンバー~

ホームパーティの記録です。

学習活動の合間に息抜き・交流の場として月1ペースで開催しているホームパーティ企画。パーティの主催者が思うままにテーマを決めて開催しています。

今回は「アメリカンバー」

 

アメリカ生まれの筆者が如何にもアメリカンな食べ物と酒、音楽を提供。

<メニュー>

・Budweiser

・IceWine(寒地で育てられたブドウで造ったお酒。寒さに耐えたブドウはすごく甘いです。)

・pizza/lasagna(ラザニア)/Spanish-style garlic shrimp(要はアヒージョ、アメリカじゃない笑)

ラザニアは餃子の皮で作れます。しかも魚焼きグリルでできるので、オーブン不要、おすすめです。(参考:https://cookpad.com/recipe/3960950)

乾杯の様子、手元が手で隠れている、、