機械学習-癌の識別 (プログラム)
機械学習の教師あり学習のサンプルとして簡単なデータでロジスティク回帰を試してみます。sklearnでは練習用として予め569人分のデータがあり、凹み,凹点,対称性等の30個の属性データに対して、悪性、良性のどちらに属するかの正解データを持っています。この練習用のデータを機械学習用284人分、残りの285人分を評価用として分割し推定を行います。その後、推定した結果と予め用意していた正解データを突き合わせて正答率を表示するプログラムを作成します。
使用するデータ
全データ :569件 (学習用:284件、評価用:285件)
属性データ:凹み,凹点,対称性等の10個 × 平均、標準誤差、最悪値それぞれのデータを用意(合計 30個)
正解ラベル:悪性、良性
ソースコードの流れ
1、準備作業
2、各種データの確認
3、線形モデル(ロジスティク回帰)の準備
4、データを学習用/評価用に分割するための準備作業
5、データを学習用/評価用に分割
6、機械学習
7、評価
8、評価の分析
ソースコード
ソースコードです。ソースコードの詳細は後で説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#準備作業 from sklearn.datasets import load_breast_cancer data = load_breast_cancer() #各種データの確認 print(data.DESCR) print(data.data) print(data.target_names) print(data.target) # 線形モデル(ロジスティク回帰)の準備 from sklearn import linear_model clf = linear_model.LogisticRegression() #データを学習用/評価用に分割するための準備作業 #学習用:284件、評価用:285件となるようにINDEXを分割する att = data.data #attに属性データを格納 lab = data.target #labに正解ラベルを格納 n_samples = att.shape[0] #データの個数(569件) n_train = n_samples // 2 #半分のデータを学習(284件) n_test = n_samples - n_train #評価データ数(285件) train_index = range(0,n_train) #最初の半分(range(0, 284)) test_index = range(n_train,n_samples) #残りの半分range(284, 569) # データを学習用/評価用に分割 att_train = att[train_index] #学習用属性データ lab_train = lab[train_index] #学習用正解ラベル att_test = att[test_index] #評価用属性データ lab_test = lab[test_index] #評価用正解ラベル #機械学習 clf.fit(att_train,lab_train); #評価 print(clf.score(att_test,lab_test)) #評価の分析 ng = 0 for i,j in zip(clf.predict(att_test),lab_test): if i == j: print(i,j,"OK") else: print(i,j,"NG") ng += 1 print("{0} / {1} = {2}".format(ng,n_test,1-ng/ n_test)) |
ソースコードの詳細
準備作業
1 2 |
from sklearn.datasets import load_breast_cancer data = load_breast_cancer() |
インポートしたデータをdataとして格納しておきます。
各種データの確認
1 |
print(data.DESCR) |
1 2 3 4 5 6 7 8 9 |
Breast Cancer Wisconsin (Diagnostic) Database ============================================= Notes ----- Data Set Characteristics: :Number of Instances: 569 :Number of Attributes: 30 numeric, predictive attributes and the class |
1 |
print(data.feature_names) |
1 2 3 4 5 6 7 8 9 |
['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'] |
属性データの名称が分かります。凹み,凹点,対称性等の10個 × 平均、標準誤差、最悪値それぞれのデータが用意されています(合計 30個)
1 |
print(data.data) |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[[ 1.79900000e+01 1.03800000e+01 1.22800000e+02 ..., 2.65400000e-01 4.60100000e-01 1.18900000e-01] [ 2.05700000e+01 1.77700000e+01 1.32900000e+02 ..., 1.86000000e-01 2.75000000e-01 8.90200000e-02] [ 1.96900000e+01 2.12500000e+01 1.30000000e+02 ..., 2.43000000e-01 3.61300000e-01 8.75800000e-02] ..., [ 1.66000000e+01 2.80800000e+01 1.08300000e+02 ..., 1.41800000e-01 2.21800000e-01 7.82000000e-02] [ 2.06000000e+01 2.93300000e+01 1.40100000e+02 ..., 2.65000000e-01 4.08700000e-01 1.24000000e-01] [ 7.76000000e+00 2.45400000e+01 4.79200000e+01 ..., 0.00000000e+00 2.87100000e-01 7.03900000e-02]] |
属性データの詳細データが分かります。30個の属性データが569件存在します。
1 |
print(data.target_names) |
1 |
['malignant' 'benign'] |
正解ラベルの名称が分かります。悪性、良性になっています。
1 |
print(data.target) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[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 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1] |
正解ラベルの詳細データが分かります。569件の正解ラベルが存在します。0:悪性 1:良性です。
線形モデル(ロジスティク回帰)の準備
1 2 |
from sklearn import linear_model clf = linear_model.LogisticRegression() |
データを学習用/評価用に分割するための準備作業
1 2 3 4 5 6 7 8 9 10 |
#学習用:284件、評価用:285件となるようにINDEXを分割する att = data.data #attに属性データを格納 lab = data.target #labに正解ラベルを格納 n_samples = att.shape[0] #データの個数(569件) n_train = n_samples // 2 #半分のデータを学習(284件) n_test = n_samples - n_train #評価データ数(285件) train_index = range(0,n_train) #最初の半分(range(0, 284)) test_index = range(n_train,n_samples) #残りの半分range(284, 569) |
データを学習用/評価用に分割
1 2 3 4 5 |
att_train = att[train_index] #学習用属性データ lab_train = lab[train_index] #学習用正解ラベル att_test = att[test_index] #評価用属性データ lab_test = lab[test_index] #評価用正解ラベル |
機械学習
1 |
clf.fit(att_train,lab_train); |
評価
1 |
print(clf.score(att_test,lab_test)) |
1 |
0.950877192982 |
#評価の分析
1 2 3 4 5 6 7 |
ng = 0 for i,j in zip(clf.predict(att_test),lab_test): if i == j: print(i,j,"OK") else: print(i,j,"NG") ng += 1 |
1 2 3 4 5 6 7 8 9 10 |
1 1 OK 1 1 OK 1 1 OK 1 1 OK 1 1 OK 1 1 OK 1 1 OK 1 1 OK 1 1 OK ・・・ |
1 |
print("{0} / {1} = {2}".format(ng,n_test,1-ng / n_test)) |
1 |
14 / 285 = 0.9508771929824561 |
285件中14件が失敗し正答率は約95%ということが分かります。