scikit-learnでボストン市の住宅価格を回帰予測

AIプログラミング
スポンサーリンク

今回はscikit-learnで用意されているボストン市街の住宅価格(Boston house-prices)を回帰予測で調べてみたいと思います。

学習のモデルの種類は、回帰分析となります。

それでは実際にやってみましょう!

 

1.ソースコードの流れ

今回の作業の流れはこんな感じになります。

・ライブラリのインポート

・データのインポート

・データの可視化

・学習データとテストデータの分割と用意

・学習モデルの作成

・学習

・評価

 

2.ボストン市街の住宅価格のDatasetについて

次にデータセットの説明です。今回のデータは、scikit-learnが用意しているボストン市街の住宅価格(Boston house-prices)を使用します。

このデータを使って、最終的に導き出すものは、”ボストン市街の住宅価格の予測”です。

 

全データ:506件

属性データ:14件

CRIM人口1人当たりの犯罪発生数
ZN25000平方フィート以上の居住区間の占める割合
INDUS小売業以外の商業が占める面積の割合
CHASチャールズ川によるダミー変数(1:川の周辺,0:それ以外)
NOXNOxの濃度
RM住居の平均部屋数
AGE1940年より前に建てられた物件の割合
DIS5つのボストン市の雇用施設からの距離
RAD環状高速道路へのアクセスのしやすさ
TAX$10,000ドルあたりの不動産税率の総計
PTRATIO町毎の児童と教師の比率
B町毎の黒人(Bk)の比率を次式で表したもの。1000(Bk-0.63)^2
LSTAT給与の低い職業に従事する人口の割合
MEDV所有者が占有している家屋の$1000単位の中央値

参照サイト:Pythonでデータサイエンス

3.ソースコード

# -*- coding: utf-8 -*-
#ライブラリのインポート
from sklearn import datasets
import pandas as pd
import seaborn as sns


#ボストン市の住宅価格のデータのインポート
dataset = datasets.load_boston()
#データフレーム型に変換
df_data = pd.DataFrame(dataset.data,columns=dataset.feature_names)
df_data["PRICE"] = dataset.target
df_data.head()

#seabornのデータの可視化
sea_plot = sns.load_dataset("dataset")
sns.pairplot(df_data)
#ヒートマップで可視化
heat_map = df_data.corr(method="pearson")
sns.heatmap(heat_map,center=0,annot=True, cmap="Blues",fmt="1.1f")

#datasetの分割
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(dataset.data, dataset.target,test_size=0.3,random_state=0)

#学習
from sklearn import linear_model
model = linear_model.LinearRegression()
model.fit(x_train, y_train)

#予測精度の算出
print("train: ", model.score(x_train, y_train))
print("test: ", model.score(x_test, y_test))


#評価
test_df = pd.DataFrame(x_test, columns=dataset.feature_names)
print(test_df)
print(model.predict(x_test))

 

4.ソースコードの詳細

ライブラリのインポート

#ライブラリのインポート
from sklearn import datasets
import pandas as pd
import seaborn as sns

まずはscikit-learnからデータのインポートをしましょう。

そしたら、インポートしたデータをDataFrame型に変換するためにPandasを、dataを可視化するためにseabornをインポートしましょう。

sklearn : scikit-learnが用意するdatasets(データ群)のインポート

pandas : DataFrame型にデータを変換する

seaborn:データの可視化

 

Point:import文の使い方

import モジュール名

import モジュール名 as 別名

from モジュール名 import クラス名/関数名

 

データのインポート

#ボストン市の住宅価格のデータのインポート
dataset = datasets.load_boston()

次に、scikit-learnからimportしたデータ群の中から、ボストン市の住宅価格だけを変数に定義します。

Point:datasetの定義

変数dataset  = datasets.load_boston()

この一文の訳:「datasetsのload_boston()のデータを変数datasetに入れる」

 

ボストンのデータをDataFrame型に変換

#データフレーム型に変換
df_data = pd.DataFrame(dataset.data,columns=dataset.feature_names)
df_data["PRICE"] = dataset.target
df_data.head()

次にボストンの住宅価格のデータをpandasのデータフレームを使用して、データ型を変換していきます。

Point:pandasのデータフレームの使い方

変数 df_data = pd.DataFrame(data, index, columns, dtype, copy)

data : DataFrameに入れるデータを指定。辞書型・Numpy配列・DataFrameなど指定可。

