質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2558閲覧

make_scorer()でRidgeのscoringを用意する方法

unser

総合スコア58

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/21 14:26

編集2021/04/21 23:09

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.

どのように改善すれば良いか,教えていただけると幸いです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

「Ridgeの式の評価関数」というのがわかりません。
前の質問に回答された方もおっしゃっていますが、目的関数と評価指標は独立に選べます。
作成したモデルを二乗和平均で評価したいなら、2つ目のコードのままで大丈夫です。(実際にscoresが算出されてますし)

投稿2021/04/21 16:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unser

2021/04/21 23:06

ありがとうございます. 理論を勘違いしてしまっていました????‍♂️ また,理論とはずれますが,もしかりにこれを実装するとしたら.どのような実装方法をすれば良いか教えていただけると幸いです.
退会済みユーザー

退会済みユーザー

2021/04/22 00:34

cross val score のscoringに辞書型を渡しているのは何故ですか? make_scoringという関数を僕も使ったことがないので、調べてみたんですが、辞書にしなくて良いと思います。 参考サイト https://qiita.com/y_kani/items/011b65a09e480322ac98
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問