はじめに
こんな方にオススメ。
・回帰分析とはなんぞや
・回帰分析の種類と用途が整理できてない
・簡単に動かせるソースちょうだい
回帰分析とは
相関関係や因果関係があると思われる2つの変数のうち、一方の変数から将来的な値を予測するための予測式(回帰直線)を求めるための手法。
具体的なイメージは下記ソースを参照。
回帰分析の種類と用途
種類 | 目的変数 | 説明変数 | 目的変数値 | 用途 | 具体例 |
---|---|---|---|---|---|
単回帰分析 | 1 | 1 | - | 予測値算出 | 月曜日の日照時間を推論 -> 7時間 |
重回帰分析 | 1 | 2以上 | - | 予測値算出 | 月曜日の日照時間を推論 -> 7時間 |
ロジスティック回帰分析 | 1 | 2以上 | 2値(0 or 1) | 検証値となりえる確率を算出 | 月曜日が晴れの確率 -> 50% |
環境
Anaconda 3.7
Jupyter Notebook
ソース
単回帰分析
from sklearn.datasets import load_boston
import pandas as pd
boston = load_boston() # データセットの読み込み
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_df['PRICE']=boston.target
boston_df.head()
y='PRICE' # 目的変数
x='RM'#説明変数
df = boston_df[[x,y]].corr()
# かなり強い相関(0.7~1)
# やや強い相関(0.4~0.7)
# 弱い相関(0.2~0.4)
# ほとんど相関なし(0.0~0.2)
df
重回帰分析
単回帰分析とは、説明変数の数が違うため、
説明変数は正規化(0,1)を行っている。(単位を揃えるイメージ)
尚、モデル保存、ロード処理についても必須ではないが追記してある。
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import pickle
dataset = load_boston()#データセット読み込み
data_x = pd.DataFrame(dataset.data,columns=dataset.feature_names)#説明変数
data_y = pd.DataFrame(dataset.target)#目的変数
# クロスバリデーション法を使用
# 学習データ(train_)とテストデータ(test_)を作成
train_x,test_x,train_y,test_y = train_test_split(data_x,data_y)
# 正規化インスタンス
mscaler = MinMaxScaler()
# 訓練データの説明変数を正規化
mscaler.fit(train_x)#読み込み
train_x_mmsc=mscaler.transform(train_x)#正規化
mscaler.fit(train_y)#読み込み
train_y_mmsc=mscaler.transform(train_y)#正規化
# テストデータの説明変数を正規化
mscaler.fit(test_x)
test_x_mmsc=mscaler.transform(test_x)
mscaler.fit(test_y)
test_y_mmsc=mscaler.transform(test_y)
# モデルインスタンス
model=LinearRegression()
model.fit(train_x_mmsc, train_y_mmsc)#予測モデル構築
print("[決定係数(データの精度)]\n",model.score(test_x_mmsc,test_y_mmsc))#決定係数の表示(0.5(50%)以上の精度が目安)
# モデルを保存
filename = 'multiple_regression_analysis.sav'
pickle.dump(model, open(filename, 'wb'))
# 保存したモデルをロード
load_model = pickle.load(open(filename, 'rb'))
# 偏回帰係数算出
coefficie=pd.DataFrame(dataset.feature_names, columns=['colum_name'])
coefficie['coefficient'] = pd.DataFrame(load_model.coef_.T)
print("[偏回帰係数(目的変数に対する相関度)]\n",coefficie)
# 実際の住宅価格
re_test_y = mscaler.inverse_transform(test_y_mmsc)#正規化から逆変換
act_df=pd.DataFrame(re_test_y)
act_df.columns=['actual']
act_df.reset_index(drop=True, inplace=True)#indexリセット
# 学習結果からの予想住宅価格
test_x_mmsc_df=pd.DataFrame(test_x_mmsc)
test_x_predict=mscaler.inverse_transform(load_model.predict(test_x_mmsc_df))#予測値結果を正規化から逆変換
fc_df=pd.DataFrame(test_x_predict)
act_df['forecast']=fc_df #列追加
act_df.head() # 先頭5行表示
ロジスティック回帰分析
import sklearn
import pandas as pd
from sklearn import datasets
from sklearn import linear_model
from sklearn.model_selection import train_test_split
# irisのデータを用意
iris = datasets.load_iris()
# 説明変数
data_x = iris.data
# 目的変数(アヤメの3品種(Setosa, Versicolour, Virginica))
data_y = iris.target
# 訓練、テストデータ取得
train_x,test_x,train_y,test_y = train_test_split(data_x,data_y)
# ロジスティック回帰の識別器を用意
clf = linear_model.LogisticRegression()
# 識別器を学習させる
clf.fit(train_x, train_y)
# テストデータで識別結果(正解率)を確認
print(clf.score(test_x, test_y))
GitHub
上記実行済のipynbファイルは以下をプルして下さい。
https://github.com/bossjerom/python/tree/master/scikit-learn