1.必要モジュールとデータのインポート
from sklearn.datasets import load_boston
from pandas import DataFrame
import numpy as np
#ボストンデータを"boston"というインスタンスにインポート
boston = load_boston()
なにかワーニングが出ているが読めている模様。 オリジナルデータ欲しいならURLにアクセスせよという警告? ひとまず問題なさそうなので進めることにする。
#インポートしたデータを確認
print(boston)
#DESCR変数の中身を確認
#説明を表示できる
print(boston['DESCR'])
#feature_names変数の中身を確認
#カラム名
print(boston['feature_names'])
#data変数(説明変数)の中身を確認
print(boston['data'])
#target変数(目的変数)の中身を確認
#明らかにおかしいデータがある場合は前処理が必要
# ヒストグラムに直す,max,minを確認する
# 上限がかかっている場合もある
print(boston['target'])
2.データフレームの作成
#説明変数らをDataFrameへ変換
df = DataFrame(data=boston.data, columns=boston.feature_names)
#目的変数をDataFrameへ追加
df['PRICE'] = np.array(boston.target)
#最初の12行を表示
#ぱっと見で偏りなど気になる場合は表示数を増やして確認してみる
df.head(12)
線形単回帰分析
#カラムを指定してデータを表示
#部屋数だけで回帰分析する
df[['RM']].head(12)
#説明変数
data = df.loc[:,['RM']].values
#dataリストの表示
data[0:5]
#目的変数
target = df.loc[:,'PRICE'].values
target[0:5]
#sklearnモジュールからLinearRegressionをインポート
from sklearn.linear_model import LinearRegression
#オブジェクト生成
model = LinearRegression()
model.get_params()
# fit関数でパラメータ推定
model.fit(data,target)
#予測
model.predict([[1]])
価格がマイナスになるのはあり得ない ⇒モデルの設定をミスっている可能性が高い
重回帰分析(2変数)
#カラムを指定してデータを表示
df[['CRIM','RM']].head()
#説明変数
data2 = df.loc[:,['CRIM','RM']].values
#目的変数
target2 = df.loc[:,'PRICE'].values
data2
#オブジェクト生成
model2 = LinearRegression()
#fit関数でパラメータ推定
model2.fit(data2, target2)
#fit関数でパラメータ推定
model2.predict([[0.2,7]])
回帰係数と切片の値を確認
#重回帰の回帰係数と切片を確認
print(model2.coef_)
print(model2.intercept_)
model2.predict([[0.3,4]])
犯罪率よりも部屋数の方が圧倒的に価格への影響が大きいことがわかる。
というかやった後に気づいたけど線形だとグラフ化するまでもなく傾き見ればわかるか
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
crime = np.arange(0.0, 1.0,0.1)
room = np.arange(1, 11, 1)
mesh_c, mesh_r = np.meshgrid(crime, room)
mesh_c = mesh_c.flatten()
mesh_r = mesh_r.flatten()
mesh_x = np.stack([mesh_c, mesh_r], 1)
mesh_y = model2.predict(mesh_x).reshape(10,10)
fig, ax = plt.subplots()
im = ax.imshow(mesh_y)
fig.colorbar(im, ax = ax)
plt.show()
mesh_r
mesh_c
mesh_x
mesh_y
from google.colab import files
import re
uploaded = files.upload()
for fn in uploaded.keys():
fn_s = re.escape(fn)
output_fn = fn.split('.', 1)[0]+'.html'
output_fn_s = re.escape(output_fn)
!jupyter nbconvert --to html $fn_s
files.download(output_fn)
!rm $fn_s