Jupyter Notebookなどで、コードを実装して実際に確かめてみましょう。
Jetson Nanoでjupyter-notebookを使う場合
mglearnは入ってないのでインストールしておきます
$sudo pip3 install mglearn
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
import numpy as np import matplotlib.pyplot as plt #データ作成 data_size = 20 x = np.linspace(0,1,data_size) noise = np.random.uniform(low=-1.0,high=1.0,size=data_size) * 0.2 y = np.sin(2.0 * np.pi * x) + noise plt.scatter(x,y) x_line = np.linspace(0,1,1000) sin_x = np.sin(2.0 * np.pi * x_line) plt.plot(x_line,sin_x,'red') def plot_sin(): plt.scatter(x,y) plt.plot(x_line,sin_x,'red') # from sklearn.linear_model import LinearRegression #モデルをつくって学習 #xの形を確認 x x.shape #xは1次元配列なのでこれをベクトル形式にする必要がある、のでreshapeしておく (20,) -> (20,1) lin_reg = LinearRegression().fit(x.reshape(-1,1),y) lin_reg.intercept_,lin_reg.coef_ #図にする #まったく近似できていないのを確認 plt.plot(lin_reg.intercept_ + lin_reg.coef_ * x_line) plot_sin() -------------------------------------------------------------------- #多項式回帰をやってみる #二乗を追加 x_2 = x ** 2 x_new = np.concatenate([x.reshape(-1,1),x_2.reshape(-1,1)],axis=1) #再びモデルをつくって学習 lin_reg_2 = LinearRegression().fit(x_new,y) lin_reg_2.intercept_,lin_reg_2.coef_ #図にする plt.plot(x_line,lin_reg_2.intercept_ + lin_reg_2.coef_[0] * x_line + lin_reg_2.coef_[1] * x_line ** 2) plot_sin() #さほど変化がないのでさらに改善するためにPolynomialFeaturesを使って三乗を追加してみる、 from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=3) poly.fit(x.reshape(-1,1)) x_poly_3 = poly.transform(x.reshape(-1,1)) lin_reg_3 = LinearRegression().fit(x_poly_3,y) #predictを使ってみる #x_lineを変換 #fitとtransformをいっぺんに呼び出す関数がfit_transform x_line_poly_3 = poly.fit_transform(x_line.reshape(-1,1)) plt.plot(x_line,lin_reg_3.predict(x_line_poly_3)) plot_sin() #おさまりがよくなったようなので、どんどん加えていきます # fig,axes = plt.subplots(1,3,figsize=(16,4)) for degree,ax in zip([5,15,25],axes): poly = PolynomialFeatures(degree=degree) x_poly = poly.fit_transform(x.reshape(-1,1)) lin_reg = LinearRegression().fit(x_poly,y) x_line_poly = poly.fit_transform(x_line.reshape(-1,1)) ax.plot(x_line,lin_reg.predict(x_line_poly)) ax.scatter(x,y) ax.plot(x_line,sin_x,'red') #単純に次数を増やしても効果はないということが分かった #過学習(過剰適合)の問題 -------------------------------------------------------------------- #正則化というテクニックを使って過学習を防いでみる import mglearn import pandas as pd from sklearn.model_selection import train_test_split x,y = mglearn.datasets.load_extended_boston() #panadasで見やすい表に変換 df_x = pd.DataFrame(x) df_y = pd.DataFrame(y) #104の項目のデータが506個あります #データ作成 x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=0) #モデルを作って学習 lin_reg = LinearRegression().fit(x_train,y_train) print(round(lin_reg.score(x_train,y_train),3)) print(round(lin_reg.score(x_test,y_test),3)) #104項目もあるためテストデータのscoreは低い #どの項目を使うか選択する必要がある --------------------------------------------------------------------- #リッジ回帰とラッソ回帰をやって過学習を防いでみる #リッジ回帰 from sklearn.linear_model import Ridge,Lasso ridge = Ridge().fit(x_train,y_train) def print_score(model): print(round(model.score(x_train,y_train),3)) print(round(model.score(x_test,y_test),3)) print_score(ridge) #デフォルト係数は1、alphaを使って係数を大きくしてみる ridge_10 = Ridge(alpha=10).fit(x_train,y_train) print_score(ridge_10) #alphaを使って係数を小さくしてみる ridge_01 = Ridge(alpha=0.1).fit(x_train,y_train) print_score(ridge_01) #係数を比較 coefficients = pd.DataFrame({'lin_reg':lin_reg.coef_,'ridge':ridge.coef_,'ridge_10':ridge_10.coef_,'ridge_01':ridge_01.coef_}) coefficients #ラッソ回帰 lasso = Lasso().fit(x_train,y_train) print_score(lasso) lasso_001 = Lasso(alpha=0.01).fit(x_train,y_train) print_score(lasso_001) #ワーニングが出たら、イテレーションの数を調整 lasso_001 = Lasso(alpha=0.01,max_iter=10000).fit(x_train,y_train) print_score(lasso_001) |
Leave a Reply