👨‍💻

Python&機械学習入門1

2023/05/06に公開

Notes

本記事は、Kikagaku の無料講座「Python&機械学習入門」の講義ノートの最初のノートです。
以下のリストは当該講座のカリキュラムであり、本ノートは「1.導入」から「7.単回帰分析の実装」までの内容を簡単にまとめたものです。

Curriculum (401/548) > **Curriculum (401/548)
1.導入 (42 min)
2. 微分 (49 min)
3.線形代数 (55 min)
4.単回帰分析 (52 min) > 5.重回帰分析 (56 min)
5.重回帰分析 (56 min) > 6.
6.Python 属性講義 (101 min)
7. 単回帰分析の実装 (51 min)

8.重回帰分析の実装 (27 min)
9.演習問題 (52 min)
10.統計学 (32 min)
11.重回帰分析 2 (31min)

Intro

人工知能・機械学習・ディープラーニングとは?

  • 人工知能(AI)⊃機械学習⊃ディープラーニング

機械学習に必要な数学

  • 微積分、線形代数、確率統計学
  • 最初からこの 3 つの数学を全部勉強するのは難しい。
  • 最初は微分と線形代数から始まり、ベイズ統計を勉強する段階から積分と展開。

機械学習の 3 大トピック

  • 教師学習:入力 x と出力 y一般的なビジネスの現場で使われます。
    • 回帰: " 数値 " 予測
    • 坪数と家賃との関係

分類: " カテゴリ " 予測

  • 白ワイン or 赤ワイン
  • 比較史学習:入力 xのみ存在
    • クラスタリング: 目からウロコを見分ける感じ。正確な分類、出力 y が存在しない。
    • 次元縮小: 入力変数 (次元) を減らす。数学的に変数が多いとモデルがうまく動かない場合がある。
  • 強化学習データがない、またはほとんどない
    • 掃除ロボット:最初の起動時は部屋の構造を知らないが、徐々に部屋の構造を把握していく。
    • AlphaGo:自分で棋譜を作って学習。

簡単な機械学習と内挿・外挿について

Input Data 1 Data 2 予測 1 Data 3 予測 2
x 1 2 3 4 5
y 2 4 6 8 10
内挿 外挿
  • 人は y=2x を予測しやすいが、コンピュータは予測しにくい。
  • 機械学習ではデータの範囲内、つまり内挿は保証するが、外挿は保証しない。
    • では、将来の値を予測する株式予測はどうだろうか?
    • 時系列を基準にすると範囲外を予測するが、価格を基準にするとある程度範囲を決めることができる。
    • しかし、範囲外の価格については外挿となるため、モデルを新たに作成する必要がある。

微分

微分はどこに使われるのか

  • 微分で接線の傾きを求めることができる。
  • 接線の傾き=0を利用することで、ある関数が最小 (あるいは最大) になる点を求めることができます。

微分(導関数)1、微分(導関数)2、微分の公式、偏微分

導関数や公式、偏微分は知ってるだろうからパスして使い方だけまとめ


線形代数

スカラー・ベクトル・行列

  • スカラー→ベクトル→行列→テンソル (行列の集合)

行列の演算、練習問題

簡単な足し算、引き算、内積

サイズ感

  • x^T y =スカラー, Xy =ベクトル, x^TAy =スカラー
  • これから出てくる数式のサイズ感を覚えるための簡単な説明。

転置、単位行列、逆行列

やっぱりイージーなのでパス

ベクトルで微分

\frac{\partial}{\partial x}(C) = \mathbf{0} \\ \frac{\partial}{\partial x}(b^{T}x) = b \\ \frac{\partial}{\partial x}(x^{T}Ax) =(A+A^{T})x

単回帰分析

入力変数が一つ。複数利用する場合は重回帰分析。

問題設定:家賃予測

1.学習:広さ - 家賃データセットでモデルを学習。
2.推論:学習されたモデルに新しい幅 x を入れて、家賃予測値 \hat{y} を推論。

Step1: モデルを決めよう

  • モデルを選ぶのは人の仕事
  • 目的:データセットに基づいて適切なパラメータを決定しよう。
  • データの中心化(Centering):求めるべきパラメータが少なくなる。

Step2: 評価関数を決めよう

  • 適正を決めよう→ 評価関数 (損失関数) \mathcal{L} を決めよう
  • MSE(Mean Squared Error)
MSE = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_{i})^{2}\\ = (y-\hat{y})^{T}(y-\hat{y})
  • RMSE(Root Mean Squared Error)
RMSE = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2}
  • MAE(Mean Absolute Error)
MAE = \frac{1}{N}\sum_{i=1}^{N}\left|y_i - \hat{y}_i\right|
  • Latex の文法を自分で書くのが面倒なので、ChatGPT に任せたところ、素晴らしい結果が出た!(秘密)

Step3: 評価関数を最小化しよう

\frac{\partial}{\partial a^{T}} (\mathcal{L}) = 0
  • Step3-1: 式変形、\hat{y_{i}}= ax_{i} を評価関数に代入する。
  • Step3-2: 最適なパラメータ a を求める。

重回帰分析 1

Step1: モデルを決めよう

