👨💻
Python&機械学習入門2(完)
ノート
本記事は、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)
重回帰分析の実装
練習問題: 重回帰分析の計算
データセット
必要な知識
- ベクトル、行列の定義: np.array( [ [ [ ] ] )
- 転置: .T
- 逆行列: np.linalg.inv( )
- 行列積: np.dot( A, B )
順番
1.Step1:
2.Step2:
3.Step3:
4.Step4:
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}
- 母分散を求める式に母平均の代わりに標本平均を入れるとスケールが
- 母分散 or 標本分散 : データが母集団か標本か。 通常は母集団全体のデータがないので標本分散を利用。
- 標準偏差
: 元のスケールで議論できる。\sigma
~~練習問題
正規分布と3$\sigma$法
- 正規分布を利用する理由
- 数式で扱いやすい
- 物理現象としてよく出てくる
-
: 99.7%.3\sigma - 異常値検出に使用
- Hampel判別法:平均の代わりに中央値を利用。
- 異常値により平均が正確でない場合もあるため、使用されることもある。
スケーリング
- Standard Scaling (データ標準化) 各変数のスケールを合わせるために、各変数の分布を標準正規分布 (平均0、標準偏差1 の正規分布) に変更する
- すると、
の値によって、どの変数が重要なのかが大体分かる\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