👨💻
Python&機械学習入門1
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 - これから出てくる数式のサイズ感を覚えるための簡単な説明。
転置、単位行列、逆行列
やっぱりイージーなのでパス
ベクトルで微分
- The Matrix Cookbook 2.4 章に有用な公式が多い。
単回帰分析
入力変数が一つ。複数利用する場合は重回帰分析。
問題設定:家賃予測
1.学習:広さ - 家賃データセットでモデルを学習。
2.推論:学習されたモデルに新しい幅
Step1: モデルを決めよう
- モデルを選ぶのは人の仕事
- 目的:データセットに基づいて適切なパラメータを決定しよう。
- データの中心化(Centering):求めるべきパラメータが少なくなる。
Step2: 評価関数を決めよう
-
適正を決めよう→ 評価関数 (損失関数)
を決めよう\mathcal{L} - MSE(Mean Squared Error)
- RMSE(Root Mean Squared Error)
- MAE(Mean Absolute Error)
Latex の文法を自分で書くのが面倒なので、ChatGPT に任せたところ、素晴らしい結果が出た!(秘密)
Step3: 評価関数を最小化しよう
- Step3-1: 式変形、
を評価関数に代入する。\hat{y_{i}}= ax_{i} - Step3-2: 最適なパラメータ
を求める。a
重回帰分析 1
Step1: モデルを決めよう
Step2: 評価関数を決めよう
- パラメータは
と\omega :b 個。M+1 - 評価関数は単回帰分析と同じ。
Step3: 評価関数を最小化しよう
- Step3-1: 式変数、
を評価関数に代入する。\hat{y}= X\omega
- Step3-2: 最適なパラメータを求めよう
- あえて
と書かないのは、\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}입니다')
単回帰分析の実装
- 単回帰分析の勾配を求める式
- 使用するサンプルのデータ
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() # 凡例表示
Discussion