scikit-learnで、がん診断データをロジスティック回帰分析する
ロジスティック回帰は2値分類で利用され、予測結果を確立的に求めることができます。例えば迷惑メールを判別する場合、『スパムか非スパムか?スパムなら可能性はどれくらいか?』といった分析が可能です。
データセット読み込みと内容確認
始めにbreast-cancerデータセットの読み込んで、データの内容を確認します。
- 乳がんデータセットの読み込む ...[1]
- データセットdict_keysを確認する ...[2]
- 説明変数の確認する (検査データなど30項目) ...[3]
- データ総数の確認する(569件) ...[4]
- 目的変数の内容を確認する(悪性0、良性1の2値データ) ...[5,6,7]
# breast_cancerデータ読み込み
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
# breast_cancerデータ確認(dict-keys)
cancer.keys()
cancer.feature_names # 説明変数 30種類
len(cancer.data) # データ数 569件
cancer.target[:50] # 目的変数(先頭50件) 診断2値データ
cancer.target_names # 目的変数 診断2値の内容
# 0 : malignant(悪性)
# 1 : benign(良性)
# 診断の内訳
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)
ロジスティック回帰分析
今回はsklearnのLogisticRegressionを使って、ロジスティック回帰分析を行います。
- データセットを読み込む ...[1]
- 訓練データとテストデータに分割する(train_test_split利用) ...[2]
- 分割後のデータ件数を確認する ...[3]
- モデル作成と訓練データで学習を行う ...[4]
- 学習精度の確認する ...[5]
- テストデータを使った予測と精度検証する ...[6]
- 確率変換用にシグモイド関数を定義する ...[7]
- 分類予測の決定確率を求める ...[8]
- 予測結果を表にして確認する(Pandas利用) ...[9]
# breast_cancerデータ読み込み
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
# 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)
# 分割後のデータ件数
print('train = ', len(X_train))
print('test =', len(X_test))
# モデル作成
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression() # ロジスティック回帰
# 訓練データで学習
clf.fit(X_train, y_train)
clf.score(X_train, y_train) # 学習精度
predict = clf.predict(X_test) # テストデータで予測
clf.score(X_test, y_test) # テストデータの精度
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')
# 決定関数値(絶対値が大きいほど識別境界から離れている)
X_test_value = clf.decision_function(X_test)
# 決定関数値をシグモイド関数で確立に変換
X_test_prob = sigmoid(X_test_value)
# テストデータの予測結果(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
ガン診断データを使ったロジスティック回帰分析は以上です。
0 件のコメント :
コメントを投稿