👨‍💻

Python&機械学習入門2(完)

2023/05/06に公開

ノート

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

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


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

重回帰分析の実装

練習問題: 重回帰分析の計算

データセット

\mathbf{X} = \begin{bmatrix}   1 & 2 & 3 \\   1 & 2 & 5 \\   1 & 3 & 4 \\   1 & 5 & 9 \end{bmatrix} , \mathbf{y} = \begin{bmatrix}   1 \\ 5 \\ 6 \\ 8 \end{bmatrix}

必要な知識

  \mathbf{w} = (\mathbf{X}^{\text{T}} \mathbf{X})^{-1} \mathbf{X}^{\text{T}} \mathbf{y}
  • ベクトル、行列の定義: np.array( [ [ [ ] ] )
  • 転置: .T
  • 逆行列: np.linalg.inv( )
  • 行列積: np.dot( A, B )

順番

1.Step1: \mathbf{X}^{\text{T}} \mathbf{X}
2.Step2: (\mathbf{X}^{\text{T}} \mathbf{X})^{-1}
3.Step3: \mathbf{X}^{\text{T}} \mathbf{y}
4.Step4: \mathbf{w} = (\mathbf{X}^{\text{T}} \mathbf{X})^{-1} \mathbf{X}^{\text{T}} \mathbf{y}

Scikit-learn で実装

from sklearn.linear_model import LinearRegression
import numpy as np

X = np.array([
			  [1,2,3],
			  [1,2,5],
			  [1,3,4],
			  [1,5,9]
])

y = np.array([
			  [1],
			  [5],
			  [6],
			  [8]
])

# モデルの宣言
model = LinearRegression(fit_intercept=False)
# モデルの学習
model.fit(X, y)
# パラメータ確認
model.coef_
# 予測精度確認 (決定係数 0~1)
model.score(X, y)
# 予測
x_new = np.array([
				  [1, 3, 6]
])
y_pred = model.predict(x_new)

練習問題

データの読み込み

import numpy as np
import pandas as pd

# 데이터 읽어오기
df = pd.read_csv('/~/~/~.csv')

# 데이터 정보 확인, 읽어온 후에 반드시 확인하는 걸 추천
df.info()

분포의 확인

import seaborn as sns
sns.set() # 격자표시

# 히스토그램 표시
sns.displot(df['x6'], bins = 10) # bins는 구간수

# 상관계수 산출
df.corr()
# 상관계수를 알 수 있는 분포표
sns.pairplot(df) # 그래프가 많아 처리 시간이 김

入力変数と出力変数の分割

いろいろな方法がありますが、使いやすいものを使いましょう。

X = df.iloc[:, :13]
y = df.iloc[:, -1]
X = df.drop('y', axis = 1)
y = df['y']

モデルの構築と検証

'Scikit-learnで実装'と同じです。

トレーニングデータと検証データ

from sklearn.model_selection import train_test_split

# 訓練データと検証データを分ける
X_train, X_test, t_train, t_test = train_test_split(X, t, test_size = 0.4, random_state=1) # random_state は難数シードの固定(再現性確保)

モデル学習と検証などは同じ

予測値の計算とモデルの保存

注意事項

# 변수의 차원에는 항상 신경쓰도록
np.array(sample).reshape(1,-1).shape # 조금 복잡한 reshape
y_pred = model.predict([sample]) # 위처럼 reshape해도 되지만, 이처럼 [sample]도 가능

モデル保存と読み込み

import joblib
# モデル保存
joblib.dump(model, 'model.pkl')
# 読み込み
model_new = joblib.load('/content/drive/MyDrive/1. Projects/Kikagaku/1. Python&機械学習入門/model.pkl')

パラメータの確認

# パラメータを見やすく
np.set_printoptions(precision=3, suppress=True) # 有効桁数、指数形式
model.coef_
  • \mathbf{w} の値を確認するだけでは、どの変数の影響が大きいか判断できない。そもそも x_i のスケール感がバラバラだからです。

統計

主な統計量

  • 平均 \bar{x}
  • 分散 \sigma^{2}
    • 母分散 or 標本分散 : データが母集団か標本か。 通常は母集団全体のデータがないので標本分散を利用。
      • 母分散を求める式に母平均の代わりに標本平均を入れるとスケールが \frac{N-1}{N} 倍になるから。
  • 標準偏差 \sigma : 元のスケールで議論できる。

~~練習問題

正規分布と3$\sigma$法

  • 正規分布を利用する理由
    • 数式で扱いやすい
    • 物理現象としてよく出てくる
  • 3\sigma : 99.7%.
    • 異常値検出に使用
    • Hampel判別法:平均の代わりに中央値を利用。
      • 異常値により平均が正確でない場合もあるため、使用されることもある。

スケーリング

  • Standard Scaling (データ標準化) 各変数のスケールを合わせるために、各変数の分布を標準正規分布 (平均0、標準偏差1 の正規分布) に変更する
x_{s}= \frac{x-\bar{x}}{\sigma}
  • すると、\mathbf{w} の値によって、どの変数が重要なのかが大体分かる

重回帰分析 2

異常値除去+スケーリング+重回帰分析

  • モデルの精度を上げる方法
    • 異常値除去
    • 異常値を平均や中央値に補間
    • 主成分分析などを使って潜在変数に変換させた後、3\sigma法を適用する。

異常値除去

import numpy as np
import pandas as pd

# データの読み込み
df = pd.read_csv('/~/~/~.csv')

# 異常値除去後の_df
_df = df

cols = df.columns
for col in cols:
	# 3σ法の上下限を設定
	low = mean[col] - 3 * sigma[col]
	high = mean[col] + 3 * sigma[col]
	# 条件で絞り込む
	_df = _df[(_df[col] >= low) & (_df[col] <= high)]

モデル構築

  • 理科学習(オーバーフィッティング)
    • 科学学習を防ぐ具体的な方法については、Kikagakuの「脱ブラックボックスコース」で学ぶことができます。

スケーリングを考慮した重回帰分析

# scikit-learn 内臓のスケーラー import
from sklearn.preprocessing import StandardScaler

# インスタンス化
scaler = StandardScaler()

# スケーラー学習 (平均と標準偏差算出)
scaler.fit(X_train)
# 訓練データのみを用いる

# scaling
X_train2 = scaler.transform(X_train)
X_test2 = scaler.transform(X_test)

# モデルの学習
model = LinearRegression().fit(X_train2, y_train)

# 検証(訓練データ)
model.score(X_train2, y_train)

# 検証(検証データ)
model.score(X_test2, y_test)

# weight 確認
sns.barplot(x=X.columns, y=model.coef_)
  • 重回帰分析はスケーリングによって精度が変わらない。
  • スケーリングは weight を確認するためのもの。

Discussion