1
2

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.

ひと目でわかるscikit-learn(サイキットラーン)を使用した回帰分析

Posted at

はじめに

こんな方にオススメ。
・回帰分析とはなんぞや
・回帰分析の種類と用途が整理できてない
・簡単に動かせるソースちょうだい

回帰分析とは

相関関係や因果関係があると思われる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

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?