Cross Validationを使用して癌の識別を行ってみる
今回はCross Validation(クロスバリデーション法)を使用して癌の識別を行ってみたいと思います。
Cross Validation(クロスバリデーション法)とは別名、K-分割交差検証と呼ばれるテスト手法です。単純に分割したHold-out(ホールドアウト法)に比べるとモデルの精度を高めることが出来ます。
今回は10-fold cross validationにて検証していきます。
具体的に説明します。
まず、癌の識別として使用するデータは569件あります。
そのうち、10分割した9割の512件を学習用データ、残りの1割の57件をテストデータとします。次に、テストデータを入れ替えて、別の9割の512件を学習用データ、残りの1割の57件をテストデータとして再度検証を行います。
これらを10回繰り返すことで、全てのケースがテスト事例となるよう検証を行います。
このように全部のデータが1度は学習用データとテストデータとなるため、学習用データの抽出による偏りが少なくなります。
Cross Validation(クロスバリデーション法)の詳細については以下の記事を参照してください。
使用するデータ
使用データ:scikit-learn(load_breast_cancer)
全データ:569件(10-fold cross validation)
説明変数:30個(凹み,凹点,対称性・・・)
目的変数::0:悪性/1:陽性
分類/識別:分類(1ラベル)
識別方法:ロジスティク回帰
Cross Validation(クロスバリデーション法)のソースコード
1 2 |
from sklearn.model_selection import cross_val_score ave_score = cross_val_score(clf, X, Y, cv=10) |
Xとは説明変数で、Yは目的変数となります。
CVとして設定している数値は何分割にするかの設定です。今回は10分割を指定しています。
ソースコード
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 |
#各種ライブラリのImport import numpy as np import pandas as pd from matplotlib import pyplot as pld #%matplotlib inline #scikit-learnより癌のデータを抽出する from sklearn.datasets import load_breast_cancer data = load_breast_cancer() #癌のデータ(説明変数)をdataXに格納する dataX = pd.DataFrame(data=data.data,columns=data.feature_names) dataX.head() #癌のデータ(目的変数)をdataYに格納する dataY = pd.DataFrame(data=data.target) dataY = dataY.rename(columns={0: '判定(0:悪性 / 1:陽性)'}) dataY.head() #線形モデル(ロジスティク回帰)として測定器を作成する from sklearn import linear_model clf = linear_model.LogisticRegression() #Cross Validation(クロスバリデーション法) from sklearn.model_selection import cross_val_score ave_score = cross_val_score(clf, dataX, dataY, cv=10) #正解率を出力する pd.DataFrame(ave_score).rename(columns={0: '正解率'}) #平均値を出力する ave_score.mean() |
ソースコードの詳細
Cross Validation(クロスバリデーション法)
1 2 3 4 5 |
#Cross Validation(クロスバリデーション法) from sklearn.model_selection import cross_val_score ave_score = cross_val_score(clf, dataX, dataY, cv=10) |
CV=10を設定しており10分割を指定しています。
正解率を出力する
1 2 |
#正解率を出力する pd.DataFrame(ave_score).rename(columns={0: '正解率'}) |
正解率を出力しています。10-fold cross validationのため10回の結果が出力されています。
平均値を出力する
1 2 |
#平均値を出力する ave_score.mean() |
1 |
0.95089987900786443 |
このようにscikit-leanを使用すると簡単にCross Validation(クロスバリデーション法)を実装することが出来ます。