調べたことやコード変更した内容について下記のようにコメントを入れることにしています。
#【コメント】コメントです
from google.colab import drive
drive.mount('/content/drive')
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#seaborn設定
sns.set()
#背景変更
sns.set_style("darkgrid", {'grid.linestyle': '--'})
#大きさ(スケール変更)
sns.set_context("paper")
n=100
def true_func(x):
z = 1-48*x+218*x**2-315*x**3+145*x**4
return z
def linear_func(x):
z = x
return z
真の関数:xの4次関数
# 真の関数からノイズを伴うデータを生成
# 真の関数からデータ生成
data = np.random.rand(n).astype(np.float32)
#【コメント】乱数でデータのx座標を生成
#【コメント】一様分布で0.0-1.0の乱数
data = np.sort(data)
#【コメント】ここでソートする必要性が謎
target = true_func(data)
#【コメント】対応するy座標の生成
# ノイズを加える
noise = 0.5 * np.random.randn(n)
target = target + noise
#【コメント】標準正規分布に従う乱数-0.5~+0.5
# ノイズ付きデータを描画
plt.scatter(data, target)
plt.title('NonLinear Regression')
plt.legend(loc=2)
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
#【コメント】線形回帰モデル
#【コメント】clfはclassifier(分類器)の略らしい
data = data.reshape(-1,1)
#【コメント】縦ベクトルに変換
target = target.reshape(-1,1)
#【コメント】縦ベクトルに変換
clf.fit(data, target)
p_lin = clf.predict(data)
plt.scatter(data, target, label='data')
plt.plot(data, p_lin, color='darkorange', marker='', linestyle='-', linewidth=1, markersize=6, label='linear regression')
plt.legend()
print(clf.score(data, target))
#【コメント】決定係数を出力⇒0.251
from sklearn.kernel_ridge import KernelRidge
clf = KernelRidge(alpha=0.0002, kernel='rbf')
#【コメント】カーネルリッジ回帰モデル
#【コメント】alphaは正則化係数
#【コメント】kernelは基底関数?
clf.fit(data, target)
p_kridge = clf.predict(data)
plt.scatter(data, target, color='blue', label='data')
plt.plot(data, p_kridge, color='orange', linestyle='-', linewidth=3, markersize=6, label='kernel ridge')
plt.legend()
#plt.plot(data, p, color='orange', marker='o', linestyle='-', linewidth=1, markersize=6)
print(clf.score(data, target))
#【コメント】決定係数を出力⇒0.857!
#Ridge
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.linear_model import Ridge
kx = rbf_kernel(X=data, Y=data, gamma=50)
#KX = rbf_kernel(X, x)
#【コメント】(100,100)の配列
#【コメント】説明変数を関数で変換(これをカーネルという?)
#clf = LinearRegression()
clf = Ridge(alpha=30)
#【コメント】リッジ回帰モデル
clf.fit(kx, target)
p_ridge = clf.predict(kx)
plt.scatter(data, target,label='data')
for i in range(len(kx)):
plt.plot(data, kx[i], color='black', linestyle='-', linewidth=1, markersize=3, label='rbf', alpha=0.2)
#plt.plot(data, p, color='green', marker='o', linestyle='-', linewidth=0.1, markersize=3)
plt.plot(data, p_ridge, color='green', linestyle='-', linewidth=1, markersize=3,label='ridge regression')
#plt.legend()
print(clf.score(kx, target))
#【コメント】決定係数を出力⇒0.817!
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
#PolynomialFeatures(degree=1)
deg = [1,2,3,4,5,6,7,8,9,10]
for d in deg:
regr = Pipeline([
('poly', PolynomialFeatures(degree=d)),
('linear', LinearRegression())
])
#【コメント】説明変数をd次までのべき乗データを用意したのち線形回帰⇒多項式回帰
regr.fit(data, target)
# make predictions
p_poly = regr.predict(data)
# plot regression result
plt.scatter(data, target, label='data')
plt.plot(data, p_poly, label='polynomial of degree %d' % (d))
#Lasso
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.linear_model import Lasso
kx = rbf_kernel(X=data, Y=data, gamma=5)
#KX = rbf_kernel(X, x)
#lasso_clf = LinearRegression()
lasso_clf = Lasso(alpha=10000, max_iter=1000)
#【コメント】ラッソ回帰
#【コメント】正則化が効きすぎているためモデルの表現力が死んでいる?
lasso_clf.fit(kx, target)
p_lasso = lasso_clf.predict(kx)
plt.scatter(data, target)
#plt.plot(data, p, color='green', marker='o', linestyle='-', linewidth=0.1, markersize=3)
plt.plot(data, p_lasso, color='green', linestyle='-', linewidth=3, markersize=3)
print(lasso_clf.score(kx, target))
from sklearn import model_selection, preprocessing, linear_model, svm
# SVR-rbf
clf_svr = svm.SVR(kernel='rbf', C=1e3, gamma=0.1, epsilon=0.1)
#【コメント】サポートベクター回帰
clf_svr.fit(data, target)
y_rbf = clf_svr.fit(data, target).predict(data)
# plot
plt.scatter(data, target, color='darkorange', label='data')
plt.plot(data, y_rbf, color='red', label='Support Vector Regression (RBF)')
plt.legend()
plt.show()
print(clf.score(kx, target))
#【コメント】決定係数を出力⇒0.387
#【コメント】ハイパーパラメータの調整が必要そう
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.1, random_state=0)
以下では,Googleドライブのマイドライブ直下にstudy_ai_mlフォルダを置くことを仮定しています.必要に応じて,パスを変更してください。
from keras.callbacks import EarlyStopping, TensorBoard, ModelCheckpoint
cb_cp = ModelCheckpoint('/content/drive/My Drive/study_ai_ml_google/skl_ml/out/checkpoints/weights.{epoch:02d}-{val_loss:.2f}.hdf5', verbose=1, save_weights_only=True)
cb_tf = TensorBoard(log_dir='/content/drive/My Drive/study_ai_ml_google/skl_ml/out/tensorBoard', histogram_freq=0)
#【コメント】エラーが出るのでパス名を編集 study_ai_ml → study_ai_ml_google
#【コメント】ディープラーニングなので現段階では実行のみとしておく
def relu_reg_model():
model = Sequential()
model.add(Dense(10, input_dim=1, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(1000, activation='relu'))
model.add(Dense(1000, activation='linear'))
# model.add(Dense(100, activation='relu'))
# model.add(Dense(100, activation='relu'))
# model.add(Dense(100, activation='relu'))
# model.add(Dense(100, activation='relu'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
return model
from keras.models import Sequential
from keras.layers import Input, Dense, Dropout, BatchNormalization
from keras.wrappers.scikit_learn import KerasRegressor
# use data split and fit to run the model
estimator = KerasRegressor(build_fn=relu_reg_model, epochs=100, batch_size=5, verbose=1)
history = estimator.fit(x_train, y_train, callbacks=[cb_cp, cb_tf], validation_data=(x_test, y_test))
y_pred = estimator.predict(x_train)
plt.title('NonLiner Regressions via DL by ReLU')
plt.plot(data, target, 'o')
plt.plot(data, true_func(data), '.')
plt.plot(x_train, y_pred, "o", label='predicted: deep learning')
#plt.legend(loc=2)
#【コメント】真の関数にだいぶ近いがばらつき大きいところはずれている0.4,1.0あたり
#【コメント】0.2あたりで下に引っ張られそうだけど真の関数とほぼあってるのはなぜ?
print(lasso_clf.coef_)
from google.colab import files
import re
uploaded = files.upload()
for fn in uploaded.keys():
fn_s = re.escape(fn)
output_fn = fn.split('.', 1)[0]+'.html'
output_fn_s = re.escape(output_fn)
!jupyter nbconvert --to html $fn_s
files.download(output_fn)
!rm $fn_s