見出し画像

機械学習を用いた乳がん細胞の分類

この記事では、プログラム言語pythonの機械学習用ライブラリsklearnを使って医療データの解析を行います。細胞に関連する特徴量のうち、どの要素が悪性/良性を分類するために有効なのかを調査することが目的です。

用いるのは以下のデータセットです。

・乳がんウィスコンシン データセット

乳腺腫瘤の穿刺吸引細胞診(fine needle aspirate (FNA) of a breast mass)のデジタル画像から計算されたデータ。乳癌に関する細胞テストの様々な数値と、その結果が含まれる。569人の被検者の複数の腫瘤に関する細胞診の結果得られた30個の特徴量と、各被験者の診断結果(悪性/良性:benign/ malignant)が格納されている。

上記データセットに対して、サポートベクターマシン(いわゆるSVM: 線形カーネルを使用)を適用し、どれくらいの精度で悪性/良性が予測出来るか確認してみました。

※精度が高いものが、乳がんの悪性/良性を識別するために良い特徴量だと言うことが出来ます。

・実験結果

それぞれ"Feature Name"が30種類ある特徴量の名前を、"Prediction"がサポートベクターマシンによる予測結果[1が悪性0が良性ではないかな]を、"Ground Truth"が正解ラベルを、"Accuracy"が精度を表しています。この出力結果が30個分並んでいます。

※一番近くに見える0.842...の精度は、つまり「"mean radius(平均の半径)"という特徴を使うことで、サポートベクターマシンという分類器(簡単なAI)は82%の精度で、細胞が悪性/良性である予測が出来る!」ということです

