機械学習 教師あり学習 回帰 住宅価格 練習問題

機械学習

【教師あり学習】機械学習scikit-learnで住宅価格を予測【回帰】

こんにちは。産婦人科医のtommyです(Twitter:@obgyntommy)。

 

この記事では、住宅価格のデータセットを用いた教師あり機械学習の一通りの流れをscikit-learnを用いて学びます。

 

教師あり機械学習の一般的な流れは以下の通りです。

 

 教師あり学習の機械学習の流れ

  1. データセットの読み込み
  2. データの前処理
  3. 探索的データ解析(EDA;Explanatory Data Analysis)
  4. 機械学習予測モデルの作成
  5. 性能評価

scikit-learnを用いた機械学習の流れについては、以下の記事を参照して下さい。

AI python 機械学習 scikit-learnを使用して予測モデル(機械学習アルゴリズム)を作成し評価する
【機械学習】scikit-learnの使い方【基礎から全て解説】

続きを見る

 

又、Google Colaboratoryの使い方については以下の記事を参照して下さい。

Google Colaboratory グーグルコラボラトリー グーグルコラボ 使い方
Google Colaboratoryの使い方【完全マニュアル】

続きを見る

 

そのほか、教師あり学習の練習問題としては、ワインの品質判定、乳癌のデータセットを用いて行う問題や、糖尿病のデータセットを用いて行う練習問題も作成していますので、併せてどうぞ。

 

機械学習 ワインの品質判定 練習問題
【教師あり学習】機械学習でワインの品質判定を行ってみよう【scikit-learn】

続きを見る

Scikit-learn 乳がんデータセット 機械学習
【教師あり学習】scikit-learn の乳がんデータセットで機械学習を行う

続きを見る

教師あり学習 scikit-learn 糖尿病 データセット 機械学習 回帰
【教師あり学習】scikit-learnの糖尿病のデータセットで機械学習【回帰】

続きを見る

 

Google Colaboratoeyを使用して学習される方は、こちらのリンクを参照して下さい。

 

では早速学習していきましょう。

 

diabetesデータセットの読み込みと内容確認

教師あり学習 scikit-learn 糖尿病 データセット 機械学習 回帰

skleanのライブラリから「fetch_california_housing」のデータセットを読み込みます。

 

fetch_california_housing のデータセットは、カリフォルニアの各地区の住宅築年数や部屋数などの住宅に関する平均スペックから、その地区の住宅の平均価格を予測するためのデータセットになります。

 

fetch_california_housing データセットの中身を確認します。

 

In[]

 

Out[]

 

このデータセットの中身はpythonの辞書型になっていますので、取得したい対象のキーを以下のように指定することによって対象の中身(バリュー)を取得できます。

 

以下は教師データの取得を行なっています。

 

In[]

 

Out[]

 

データの前処理

教師あり学習 scikit-learn 糖尿病 データセット 機械学習 回帰

次に、X を特徴量、y を教師データとして前処理を行なっていきます。

 

まずは教師データをpandasのデータフレームとしてまとめておきます。

 

教師データは浮動小数点数型で、『カルフォルニアの地区ごとの住宅価格平均』と捉えておけば良いでしょう。

 

In[]

Out[]

 

続いて、特徴量の前処理を行います。特徴量の名前は feature_names 、値は dataキー に含まれていますのでそれを用います。

 

In[]

 

Out[]

 

特徴量についてそれぞれは本記事では解説はしませんが、見た感じ、なんとなく築年数や部屋数など住宅価格に関係するであろう特徴量が含まれていることが分かります。

 

describeメソッドによって、一括で全ての特徴量の統計値の概要を表示できます。

 

In[]

 

Out[]

 

続いて、全てのデータを学習用と評価用に分割します。

 

これには sklearn の train_test_splitメソッド  を使います。

 

学習用データと評価用データの数の割合ですが、今回は4:1とします。

 

※ 4:1でなければならないというわけではなく、一般的には評価用データ数が全体の2-4割程度にすることが多いです。

 

In[]

 

学習データの特徴量と正解ラベルを1つのデータセットとしてまとめます。

 

In[]

 

続いて、学習用データセットの特徴量と正解ラベルの型を確認します。pandas の infoメソッド により全てのカラムの型を確認できます。

 

In[]

 

Out[]

欠損値は無く、全ての特徴量が浮動小数点数(float型)ということが確認できていますね。

 

探索的データ解析(EDA)

教師あり学習 scikit-learn 糖尿病 データセット 機械学習 回帰

続いて、このデータに関して探索的データ解析(EDA)を行なっていきます。

 

探索的データ解析(EDA)の目的ですが、これから機械学習を使って分類を行なっていきますが、その前に『回帰モデルによる予測が可能そうかそうでないか』を見極めるのが重要となります。

 

回帰モデルが有効かを見定めるにはまず教師データと各特徴量の相関を見るのが有効です。

 

相関(逆相関)が高い特徴量が存在するかをまずは確認してみましょう。

 

まず、相関を見るための相関係数の算出ですが、pandasの corrメソッド により一括で算出できます。

 

In[]

 

Out[]

 

縦と横が交差するところが相関係数になります。

 

ただ、数値のみだと見辛いのでヒートマップによる可視化が有効です。

 

seabornheatmapメソッド によりヒートマップが作成できます。

 

