質問編集履歴

2

係数からグラフを作成する方法の追加

2021/04/21 09:09

投稿

unser
unser

スコア58

test CHANGED
File without changes
test CHANGED
@@ -142,6 +142,22 @@
142
142
 
143
143
  # visualize model
144
144
 
145
+ # visualize model
146
+
147
+ def model_conf(model,x):
148
+
149
+ y=[model.intercept_ for _ in range(len(x))]
150
+
151
+ for j in range(len(x)):
152
+
153
+ for i in range(len(model.coef_)):
154
+
155
+ y[j]+=model.coef_[i]*((x[j][0])**(i+1))
156
+
157
+ return y
158
+
159
+
160
+
145
161
  plt.figure(figsize=(10, 7))
146
162
 
147
163
 
@@ -172,6 +188,8 @@
172
188
 
173
189
  plt.plot(X_plt, y_pred2, color='black', linestyle='--', label='Line Ridge(α={})'.format(k_1), lw=3)
174
190
 
191
+ #plt.plot(X_plt, model_conf(model3,X_plt), color='purple', linestyle="dashdot", label='Polynomial regression(20)', lw=5)
192
+
175
193
  plt.plot(X_plt, y_pred3, color='green', linestyle="dashdot", label='Polynomial regression(20)', lw=3)
176
194
 
177
195
  plt.plot(X_plt, y_pred4, color='pink', linestyle='-', label='Poly Ridge(α={})'.format(k_1), lw=3)

1

ridge項の追加方法

2021/04/21 09:09

投稿

unser
unser

スコア58

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,6 @@
1
1
  Pythonにて,Ridge回帰などを行い,その損失関数(MSE)の値を算出したいのですが,
2
2
 
3
- その見方の方法がわからないためご教授していただけると幸いです
3
+ その見方の方法がわからないためご教授していただけると幸いです.
4
-
5
- (実装は直に損失関数を計算しましたが,Ridgeに関しては方法がわからなかったため,
6
-
7
- ひとまず,ridgeの項をゼロとしました).
8
4
 
9
5
 
10
6
 
@@ -196,12 +192,14 @@
196
192
 
197
193
  ```python
198
194
 
199
- #損失関数(仮)を算出する.
195
+ #損失関数を算出する.(修正 4/21, 17:29)
200
196
 
201
197
  ans_lst=[]
202
198
 
203
199
  for i in range(5):
204
200
 
201
+ ans=0
202
+
205
203
  if i==0:
206
204
 
207
205
  #score=cross_val_score(model1,x,y,cv=10)
@@ -210,20 +208,22 @@
210
208
 
211
209
  elif i==1:
212
210
 
213
- # 本当はRidgeの項を入れたいが係数がわからない...
211
+ model2.coef_
214
212
 
215
213
  ans=statistics.mean(list(map(lambda t: t**2, (y-model2.predict(x)).tolist())))
216
214
 
215
+ ans+=sum(list(map(lambda t: t**2, model2.coef_)))
216
+
217
217
  elif i==2:
218
218
 
219
219
  ans=statistics.mean(list(map(lambda t: t**2, (y-model3.predict(x_20)).tolist())))
220
220
 
221
221
  elif i==3:
222
222
 
223
- # 本当はRidgeの項を入れたいが係数がわからない...
224
-
225
223
  ans=statistics.mean(list(map(lambda t: t**2, (y-model4.predict(x_20)).tolist())))
226
224
 
225
+ ans+=sum(list(map(lambda t: t**2, model4.coef_)))
226
+
227
227
  else:
228
228
 
229
229
  #試しに真の分布のもののエラー関数を見てみる.
@@ -240,7 +240,21 @@
240
240
 
241
241
  """
242
242
 
243
+ [878.1943851888309,
244
+
245
+ 6835.932288142904,
246
+
247
+ 165.22430413762072,
248
+
249
+ 1480.3156315725134,
250
+
251
+ 660.6537337438299]
252
+
253
+ """
254
+
255
+ ```
256
+
243
- ans_lst=[878.1943851888309,
257
+ ~~ans_lst=[878.1943851888309,
244
258
 
245
259
  6829.205481962394,
246
260
 
@@ -248,112 +262,110 @@
248
262
 
249
263
  1472.468473432889,
250
264
 
251
- 660.6537337438299]
265
+ 660.6537337438299]~~ <- ridge項を入れる前.
266
+
267
+
268
+
269
+ こちら,最後をみると明らかに過学習しているmodel3が
270
+
271
+ 最も損失関数が低いため良いモデルとなってしまいました.
272
+
273
+
274
+
275
+ そのため,k-交差検証を用いて,それぞれのモデルを評価して,
276
+
277
+ その値が小さいモデルを判断します.
278
+
279
+
280
+
281
+ ```python
282
+
283
+ # generate models
284
+
285
+ models=[]
286
+
287
+
288
+
289
+ k_1=500
290
+
291
+ # degree=1
292
+
293
+ models.append(LinearRegression())
294
+
295
+ models.append(Ridge(alpha=k_1))
296
+
297
+
298
+
299
+ k_20=500
300
+
301
+ # degree = 20
302
+
303
+ models.append(LinearRegression())
304
+
305
+ models.append(Ridge(alpha=k_20))
306
+
307
+ base_x_20=PolynomialFeatures(degree=20,include_bias=False)
308
+
309
+ x_20=base_x_20.fit_transform(x)
310
+
311
+
312
+
313
+ # generate models
314
+
315
+ models=[]
316
+
317
+
318
+
319
+ # degree=1
320
+
321
+ k_1=500
322
+
323
+ models.append(LinearRegression())
324
+
325
+ models.append(Ridge(alpha=k_1))
326
+
327
+
328
+
329
+ # degree = 20
330
+
331
+ k_20=500
332
+
333
+ models.append(LinearRegression())
334
+
335
+ models.append(Ridge(alpha=k_20))
336
+
337
+ base_x_20=PolynomialFeatures(degree=20,include_bias=False)
338
+
339
+ x_20=base_x_20.fit_transform(x)
340
+
341
+
342
+
343
+ # evaluate model
344
+
345
+ scores=[]
346
+
347
+ for i in range(4):
348
+
349
+ if i < 2 :
350
+
351
+ scores.append(-np.mean(cross_val_score(models[i],x,y,scoring='neg_mean_squared_error',cv=10)))
352
+
353
+ else:
354
+
355
+ scores.append(-np.mean(cross_val_score(models[i],x_20,y,scoring='neg_mean_squared_error',cv=10)))
356
+
357
+ # 本当はridgeの部分はそれを含めたscoreを算出したいです.
358
+
359
+
252
360
 
253
361
  """
254
362
 
363
+ scores=[1050.7385117716492, 7591.142086205172, 5966152468.751239, 2145.3345481477745]
364
+
365
+ """
366
+
255
367
  ```
