https://teratail.com/questions/334435
こちらの質問に類する質問です.
現在回帰問題をRidgeで解こうと考えています.
その際にk-CrossVaridationを用いてモデルを評価したいのですが,通常MSEの評価で十分だと思います.
しかし,仮に罰則項を加えた評価をする場合,罰則項を含めたscoringの実装は
(https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter)
自分で用意する必要があります.
つまり,その度にCVのタームごとに罰則項も足すことになります.
そこで,自分でscore関数を用意するmake_scorer()(https://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html)を用いてRidgeの式の評価関数を実装したいと考えています.
しかし,具体的にどのように実装すれば良いかわからないため,ご教授していただけると幸いです.
python
1# import library 2%matplotlib inline 3import matplotlib.pyplot as plt 4import numpy as np 5import pandas as pd 6from sklearn.model_selection import train_test_split 7from sklearn.preprocessing import StandardScaler 8from sklearn.linear_model import LinearRegression 9from sklearn.linear_model import Ridge 10from sklearn.preprocessing import PolynomialFeatures 11 12from sklearn.model_selection import cross_val_score 13from sklearn.metrics import mean_squared_error 14import statistics 15 16# generate a true function 17def func(x): 18 return 100*x+10*x**3+0.001*x**15 19 20# generate sample datas {(y,x)}_30 21np.random.seed(0) 22x = np.random.rand(30) * 2 23noise = (np.random.rand(30) -0.5)* 100 24true_y = func(x) 25y = true_y + noise 26 27# visualize true function and sample data 28plt.scatter(x,y) 29xx=np.arange(0,2,0.01) 30yy = func(xx) 31plt.plot(xx, yy)
python
1x=x.reshape(-1,1) 2# generate models 3models=[] 4 5# degree=1 6k_1=500 7models.append(LinearRegression()) 8models.append(Ridge(alpha=k_1)) 9 10# degree = 20 11k_20=500 12models.append(LinearRegression()) 13models.append(Ridge(alpha=k_20)) 14base_x_20=PolynomialFeatures(degree=20,include_bias=False) 15x_20=base_x_20.fit_transform(x) 16 17## MSEによる評価 18scores=[] 19for i in range(4): 20 if i < 2 : 21 scores.append(-np.mean(cross_val_score(models[i],x,y,scoring='neg_mean_squared_error',cv=2))) 22 else: 23 scores.append(-np.mean(cross_val_score(models[i],x_20,y,scoring='neg_mean_squared_error',cv=2))) 24 25# scores=[998.8563668508611, 7219.762790532995, 892499000007.7985, 3360.0200907347216]
ここからがmake_scorer()を用いた部分です.(Errorとなりましたが)
python
1from sklearn.metrics import make_scorer 2 3def score_ridge(y_true,y_pred,x_train,model_ridge): 4 """ 5 y_true: 真の分布から発生したサンプル 6 x_train: それに対応するx 7 8 y_pred: modelによって予測されるy 9 x_train: それに対応するx 10 11 model_ridge: 使用するモデル 12 13 今回,coefを呼び出す必要があるため,xやmodel_ridgeを引数に用意しました... 14 (しかし,これがエラー要因な気がします) 15 """ 16 ans=mean_squared_error(y_true, y_pred) 17 t=model_ridge.fit(x_train,y_true) 18 para=t.coef_ 19 for i in para: 20 ans+=models.get_params()*i**2 21 return ans 22 23scores=[] 24score_func={ 25 'ridge': make_scorer(score_ridge) 26} 27scores=[] 28score_func={ 29 'ridge': make_scorer(score_ridge) 30} 31for i in range(4): 32 if i == 1 : 33 scores.append(-np.mean(cross_val_score(models[i],x,y,scoring=score_func,cv=10)['test_ridge'])) 34 elif i==3: 35 scores.append(-np.mean(cross_val_score(models[i],x_20,y,scoring=score_func,cv=10)['test_ridge']))
Error
1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-25-5edaa5795037> in <module>() 4 7 scores.append(-np.mean(cross_val_score(models[i],x,y,scoring=score_func,cv=10)['test_ridge'])) 5 8 else: 6----> 9 scores.append(-np.mean(cross_val_score(models[i],x_20,y,scoring=score_func,cv=10)['test_ridge'])) 7 10 ## I should change scoring 8 91 frames 10/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_scorer.py in check_scoring(estimator, scoring, allow_none) 11 428 raise ValueError("For evaluating multiple scores, use " 12 429 "sklearn.model_selection.cross_validate instead. " 13--> 430 "{0} was passed.".format(scoring)) 14 431 else: 15 432 raise ValueError("scoring value should either be a callable, string or" 16 17ValueError: For evaluating multiple scores, use sklearn.model_selection.cross_validate instead. {'ridge': make_scorer(score_ridge)} was passed.
どのように改善すれば良いか,教えていただけると幸いです.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/21 23:06
退会済みユーザー
2021/04/22 00:34