==============================
Feature Name: mean radius
Prediction: [1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1
1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8421052631578947
==============================
Feature Name: mean texture
Prediction: [0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1
1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.7017543859649122
==============================
Feature Name: mean perimeter
Prediction: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1
1 0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8245614035087719
==============================
Feature Name: mean area
Prediction: [1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1
1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8421052631578947
==============================
Feature Name: mean smoothness
Prediction: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.6140350877192983
==============================
Feature Name: mean compactness
Prediction: [1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1
1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.7368421052631579
==============================
Feature Name: mean concavity
Prediction: [1 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 1
1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8421052631578947
==============================
Feature Name: mean concave points
Prediction: [1 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8070175438596491
==============================
Feature Name: mean symmetry
Prediction: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.6140350877192983
==============================
Feature Name: mean fractal dimension
Prediction: [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 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 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.631578947368421
==============================
Feature Name: radius error
Prediction: [1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1
1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8245614035087719
==============================
Feature Name: texture error
Prediction: [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 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 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.631578947368421
==============================
Feature Name: perimeter error
Prediction: [1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1
1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.7719298245614035
==============================
Feature Name: area error
Prediction: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1
1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8947368421052632
==============================
Feature Name: smoothness error
Prediction: [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 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 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.631578947368421
==============================
Feature Name: compactness error
Prediction: [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 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 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.631578947368421
==============================
Feature Name: concavity error
Prediction: [1 1 1 1 1 1 1 1 1 1 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 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.5964912280701754
==============================
Feature Name: concave points error
Prediction: [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 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 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.631578947368421
==============================
Feature Name: symmetry error
Prediction: [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 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 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.631578947368421
==============================
Feature Name: fractal dimension error
Prediction: [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 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 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.631578947368421
==============================
Feature Name: worst radius
Prediction: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1
1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8947368421052632
==============================
Feature Name: worst texture
Prediction: [0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.7192982456140351
==============================
Feature Name: worst perimeter
Prediction: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1
1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8947368421052632
==============================
Feature Name: worst area
Prediction: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1
1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8947368421052632
==============================
Feature Name: worst smoothness
Prediction: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1
1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.6842105263157895
==============================
Feature Name: worst compactness
Prediction: [0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 0 0 1
1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.7368421052631579
==============================
Feature Name: worst concavity
Prediction: [0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1
1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.7368421052631579
==============================
Feature Name: worst concave points
Prediction: [1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1
1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.8771929824561403
==============================
Feature Name: worst symmetry
Prediction: [1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1
1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.7894736842105263
==============================
Feature Name: worst fractal dimension
Prediction: [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 1 1 1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.6491228070175439
==============================
ALL FEATURES
Prediction: [1 1 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1]
Ground Truth: [1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1
1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1]
Accuracy: 0.9122807017543859


・実験結果の考察&所感

全ての特徴量を使うと精度が90%超え!ということがわかります。他に単独でも高い精度を出しているのが、area error(89%), worst perimeter(89%), worst radius(89%), worst concave points(88%)あたりでしょうか。つまり、これらの特徴量を使えば、全部の特徴量を使わなくても90%近い正解率を得られるということなんですよね。実際の医療現場で考えると「ピンポイントの一部の特徴量だけを計測した上でサポートベクターマシンに放り込めば診断のサポートに使えるかも!」ということで、問診の簡略化に繋がると考えられます。

それにしても、1993~95年に扱われていた医療データがsklearnで簡単に使えるという事実にちょっと驚きました。一般にデータセットを使う際には、該当するウェブサイトに行って、ダウンロードして、機械学習用にデータを整形して、、という作業(←超めんどくさい!!w) が必要なのですが、sklearnにパッケージとして含まれていると、そのまま利用できるので、大変利用が簡単です。それから、サポートベクターマシンもその頃から流行りだしていることを考えると、医療AIへの流れという運命的な奇跡も感じざるを得ません。

今回は一回のみで精度を算出したのですが、厳密にはcross validation(交差検定: 何度も繰り返して訓練データとテストデータを入れ替えつつ全部を調査する手法)も行ったほうが、より確たること言えます。このプログラムはまた今度にさせてくださいm(_ _)m 参考までにページの下の方にpythonコードもおいておきます。(今回特徴量の標準化(=standardization)は行いませんでした。一般には、サポートベクターマシンを含め、機械学習のモデルには、「ぶっ飛んだ極端な値」が入らないようにするために、この標準化を行うことが多いです。わかりやすさのため、今は入れていません。)

ここまで読んでいただきありがとうございます。長い記事になってしまいましたが、読んでくださった皆様、ありがとうございます。以下に参考までに、私が書いたコードを共有しておきます。お疲れ様でした!!!

・Pythonコード

全体の方針として、sklearnで

data_breast_cancer = load_breast_cancer()

を行い、乳がん細胞とその悪性/良性のラベル付きデータセットをダウンロード後に、サポートベクターマシンで予測を行う分類器を学習してテストする関数"svm_prediction()"を定義しています。(ちなみに10%がテストデータになっています)

最後の方で、

・30特徴量に対して、それぞれ1特徴量ずつsvm_predition()に投入

・全特徴量をsvm_prediction()に投入

して結果を取得しています。

 #coding :utf-8
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score

data_breast_cancer = load_breast_cancer()
print("Show dataset", data_breast_cancer)

data = data_breast_cancer["data"]
feat_names = data_breast_cancer["feature_names"]
label = data_breast_cancer["target"]

def svm_prediction(X, y, is_standardized=False):
       if len(X.shape) == 1:
               X = X.reshape(1,-1)
               X = X.T

       #引数stratifyに均等に分割させたいデータ (多くの場合は正解ラベル)を指定すると、そのデータの値の比率が一致するように分割される。
       X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, stratify = y, random_state = 0)
       
       if is_standardized == True:
               scaler = StandardScaler()
               X_train_scaled = scaler.fit_transform(X_train)
               X_test_scaled = scaler.fit_transform(X_test)
               lin_svm = LinearSVC().fit(X_train_scaled, y_train)
       else:
               lin_svm = LinearSVC(max_iter=10000).fit(X_train, y_train)

       y_pred = lin_svm.predict(X_test)
       

       print("Prediction:", y_pred)
       print("Ground Truth:", y_test)
       print("Accuracy:", accuracy_score(y_test, y_pred))


###ここでは、それぞれ30通りの特徴で精度をみている
for idx, feat_name in enumerate(feat_names):
       print("="*30)
       print("Feature Name:", feat_name)
       svm_prediction(data[:,idx], label)

###ここからは全特徴量を利用して精度を確認
print("="*30)
print("ALL FEATURES")
svm_prediction(data, label)

・出典

最後に、sklearnのホームページ( https://scikit-learn.org/stable/datasets/index.html#breast-cancer-dataset )に含まれている本データの元論文を載せておきます。

W.N. Street, W.H. Wolberg and O.L. Mangasarian. Nuclear feature extraction for breast tumor diagnosis. IS&T/SPIE 1993 International Symposium on Electronic Imaging: Science and Technology, volume 1905, pages 861-870, San Jose, CA, 1993.

O.L. Mangasarian, W.N. Street and W.H. Wolberg. Breast cancer diagnosis and prognosis via linear programming. Operations Research, 43(4), pages 570-577, July-August 1995.

W.H. Wolberg, W.N. Street, and O.L. Mangasarian. Machine learning techniques to diagnose breast cancer from fine-needle aspirates. Cancer Letters 77 (1994) 163-171.


この記事が気に入ったらサポートをしてみませんか?