機械学習初心者が単回帰分析のコードを書いてみた

## はじめに
近年、ChatGPTが世に普及して人工知能(AI)の存在が身近になってきましたね。
人工知能の話題で「機械学習」「ディープラーニング」というのを耳にするのですが、私自身、言葉だけ知っていて中身をよく知らない状況でした。良い機会だと思ったので、機械学習の基本的な部分を学んでみました。アウトプットの場として本記事を書いてみます。

## 機械学習とは

まず、人工知能(AI)について触れておきます。人工知能という言葉の定義は明確に定まっていないですが、「人間の知能や知的活動を再現したもの」という意見で概ね一致しています。血液疾患の患者を診断することができるMYCINや囲碁を打つことのできるAlphaGoなどさまざまな人工知能が開発されています。

さて、本題の機械学習とは、「**コンピュータを使ってデータから統計的に法則を見つけ出す手法**」のことで、この手法が人工知能を開発するときによく用いられるので、人工知能と機械学習はセットで登場することが多いです。

ざっくりと機械学習の流れは、以下です。
①データをコンピュータに渡す
②データを基に学習(計算)して、パラメータを最適化する


私の中で一番しっくりきた解釈は、**同じ入力値であっても、時間によって出力される結果が異なる**というのが機械学習の特徴であるということです。
解釈をイメージ化してみました。

### 通常のプログラム
![通常のプログラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/41703c7b-ff70-05cb-68a2-1bfbcbbe5337.png)

### 機械学習を取り入れたプログラム
![機械学習を取り入れたプログラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/ebaf7ba9-4c9f-7edb-28b0-0e2a6b8e40ff.png)

「どのような入力をしてどのような出力をするのか」
「どのような学習をさせるのか」
「どのようにパラメータを最適化するのか」はさまざまです。
特徴によって、「単回帰分析」「ロジスティック回帰分析」「ニューラルネットワーク」等といった名前がつけられています。

また、機械学習を理解するうえで重要な用語を紹介しておきます。(本記事でも利用していきます)
**説明変数**・・・予測に使用するデータ(イメージ図での入力値)
**目的変数**・・・予測したいデータ(イメージ図での出力値)
**量的データ**・・・各データの大きさが比較できるデータ 例）身長、体重など
**質的データ**・・・各データの大きさが比較できないデータ 例）男性、女性など

## 機械学習の種類
先述の通り、機械学習ではデータをコンピュータに学習させます。この学習には種類があります。
基本情報や応用情報でも出題されるような話題なので、整理できれば得点につながると思います。（午前80問中の1問程度の出題ではありますが）

### 教師あり学習
学習に使用するデータと正解となる値(正解ラベル)をセットにして学習する手法
**回帰問題**や**分類問題**に利用される
![教師あり学習.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/712ca16f-2887-e34c-3585-f54b3815dbe1.png)

※回帰問題→量的データである目的変数を予測すること
　例）過去の売上から将来の売上を予測したい
　分類問題→質的データである目的変数を予測すること
　 例）測定情報から健康か不健康か判定したい

### 教師なし学習
学習に使用するデータのみ学習する手法
データの抽出や分析に利用される
![教師なし学習.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/89092910-702a-7e37-1698-7968d68ac243.png)

### 半教師あり学習
一部のデータのみ正解ラベルを付与して学習する方法
![半教師あり学習.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/3a52049f-f7b2-53ba-be95-ddcbb3e9567a.png)

### 強化学習
行動の結果として得られる**報酬**が最大化するように行動方針を学習する方法

## 単回帰分析とは
単回帰分析はシンプルな回帰手法です。
単回帰分析とは、集められた実際のデータをグラフにプロットした際に、データの中心を通るような直線(以降、**回帰直線**と呼びます)から目的変数を予測する手法のことです。

![回帰直線.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/feaae8ff-0127-7b12-847c-4be1135f1294.png)


順番に整理していきます。

### 「どのような入力をしてどのような出力をするのか」
**1つの**説明変数から目的変数を予測します。
どちらも量的データを扱います。

### 「どのような学習をさせるのか」
教師あり学習を用います。
回帰を行います。

### 「どのようにパラメータを最適化するのか」

単回帰分析でのパラメータとは、回帰直線の**切片**と**傾き**を指します。(y=**w0**+**w1***x)
パラメータを最適化するには、**最小二乗法**という手法が用いられます。

最小二乗法の考え方は、「各データと直線の距離を二乗した値の合計が最も小さくなる値が最適である」というものです。
最小二乗法の計算は、本記事では割愛しますが、理解しやすかった動画のURLを[参考]に載せています。
回帰直線を求めてしまえば、直線の式に説明変数を代入して、目的変数を簡単に予測することができます。

## 実際にコードを書いてみる
では、簡単な単回帰分析のコードを書いてみます。
テーマは「身長から体重を予測する」にしました。

### イメージ図
まずは、整理するため、イメージ図に落とし込んでみます。

![単回帰分析.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/989b3064-f663-6fa2-2dba-ee1d6b9d93e9.png)

### 予測精度
単回帰分析をした結果の予測の精度を知ることは重要なので、**決定係数**を指標として用います。
決定係数とは、回帰直線の当てはまり度合いの指標になります。0から1の値をとり、1に近いほど予測精度が高いとなります。

### ソースコード
今回はpythonを用います。
numpyのpolyfitで最小二乗法を、r2_scoreで決定係数を計算できてしまうので、かなりシンプルなコードで単回帰分析を実現できます。
```
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score

# 学習させるデータを定義（説明変数：身長(cm)、目的変数：体重(kg)）
df = np.array([[138,33],[148,38],[158,50],[165,55],[170,56]])
x = df[:, 0]
y = df[:, 1]

# 傾きと切片を求める(最小二乗法)
w1, w0 = np.polyfit(x, y, 1)

# 回帰直線を求める
fx = w0 + w1 * x

#　データと回帰直線をグラフに表示
plt.scatter(x, y)
plt.plot(x, fx)

# 身長から体重を予測する
height = input("あなたの身長(cm)を入力してください。>")
weight = w0 + w1 * int(height)
print("あなたの体重は{}kgです。".format(weight))

# 決定係数を求める
print("決定係数は{}です。".format(r2_score(y, fx)))

```

### 結果
データ5個の単回帰分析
```
df = np.array([[138,33],[148,38],[158,50],[165,55],[170,56]])
```
![単回帰分析5個.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/89319f28-be7d-ebda-1689-07de71326d43.png)


データ10個の単回帰分析
```
df = np.array([[138,33],[148,38],[158,50],[165,55],[170,56],
               [175,55],[172,58],[168,51],[171,52],[166,55]])
```
![単回帰分析10個.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777029/4d6b8357-061f-8c89-6102-aba658de6776.png)

同じ170cmの体重を求めようとしているので、予測結果が異なりました。
私なりに解釈していた機械学習の特徴を結果として得ることができました！
また、今回はデータ数が少なかったため、決定係数がかなり変動する結果となりました。
もっと大量のデータであれば決定係数の予測精度分析は活きてくるのかと思います。

## おわりに
pythonを使って単回帰分析のコードを書いてみました。
機械学習には他の手法もたくさんあるので、機会があれば触れてみたいと思います。

## 参考
インプットに使用した教材
### 機械学習とは

https://bookstore.tac-school.co.jp/book/detail/110101/

### 単回帰分析とは

https://www.youtube.com/watch?v=z0C66ijroVQ

### 最小二乗法とは

https://www.youtube.com/watch?v=Zz1sgYxrA-k