機械学習入門 vol.6 回帰 - 線形回帰

本コンテンツは機械学習入門講座を各所でやっている内容の一部を、受講者の皆様の予習・復習のために公開しているものです。対象読者は、Pythonをやったことがほとんどない方やつまづいてしまっている方でも概ね実行できるようになるレベルで書いています。解説は講座でそれなりに詳しくしているため、コードにコメントする以上の説明はあまり記述していません。

各コードはJupyterシリーズやiPythonで記述しながら実行できるように記述しています。

AI/DX/機械学習/Pythonのアドバイザリー、社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)

# 機械学習入門シリーズ記事

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. [機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール](https://qiita.com/mychaelstyle/items/d5506f372219b162c8c8) -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. 機械学習入門 vol.6 回帰 - 線形回帰 -> 講座第4回に相当
1. [機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング](https://qiita.com/mychaelstyle/items/48238d70c7602ca14a0c) -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. [機械学習入門 vol.9 判別（分類）](https://qiita.com/mychaelstyle/items/34ca447a625c752dbfda) -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

# 機械学習入門 vol.6 回帰 - 線形回帰

回帰の手法として線形回帰、決定木による回帰の代表としてランダムフォレストの仕組み、近傍法の代表としてk近傍法を取り上げて説明しました。そのソースコードを紹介します。

## 線形回帰

線形回帰のクラスはLinearRegressionです。線形回帰で学習させて、検証用データの予測を実行し、mean_absolute_errorで絶対値誤差平均を確認することで、検証用データの予測がどれくらいズレるのかという確認をする流れを説明しました。

本ページのプログラムは、プログラム実行ファイルと同じフォルダに下記データファイルが保存されていることを前提として書いています。ダウンロードしてご利用ください。

[data.xlsx](https://docs.google.com/spreadsheets/d/1HZacWBy9WnFYkKd0HJQdno_Pmx1cGibm/edit?usp=sharing&ouid=106210867555036201160&rtpof=true&sd=true)
[data.csv](https://drive.google.com/file/d/1ntEMB0tTxJ4fu2wTxVoi4SRb8TR56xYi/view?usp=sharing)

最初にPandasでデータを読み込んでおきましょう。

```python
import pandas as pd
# Pandasでデータを読み込みます
df = pd.read_excel('./data.xlsx', sheet_name='データ')
# ラベル間違いを直しておきます。
df = df.rename(columns={"合憲点数":"合計点数"})
df
```

必要なライブラリのインポートは下記の通りです。

```Python
# 線形回帰のクラス
from sklearn.linear_model import LinearRegression
# テストデータセット分割関数
from sklearn.model_selection import train_test_split
# 精度検証
from sklearn.metrics import mean_absolute_error
```

データフレームから機械学習のためにデータを取り出して学習します。この回では「週の学習時間から取れる合計点数を予測する」機械学習を行います。scikit-learnの機械学習クラスは、教師あり学習の場合、基本的にfitメソッドで学習すると覚えておいて差し支えないでしょう。

```python
# 学習時間と合計点数を取り出し
data_x = df[['週の学習時間']]
data_y = df[['合計点数']]
# データをトレーニング用と検証用に分割
train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2)
# 線形回帰クラスのインスタンス作成
lr_model = LinearRegression()
# 学習させる
lr_model.fit(train_x, train_y)
```

テストデータに対して予測して結果を取得します。予測をする場合は他のクラスでも基本的にpredictメソッドを利用します。

```python
# テストデータを予測する
predicteds = lr_model.predict(test_x)
predicteds
```

線形回帰の学習で得られた傾きを切片を表示してみます。

```python
# 傾きと切片を表示
print(lr_model.coef_)  # 傾き
print(lr_model.intercept_)  # 切片
```

予測値と正解をデータフレームを結合して見比べてみましょう。

```python
# テストデータの予測と結果を比較する
df2 = test_x.copy()
df2['予測'] = predicteds
df2['予測'] = df2['予測'].round().astype("int")
df2['正解'] = test_y
df2['差分'] = df2['予測'] - df2['正解']
df2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28471/3e7fe18c-aaf4-ebf9-6f83-795a24fbe528.png)

検証用データの予測と正解を回帰直線付きグラフで見比べてみましょう。検証用データは学習に利用されていないのでずれが出ていることが見て取れます。

```python
# グラフで表示
df2 = test_x.copy()
df2['点数'] = predicteds
df2['種別'] = "予測"
df3 = test_x.copy()
df3['点数'] = test_y
df3['種別'] = "正解"
df2 = df2.append(df3)

sb.lmplot(x="週の学習時間", y="点数", hue="種別", data=df2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28471/0f062acf-121a-7fe4-c280-8ead20e5edec.png)
予測と正解のずれを数値で把握するための手法として「平均絶対誤差」と「平均二乗誤差」の説明をしました。平均絶対誤差を表示してみましょう。

```python
# 精度検証（平均絶対誤差）
mean_absolute_error(test_y, predicteds)
```

平均二乗誤差をみたい時はmean_squared_error関数を使います。
スケールが小さい場合、誤差を細かくみないといけない場合は平均二乗誤差、それ以外は平均絶対誤差を見る程度の認識で使い分けていくと良いでしょう。

最後に任意の値（ここでは1時間勉強した時と8時間勉強した時）に取得できる合計点数を予測してみましょう。

```python
# 適当な週の学習時間から合計点数を予測する
data_array = [[1],[8]]
results = lr_model.predict(data_array)
results
```

値の渡し方が、配列の配列になっている点に注目して覚えておきましょう。１行のデータが複数のパラメータを持っている場合にも利用できるように作られているからです。基本的にscikit-learnのライブラリ全体でこの渡し方をすることになります。さらに詳しく知りたい方はnumpyも調べてみると良いですが、本講座でnumpyの深掘りは対象外とさせていただいています。

## 複数のパラメータから一つの値を予測してみる

```python
#
# ５教科の点数から週の学習時間を予測してみる
#
# 5教科の点数を学習データ、正解を週の学習時間として取り出す
data_x = df.loc[:,'国語':'社会']
data_y = df['週の学習時間']
# データをトレーニング用と検証用に分割
train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2)
lr_model2 = LinearRegression()
# 学習させる
lr_model2.fit(train_x, train_y)
# 各次元の傾きと切片を表示
print(lr_model2.coef_)
print(lr_model2.intercept_)
```
検証用データに対して予測してみましょう

```python
# 検証用データを予測する
predicteds = lr_model2.predict(test_x)
predicteds
```
精度を検証してみましょう

```python
# 精度検証
mean_absolute_error(test_y, predicteds)
```

## 複数の値を予測する

LinearRegressionはscikit-learnの共通インターフェースに合わせて、正解データを複数一度に学習・予測できるように実装されています。
次は、週の学習時間から、５教科それぞれの点数を予測するように学習してみましょう。

```python
#
# ５教科の点数をそれぞれ予測してみる
#
# 学習時間と合計点数を取り出し
data_x = df[['週の学習時間']]
data_y = df.loc[:,'国語':'社会']
# データをトレーニング用と検証用に分割
train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2)
lr_model3 = LinearRegression()
# 学習させる
lr_model3.fit(train_x, train_y)
# 各次元の傾きと切片を表示
print(lr_model3.coef_)
print(lr_model3.intercept_)
```
傾きと切片がそれぞれ５つ計算されていることが見て取れます。

こちらも予測して精度検証してみましょう。

```python
# テストデータを予測する
predicteds = lr_model3.predict(test_x)
predicteds
# 精度検証
mean_absolute_error(test_y, predicteds)
```

線形回帰だけでweb記事としては長くなってしまったので決定木による回帰、近傍法による回帰は記事を分割して配信したいと思います。


# 機械学習入門シリーズ記事

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. [機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール](https://qiita.com/mychaelstyle/items/d5506f372219b162c8c8) -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. 機械学習入門 vol.6 回帰 - 線形回帰 -> 講座第4回に相当
1. [機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング](https://qiita.com/mychaelstyle/items/48238d70c7602ca14a0c) -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. [機械学習入門 vol.9 判別（分類）](https://qiita.com/mychaelstyle/items/34ca447a625c752dbfda) -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

AI/DX/機械学習/Pythonのアドバイザリー、社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)