6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

線形重回帰による決定係数の算出とモデルの選択

Last updated at Posted at 2019-05-16

はじめに

 線形回帰を実施するとき、どのモデルが最も効率が良いのか試行する。データはscikit-learnのbreast_cancerを用いて実装する。このデータはウィスコンシン乳癌データセットと呼ばれるもので、腫瘍が良性であるか悪性であるかを判定したものである。データは569あり、そのうち良性は212、悪性は357、特徴量は30種類ある。これらのデータを用いて腫瘍が良性か悪性かを判定するモデルを作成し、最も決定係数が高くなるものを選択する。

#シリーズ

#線形回帰の手法
線形回帰の手法は次の4種類で実施する。
最も高い決定係数のモデルは線形回帰となった。

線形回帰の手法 メソッド 汎化手法 決定係数
線形回帰 LinearRegression() - 0.73
Lasso回帰 Lasso() L1正則化 0.61
Ridge回帰 Ridge() L2正則化 0.72
ElasticNet回帰 ElasticNet() L1 & L2正則化 0.66
※今回のElasticNet回帰はL1:L2 = 50:50

決定係数
 独立変数(説明変数)が従属変数(被説明変数)のどれくらいを説明できるかを表す値である。寄与率と呼ばれることもある。標本値から求めた回帰方程式のあてはまりの良さの尺度として利用される。(wikipediaより)

正則化
 機械学習で過学習を防いだり、逆問題での不良設定問題を解くために、追加の項を導入する手法である。(wikipediaより)

L1正則化
 予測に影響を及ぼしにくいデータにかかる係数をゼロに近づける手法

L2正則化
 係数の大きさが大きくなりすぎないように制限する手法

手順

  • 乳癌のデータセットを読み込む
  • 訓練データとテストデータを分離する
  • 分析手法をmethodsに格納する
  • 決定係数の最大値を初期化する
  • methodsに格納したそれぞれの線形回帰手法で決定係数を求める
  • 最も決定係数の高かった線形回帰手法を選択する

pythonによる実装

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet
from sklearn.model_selection import train_test_split

#データの読み込み
cancer_data = load_breast_cancer()

#訓練データとテストデータを分離
train_X, test_X, train_y, test_y = train_test_split(cancer_data.data, cancer_data.target, random_state=0)

#分析手法をmethodに格納
methods = np.array([LinearRegression(), Lasso(), Ridge(), ElasticNet()])

#決定係数の最大値を初期化
maxvalue = 0

#学習と予測
for idx, method in enumerate(methods):
    model = method
    model.fit(train_X, train_y)
    score = model.score(test_X, test_y)

    if idx == 0:
        index = "線形回帰"
    if idx == 1:
        index = "Lasso回帰"
    if idx == 2:
        index = "Ridge回帰"
    if idx == 3:
        index = "ElasticNet回帰"

    print("{:<15}:{:.2f}".format(index, score))
    
    if score >= maxvalue:
        maxvalue = score
        index_max = index
            
print("")
print("最も決定係数の大きいモデルは\nモデル:{} 決定係数{:.2f}".format(index_max, maxvalue))

出力

線形回帰           0.73
Lasso回帰        0.61
Ridge回帰        0.72
ElasticNet回帰   0.66

最も決定係数の大きいモデルは
モデル線形回帰 決定係数0.73

おわりに

 今回実施した4種類のモデルの中では、線形回帰が最も決定係数が高い結果となった。しかし、ElasticNet回帰はL1:L2 = 50:50のみの試行であったため、次回はこの割合を変更してより決定係数が高くなるモデルがないか試行する。

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?