index : 行のラベルを指定(今回は使用しない)

columns : 列のラベルを指定

dtype : データフレーム内のデータ型の指定

copy : bool型で指定し、オブジェクトを生成する際にコピーを生成するかどうか指定。

 

 

データの可視化

#seabornのデータの可視化
sea_plot = sns.load_dataset("dataset")
sns.pairplot(df_data)

まずはseabornのpairplotでデータを可視化してみましょう。

 

Point:seabornのpairplotでデータの可視化 

sns.pairplot(data, hue)

data : DataFrame型でdataの指定

hue : カテゴリデータに従って色分け(今回はカテゴリが多いためエラーが発生)

 

これはさすがにわかりづらい・・・

 

では、次にヒートマップでデータを可視化していきましょう。

#ヒートマップで可視化
heat_map = df_data.corr(method="pearson")
sns.heatmap(heat_map,center=0,annot=True, cmap="Blues",fmt="1.1f")

まずは使い方です。

Point:heatmapでデータを可視化

sns.heatmap(data, cmap, center, annot, fmt)

data : ndarray形式に変換可能な2次元のデータセットを指定。今回は相関係数を算出して適用。

cmap : matplotlibのカラーマップまたは、オブジェクトを指定。

center : colormapの中心とする値。

annot : Trueに設定するとセルに値を出力

fmt : データセットを指定した場合の出力フォーマットを文字列を出力

 

では出力されるヒートマップはこんな感じです。

先程の散布図より圧倒的に見やすいですね。

このヒートマップから、最も相関が高いのがRMとPRICEですね。ここに何かしらの関係性がありそうですね。

 

訓練データとテストデータの分割

#datasetの分割
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(dataset.data, dataset.target,test_size=0.3,random_state=0)

訓練データとテストデータの分割には、scikit-learnで準備されている train_test_split関数を使用します。

今回は、訓練データ:テストデータ = 7 : 3の割合で分割します。

<div “class=box5”>Point: train_test_split関数の使い方

x_train, x_test, y_train, y_test = train_test_split(data, target, test_size, random_state)

data : 分割したいデータ

target : 分割したいデータに対応したラベルデータ

test_size : テストデータのサイズの割合

random_state : ランダムシードを指定(今回は指定しない)

※データの分割の仕方の詳細はこちらをご覧ください。

機械学習:訓練データとテストデータの分割方法

 

学習モデルの作成

#学習
from sklearn import linear_model
model = linear_model.LinearRegression()

まず今回は 線形回帰モデルを使用するので、sklearnからlinear_modelをインポートします。

LinearRegressionは線形回帰モデルの一つで、説明変数の値から目的変数をの値を予測するモデルです。

Point:学習モデルの定義

model = Linear_model.LinearRegression()

この式の説明「sklearnにあるLinear_modelのLinerRegression()関数を変数modelに定義」

 

学習の開始

model.fit(x_train, y_train)

学習はfit()関数を使用します。

Point:fit()関数の使い方

model . fit( x, y )

model : 作成した学習モデル

x : 訓練データ

y : 正解データ

 

予測精度の算出

#予測精度の算出
print("train: ", model.score(x_train, y_train))
print("test: ", model.score(x_test, y_test))

予測した精度はこんな感じにでました。

あんまり精度としてはよくないですね。

 

評価

#評価
test_df = pd.DataFrame(x_test, columns=dataset.feature_names)
print(test_df)
print(model.predict(x_test))

最後に評価です。

まずpandasのデータフレームを使ってテストデータを作成していきましょう。

indexの最初の部分はこんな感じです。(エディタ:spyder)

このデータは答えの情報になります。

 

そしてpredictアトリビュートで予測の仕方と予測結果をみていきましょう。

Point:model.predicrtの使い方

model.predict( data )

この一文の訳:modelのpredictを使ってdataの予測をする。

data : 予測したいデータ

 

では実際に予測した結果をみていきましょう。

この数字の羅列は何かというと、ボストンの住宅価格予測結果です。

こんな感じで線形回帰を使って、scikit-learnのデータを予測しました。以上です。

 

6.最後に

今回は、scikit-learnのデータと線形回帰モデルを使って予測をしてみました。

他のデータを使って予測や回帰、さらには推論に挑戦していきたいと思います。

コメント

タイトルとURLをコピーしました