256
368
 
257
- こちら,最後をみると明らかに過学習しているmodel3が
258
-
259
- 最も損失関数が低いため良いモデルとなってしまいました.
260
-
261
-
262
-
263
- そのため,k-交差検証を用いて,それぞれのモデルを評価して,
264
-
265
- その値が小さいモデルを判断します.
266
-
267
-
268
-
269
- ```python
270
-
271
- # generate models
272
-
273
- models=[]
274
-
275
-
276
-
277
- k_1=500
278
-
279
- # degree=1
280
-
281
- models.append(LinearRegression())
282
-
283
- models.append(Ridge(alpha=k_1))
284
-
285
-
286
-
287
- k_20=500
288
-
289
- # degree = 20
290
-
291
- models.append(LinearRegression())
292
-
293
- models.append(Ridge(alpha=k_20))
294
-
295
- base_x_20=PolynomialFeatures(degree=20,include_bias=False)
296
-
297
- x_20=base_x_20.fit_transform(x)
298
-
299
-
300
-
301
- # generate models
302
-
303
- models=[]
304
-
305
-
306
-
307
- # degree=1
308
-
309
- k_1=500
310
-
311
- models.append(LinearRegression())
312
-
313
- models.append(Ridge(alpha=k_1))
314
-
315
-
316
-
317
- # degree = 20
318
-
319
- k_20=500
320
-
321
- models.append(LinearRegression())
322
-
323
- models.append(Ridge(alpha=k_20))
324
-
325
- base_x_20=PolynomialFeatures(degree=20,include_bias=False)
326
-
327
- x_20=base_x_20.fit_transform(x)
328
-
329
-
330
-
331
- # evaluate model
332
-
333
- scores=[]
334
-
335
- for i in range(4):
336
-
337
- if i < 2 :
338
-
339
- scores.append(-np.mean(cross_val_score(models[i],x,y,scoring='neg_mean_squared_error',cv=10)))
340
-
341
- else:
342
-
343
- scores.append(-np.mean(cross_val_score(models[i],x_20,y,scoring='neg_mean_squared_error',cv=10)))
344
-
345
- # 本当はridgeの部分はそれを含めたscoreを算出したいです.
346
-
347
-
348
-
349
- """
350
-
351
- scores=[1050.7385117716492, 7591.142086205172, 5966152468.751239, 2145.3345481477745]
352
-
353
- """
354
-
355
- ```
356
-
357
369
  この場合,models[0]を用いると良いとなりますが,結局最初のモデルを用いて
358
370
 
359
371
  全てを訓練データとして得られたものを係数として答えを出せば良いでしょうか?