Scikit-learnで機械学習(ロジスティック回帰分析)

Scikit-learnで機械学習(ロジスティック回帰分析)

scikit-learnでロジスティック回帰分析を行う方法です。データは付属のbreast-cancer(乳がん診断)を利用します。

scikit-learnで、がん診断データをロジスティック回帰分析する


ロジスティック回帰は2値分類で利用され、予測結果を確立的に求めることができます。例えば迷惑メールを判別する場合、『スパムか非スパムか?スパムなら可能性はどれくらいか?』といった分析が可能です。

データセット読み込みと内容確認

始めにbreast-cancerデータセットの読み込んで、データの内容を確認します。

  • 乳がんデータセットの読み込む ...[1]
  • データセットdict_keysを確認する ...[2]
  • 説明変数の確認する (検査データなど30項目) ...[3]
  • データ総数の確認する(569件) ...[4]
  • 目的変数の内容を確認する(悪性0、良性1の2値データ) ...[5,6,7]

In [1]:
# breast_cancerデータ読み込み
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
In [2]:
# breast_cancerデータ確認(dict-keys)
cancer.keys()
Out[2]:
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
In [3]:
cancer.feature_names # 説明変数 30種類
Out[3]:
array(['mean radius', 'mean texture', 'mean perimeter', 'mean area',
       'mean smoothness', 'mean compactness', 'mean concavity',
       'mean concave points', 'mean symmetry', 'mean fractal dimension',
       'radius error', 'texture error', 'perimeter error', 'area error',
       'smoothness error', 'compactness error', 'concavity error',
       'concave points error', 'symmetry error', 'fractal dimension error',
       'worst radius', 'worst texture', 'worst perimeter', 'worst area',
       'worst smoothness', 'worst compactness', 'worst concavity',
       'worst concave points', 'worst symmetry', 'worst fractal dimension'], 
      dtype='<U23')
In [4]:
len(cancer.data) # データ数 569件
Out[4]:
569
In [5]:
cancer.target[:50] # 目的変数(先頭50件) 診断2値データ
Out[5]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
       1, 0, 1, 1])
In [6]:
cancer.target_names # 目的変数 診断2値の内容
# 0 : malignant(悪性)
# 1 : benign(良性)
Out[6]:
array(['malignant', 'benign'], 
      dtype='<U9')
In [7]:
# 診断の内訳
import numpy as np
malignant_count = len(np.where(cancer.target==0)[0])
benign_count = len(np.where(cancer.target==1)[0])
print('0:悪性', malignant_count)
print('1:良性', benign_count)
0:悪性 212
1:良性 357

ロジスティック回帰分析

今回はsklearnのLogisticRegressionを使って、ロジスティック回帰分析を行います。

  • データセットを読み込む ...[1]
  • 訓練データとテストデータに分割する(train_test_split利用) ...[2]
  • 分割後のデータ件数を確認する ...[3]
  • モデル作成と訓練データで学習を行う ...[4]
  • 学習精度の確認する ...[5]
  • テストデータを使った予測と精度検証する ...[6]
  • 確率変換用にシグモイド関数を定義する ...[7]
  • 分類予測の決定確率を求める ...[8]
  • 予測結果を表にして確認する(Pandas利用) ...[9]

In [1]:
# breast_cancerデータ読み込み
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
In [2]:
# Cancerデータを訓練データとテストデータ(20%)に分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
        cancer.data, cancer.target, test_size=0.2, random_state=0)
In [3]:
# 分割後のデータ件数
print('train = ', len(X_train))
print('test =', len(X_test))
train =  455
test = 114
In [4]:
# モデル作成
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression() # ロジスティック回帰

# 訓練データで学習
clf.fit(X_train, y_train)
Out[4]:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
          verbose=0, warm_start=False)
In [5]:
clf.score(X_train, y_train) # 学習精度
Out[5]:
0.95824175824175828
In [6]:
predict = clf.predict(X_test) # テストデータで予測
clf.score(X_test, y_test) # テストデータの精度
Out[6]:
0.95614035087719296
In [7]:
import numpy as np
# シグモイド関数定義
def sigmoid(x):
    return 1 / (1 + np.exp(-x)) # 0〜1.0

