-
Notifications
You must be signed in to change notification settings - Fork 4
/
b_log_anscombe_default.py
66 lines (63 loc) · 2.65 KB
/
b_log_anscombe_default.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# %% 手順4 実験結果のロギング
import mlflow
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 次数を指定して多項式回帰を実行するメソッド
def poly_regression(n, X, y, ax):
# テストデータ分割
X_train, X_test, y_train, y_test = train_test_split(X, y,
shuffle=True, random_state=42,
test_size=0.5)
# 多項式変換
pf = PolynomialFeatures(degree=n)
pf.fit(X_train)
X_train_poly = pf.transform(X_train)
X_test_poly = pf.transform(X_test)
# 回帰
lr = LinearRegression()
lr.fit(X_train_poly, y_train)
y_pred = lr.predict(X_test_poly)
# R2スコアで性能評価
r2 = r2_score(y_test, y_pred)
mlflow.log_metric(f'r2_degree{n}', r2) # スコアをMetricsとして記録
# グラフ作成
X_view = np.linspace(np.amin(X), np.amax(X), 200).reshape(200, 1)
X_view_poly = pf.transform(X_view)
y_pred_view = lr.predict(X_view_poly) # 回帰線を作成
ax.scatter(X_test.ravel(), y_test) # テストデータを散布図プロット
ax.plot(X_view.ravel(), y_pred_view, c='red') # 回帰線をプロット
ax.set_title(f'Degree={n}')
# 次数を変えてスコアを評価するメソッド
def validate_degrees(data, dataset_name):
# Runを開始
with mlflow.start_run() as run:
# データセットを選択
data_selected = data[data['dataset'] == dataset_name]
X = data_selected['x'].to_numpy().reshape(len(data_selected), 1)
y = data_selected['y'].to_numpy()
mlflow.log_param('dataset', dataset_name) # データセット名をParametersとして記録
# グラフ用のfig, axesを作成
fig, axes = plt.subplots(1, 4, figsize=(18, 4))
# 次数を変えてスコアを評価
for n in range(1, 5):
poly_regression(n, X, y, axes[n - 1])
# グラフをArtifactとして保存
fig.suptitle(f'Dataset={dataset_name}', size=16)
mlflow.log_figure(fig, f'figure_{dataset_name}.png')
plt.show()
# 全てのデータセットでスコアの評価を実行
data = sns.load_dataset('anscombe')
# データセット1の評価
validate_degrees(data, 'I')
# データセット2の評価
validate_degrees(data, 'II')
# データセット3の評価
validate_degrees(data, 'III')
# データセット4の評価
validate_degrees(data, 'IV')
# %%