\hat{y} = \omega_{1}x_{1} + \omega_{2}x_{2} + \cdots + \omega_{M}x_{M} + b\\ = \omega_{0}x_{0} + \omega_{1}x_{1} + \cdots + \omega_{M}x_{M} \quad (b=\omega_{0}x_{0}) \\ = \begin{bmatrix} \omega_{0} & \omega_{1} & \cdots & \omega_{M} \end{bmatrix} \begin{bmatrix} x_{0} \\ x_{1} \\ \vdots \\ x_{M} \end{bmatrix} = \omega^{T}x \\ =\begin{bmatrix} x_{0} & x_{1} & \cdots & x_{M} \end{bmatrix} \begin{bmatrix} \omega_{0} \\ \omega_{1} \\ \vdots \\ \omega_{M} \end{bmatrix} = x^{T}\omega = X\omega

Step2: 評価関数を決めよう

  • パラメータは \omegab: M+1 個。
  • 評価関数は単回帰分析と同じ。
\mathcal{L} = (y-\hat{y})^{T}(y-\hat{y})

Step3: 評価関数を最小化しよう

  • Step3-1: 式変数、\hat{y}= X\omega を評価関数に代入する。
\mathcal{L} = y^{T}y - 2y^{T}X\omega + \omega^{T}X^{T}X\omega \\ = C + b^{T}\omega + \omega^{T}A\omega \quad (\text{Scalar}\; C=y^{T}y,\; b=-2X^{T}y,\; A=X^{T}X )
  • Step3-2: 最適なパラメータを求めよう
\frac{\partial}{\partial\omega} (\mathcal{L}) = \mathbf{0} \\ = b + (A+A^{T})\omega \\ = -2X^{T}y + 2X^{T}X\omega
X^{T}X\omega = X^{T}y \\ \omega = (X^{T}X)^{-1}X^{T}y
  • あえて \omega = X^{-1}y と書かないのは、X が正方行列でない可能性があるため。逆行列の必要条件が正方行列
    • 厳密には正方行列であっても逆行列が存在しないこともある。

Python 速習

環境構築

  • ファイルアップロード時の注意事項
  • ランタイムが 12 時間を超えて終了すると、再接続後に再アップが必要。
  • ランタイムの種類を変更した場合にも再接続となるため、再アップが必要。

変数

  • 数値: int, float
  • 文字列: str, 加算可能
  • リスト[ ].
    • .append()
  • タプル( ):要素変更不可
  • 辞書 {key : value }
    • 辞書要素追加: results[key] = value
  • Bull

基本構文

  • 比較演算子
  • エスケープシーケンス:\n (newline), \t (tab)

制御構文

  • for 文 (繰り返し)
    • range(), len()
    • zip(a, b): それぞれから要素を一つずつ取り出す。
numbers = [1,2,3]
animals = ['dog', 'cat', 'bird']
for number, animal in zip(numbers, animals):
	print(number)
	print(animal)
  • if 文 (条件分岐)

関数

  • {}と.format()
def say_hello(name):
	print("안녕하세요. {}입니다.".format(name))
  • f と{ }
def say_hello(name):
	print(f"안녕하세요. {name}입니다.")
  • デフォルトの設定
def calc(a=2, b=3):
	return a + b

calc()
calc(3)
calc(b=4)

クラスの基礎

  • init 関数:初期化
  • call 関数:インスタンスに対して引数を入れることで実行可能。
class Person:
	
	# 初期化
	def __init__(self, name, nationality, age):
	    self.name = name
	    self.nationality = nationality
	    self.age = age
	# Call
	def say_hello(self, name):
		print(f'안녕하세요, {name} 씨. 저는 {self.name}입니다')
		
	# 関数
	def say_hello(self, name):
		print(f'안녕하세요, {name} 씨. 저는 {self.name}입니다')

単回帰分析の実装

  • 単回帰分析の勾配を求める式
a = \frac{\displaystyle\sum_{n=1}^{N} x_{n}y_{n}}{\displaystyle\sum_{n=1}^{N} x_{n}^{2}}= \frac{xy}{|x|^{2}}
  • 使用するサンプルのデータ
x y
1 2
2 3.9
3 6.1

NumPy の速習

  • ベクトル: np.array( [[ ]] )
    • 転置するときに使いやすいように括弧を 2 重に。
  • 平均 .mean()
  • データ中心化
  • a$ の算出
    • 要素積と合計 .sum()

Pandas / Matplotlib 属性講座

Pandas

import pandas as pd
# df = dataframe
df = pd.read_csv('/content/drive/MyDrive/1. Projects/Kikagaku/1. Python&機械学習入門/sample.csv')
df.head(3) #先頭から〜行を表示する
df.tail(3) # 後ろから〜行を表示する
df[2:10] # リストと同様
df.iloc[1,1] # .iloc[row, column] 行と列に分割して表示する
# column名を指定して取得
x = df['x']
y = df['y'

Matplotlib

import matplotlib.pyplot as plt

fig = plt.figure(figsize = (10,8))
ax = fig.add_subplot(1,1,1)

ax.scatter(x,y, c='red');

ax.set_title('first scatter')

ax.set_xlabel('x')
ax.set_ylabel('y')

Numpy の実装

df.describe() # 各種計算値の表現
df.mean() # 平均
plt.legend() # 凡例表示

予測

y - \hat{y} = a(x-\hat{x}) \\ \rightarrow y = a(x-\hat{x}) + \hat{y}

Discussion