# シグモイド関数プロット
import matplotlib.pyplot as plt
plt.xkcd()
%matplotlib inline
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.xlabel('x')
plt.ylabel('sigmoid(x)')
plt.title('sigmoid function')
Out[7]:
<matplotlib.text.Text at 0xab8f9aac>
In [8]:
# 決定関数値(絶対値が大きいほど識別境界から離れている)
X_test_value = clf.decision_function(X_test) 
# 決定関数値をシグモイド関数で確立に変換
X_test_prob = sigmoid(X_test_value) 
In [9]:
# テストデータの予測結果(Pandasにデータを格納して確認)
import pandas as pd
pd.set_option("display.max_rows", 114)
cancer_test_df = pd.DataFrame(y_test, columns=['正解値'])
cancer_test_df['予測値'] =  pd.Series(predict)
cancer_test_df['正誤'] =  pd.Series(y_test == predict)
cancer_test_df['決定関数値'] =  pd.Series(X_test_value)
cancer_test_df['確率(良性)'] =  pd.Series(X_test_prob).round(4)
cancer_test_df
Out[9]:
正解値 予測値 正誤 決定関数値 確率(良性)
0 0 0 True -4.831073 0.0079
1 1 1 True 3.458194 0.9695
2 1 1 True 6.145569 0.9979
3 1 1 True 1.482717 0.8150
4 1 1 True 9.436407 0.9999
5 1 1 True 5.825855 0.9971
6 1 1 True 4.941362 0.9929
7 1 1 True 6.402833 0.9983
8 1 1 True 3.313461 0.9649
9 1 1 True 8.472658 0.9998
10 1 1 True 0.456056 0.6121
11 1 1 True 1.671426 0.8418
12 1 1 True 5.526581 0.9960
13 1 0 False -1.198957 0.2317
14 1 1 True 1.400018 0.8022
15 0 0 True -4.703003 0.0090
16 1 1 True 4.187072 0.9850
17 0 0 True -20.248822 0.0000
18 0 0 True -6.465239 0.0016
19 0 0 True -26.662799 0.0000
20 0 0 True -10.293131 0.0000
21 0 0 True -2.290170 0.0919
22 1 1 True 6.392087 0.9983
23 1 1 True 4.488629 0.9889
24 0 0 True -4.939831 0.0071
25 1 1 True 4.534959 0.9894
26 1 1 True 6.256579 0.9981
27 0 0 True -1.475127 0.1862
28 1 1 True 5.715576 0.9967
29 0 0 True -23.994885 0.0000
30 1 1 True 7.923303 0.9996
31 0 0 True -17.774420 0.0000
32 1 1 True 0.571305 0.6391
33 0 0 True -7.501074 0.0006
34 1 1 True 8.555391 0.9998
35 0 0 True -6.508835 0.0015
36 1 1 True 2.481600 0.9228
37 0 0 True -13.169308 0.0000
38 1 1 True 5.436744 0.9957
39 0 0 True -7.952584 0.0004
40 0 0 True -2.841012 0.0551
41 1 1 True 5.432936 0.9956
42 0 0 True -6.166577 0.0021
43 1 1 True 7.025527 0.9991
44 1 0 False -2.608861 0.0686
45 0 0 True -27.679416 0.0000
46 1 1 True 8.097433 0.9997
47 1 1 True 3.522806 0.9713
48 1 1 True 6.718483 0.9988
49 0 0 True -7.974355 0.0003
50 0 0 True -12.471239 0.0000
51 0 0 True -0.646213 0.3438
52 0 0 True -14.751733 0.0000
53 1 1 True 5.436355 0.9957
54 1 1 True 4.768045 0.9916
55 1 1 True 6.965789 0.9991
56 1 1 True 4.208574 0.9854
57 1 1 True 3.743477 0.9769
58 1 1 True 4.051534 0.9829
59 0 0 True -38.443462 0.0000
60 0 0 True -4.192715 0.0149
61 0 0 True -9.845033 0.0001
62 1 1 True 6.151435 0.9979
63 1 1 True 5.339841 0.9952
64 0 0 True -16.429358 0.0000
65 1 1 True 2.070484 0.8880
66 0 0 True -41.257041 0.0000
67 0 0 True -11.995710 0.0000
68 0 0 True -17.526643 0.0000
69 1 1 True 4.584729 0.9899
70 1 0 False -0.284425 0.4294
71 0 0 True -11.652084 0.0000
72 1 1 True 5.894476 0.9973
73 0 1 False 1.746193 0.8515
74 0 0 True -13.604827 0.0000
75 1 1 True 3.628328 0.9741
76 1 1 True 5.942246 0.9974
77 1 1 True 4.924717 0.9928
78 1 1 True 5.219485 0.9946
79 1 1 True 4.995772 0.9933
80 0 0 True -6.457413 0.0016
81 0 0 True -21.533913 0.0000
82 0 0 True -11.464893 0.0000
83 1 1 True 7.989426 0.9997
84 0 0 True -2.756071 0.0597
85 1 1 True 7.205670 0.9993
86 1 1 True 5.813506 0.9970
87 1 1 True 6.368981 0.9983
88 0 0 True -11.098643 0.0000
89 0 0 True -24.913642 0.0000
90 1 1 True 8.083669 0.9997
91 0 0 True -1.193081 0.2327
92 1 0 False -0.540146 0.3682
93 0 0 True -8.234561 0.0003
94 1 1 True 4.156628 0.9846
95 1 1 True 4.433426 0.9883
96 0 0 True -34.739126 0.0000
97 1 1 True 1.483296 0.8151
98 1 1 True 3.466770 0.9697
99 1 1 True 4.618971 0.9902
100 1 1 True 6.517871 0.9985
101 1 1 True 5.255699 0.9948
102 1 1 True 4.979328 0.9932
103 1 1 True 2.162808 0.8969
104 0 0 True -15.939356 0.0000
105 1 1 True 6.335435 0.9982
106 0 0 True -10.237512 0.0000
107 1 1 True 1.667300 0.8412
108 0 0 True -1.586654 0.1699
109 0 0 True -1.365127 0.2034
110 1 1 True 3.936559 0.9809
111 0 0 True -7.545987 0.0005
112 0 0 True -11.739812 0.0000
113 1 1 True 2.061804 0.8871

ガン診断データを使ったロジスティック回帰分析は以上です。



スポンサーリンク

0 件のコメント :

コメントを投稿