引数 annotTrue にすることによってヒートマップのマスの中に相関係数を表示することができます。

 

引数 square はヒートマップを正方形。引数 cmap はヒートマップの色を指定します。

 

In[]

 

Out[]

相関係数については、

  • 0.7以上が相関が強い(マイナスの場合は-0.7以下が逆相関が強い)
  • 0.4〜0.6はまあまあ相関が強い(マイナスの場合は-0.6〜-0.4 が逆相関が強い)

という目安で良いかと思います。(厳密には違いますが)

 

targetとの相関(逆相関)を確認したいので、target 列に注目します。

 

targetMedInc(その地区の人の収入)と相関が強く、その他の特徴量とはそこまで相関が強くないことがわかります。

 

それでは targetMedInc とのデータの関連性を散布図によって確認しておきましょう。

 

In[]

 

Out[]

相関は見て取れますが、どうやらtargetの値の最大値が5になっていて、targetの値が5のデータ数が多いように見えます。

 

データの背景がわかりませんが違和感がありますよね。

 

もし5以上の値がまるめられて5になっているとすれば、このままモデルを作成するとあまり精度が得られない結果になるかもしれません。

 

一旦targetが5になるデータの全体に占める割合と、それらを除いたデータセットを作成しておきましょう。

 

In[]

 

Out[]

このtargetの値が5のデータは全体の0.14%くらいですので、そこまで全体としての割合は大きくありません。ただ、違和感があり結果にどう影響を及ぼすのか知りたいところです。

 

このように、違和感があるデータが予測精度にどのように影響を及ぼすか分からない場合、機械学習モデル作成の際に行う交差検定での精度スコアを比較することによって評価が行えます。

  1. target=5のデータを省かない
  2. target=5のデータを省く

それぞれについて交差検定内での精度スコアを比較してみましょう。

 

機械学習予測モデルの作成

教師あり学習 scikit-learn 糖尿病 データセット 機械学習 回帰

機械学習予測モデルの作成を行います。交差検定を用いた、機械学習モデルのハイパーパラメータ探索から行います。

 

機械学習モデルとして①②両方ともElasticNetを用います。

 

ElasticNetの説明は割愛しますが、いわば従来のLasso回帰とRidge回帰のいいところどりをし、より過学習を防ぎやすいモデルと言ってよいでしょう。

 

sklearn.linear_model.ElasticNet — scikit-learn 0.23.2 documentation
sklearn.linear_model.ElasticNet — scikit-learn 0.23.2 documentation

続きを見る

 

ハイパーパラメータ探索としてグリッドサーチを用います。両方ともsklearnのクラスとして用意されています。

 

In[]

 

ElasticNetについては公式ドキュメントを確認しましょう。

 

今回はハイパーパラメータの候補として"alpha"と"l1_ratio"を取り上げます。

 

alphaは学習率、すなわち学習を進ませるスピードです。

 

大きいと計算が発散しますので一般的には出来るだけ小さくします。

 

l1_ratio はL1正則化の割合ですが、これはあまり意識することなく割合なので0-1の間の数を設定しておけば大丈夫です。

 

① target=5のデータを省かない場合

①の場合の交差検定を用いたグリッドサーチを行います。

 

In[]

 

Out[]

交差検定での決定係数の結果を確認しましょう。

 

In[]

 

Out[]

約0.6という結果になりました。

 

② target=5のデータを省く場合

② の場合の交差検定を用いたグリッドサーチを行います。

 

In[]

 

Out[]

 

In[]

 

Out[]

 

①と②の結果を比較すると①の方のモデルの方が性能が良いことがわかります。

 

データは一部違和感がありましたが、グリッドサーチ内の交差検定の結果を元にすると①の方が結果的に筋の良いモデルができている、ということになります。

 

ここで大事なことは、データに定性的な違和感を感じた時は交差検定により定量的な評価が可能、ということです。

 

ここでは結果より①のモデルを使うということで進めていきましょう。

 

このハイパーパラメータを採用した際のモデルは best_estimator_メソッド により作成が可能です。

 

In[]

 

性能評価

教師あり学習 scikit-learn 糖尿病 データセット 機械学習 回帰

続いて、予測と性能評価を行いましょう。

 

今回は元々性能指標として設定していた決定係数に注目することにしましょう。 決定係数は sklearn.metrics の中の r2_score で計算できます。

 

In[]

 

Out[]

 

さて、気になるのは決定係数約0.6が精度として信頼がおけるものなのかということですが、この決定係数は相関係数の2乗です。

 

本記事ではあまり細かいことは考えずに、相関係数として捉えると大体0.8弱くらいになるので、大体良い予測モデルが出来ているのではと、超前向きに捉えています。

 

まとめ

教師あり学習 scikit-learn 糖尿病 データセット 機械学習 回帰

この記事では住宅価格のデータセットを用いた教師あり機械学習の一通りの流れをscikit-learnを用いて学びました。

 

Google Colaboratoeyを使用して学習される方は、以下を参照して学習して下さい。

 

Google Colaboratory
Google Colaboratory

続きを見る

 

今回は以上となります。

 

 

人気記事 【入門から上級レベルまで】人工知能・機械学習の学習におすすめの書籍25選

人気記事 無料あり:AI(機械学習)特化型おすすめプログラミングスクール3社


-機械学習
-,

Copyright© Tommy blog  , 2020 All Rights Reserved.