【機械学習コンペティション+メモ】産業用蒸気量予測:モデル検証(V)


関連書籍:

コンテストのアドレス:産業用蒸気量予測_学習コンペティション_天池コンペティション

5 モデルの検証

5.1 モデル評価の概念と方法

5.1.1 過小適合と過適合

データ関係とは、サンプルの分布パターン、またはフィーチャと対応するサンプルの間の関係です。

  • 高バイアス (バイアス) とも呼ばれるアンダーフィッティング
    は、通常、追加の特徴を追加し、多項式の特徴を追加し、 λ \ を減らすことで軽減できます。ラムダλ の値などの方法を使用してモデルを最適化します。
  • 過学習 (高分散 (分散) とも呼ばれます)
    は、通常、より多くのデータを収集し、使用する特徴量を減らし、 λ \ を増やすことで実現できます。ラムダλ の値などの方法を使用してモデルを最適化します。

5.1.2 モデルの一般化と正則化

正則化(正則化)とは、過学習を防ぐために、学習が必要な目的関数に何らかのルール(制約)を追加することです。

  • L1范数
    ∥ x ∥ 1 = ∑ i = 1 N ∣ x i ∣ \Vert{x}\Vert_1=\sum^N_{i=1}{\vert {x_i}\vert} x1 =i=1N xi
    はベクトル要素の絶対値の合計です。
  • L2范数
    ∥ x ∥ 2 = ( ∑ i = 1 N ∣ x i ∣ 2 ) 1 2 \Vert{x}\Vert_2=(\sum^N_{i =1}{\vert{x_i}\vert^2})^\frac{1}{2} x2 =(i=1N xi 2)21
    ユークリッド ノルムとも呼ばれ、ベクトル要素の絶対値の二乗和を二乗したものです。
  • L-q范数
    ∥ x ∥ q = ( ∑ i = 1 N ∣ x i ∣ q ) 1 q \Vert{x}\Vert_q=(\sum^N_{i =1}{\vert{x_i}\vert^q})^\frac{1}{q} xq =(i=1N xi q)q1
    つまり、ベクトル要素の絶対値の q 乗の累積和と 1 q \frac{1}{q} q1 力。
    ここに画像の説明を挿入します
from sklearn.linear_model import SGDRegressor
clf=SGDRegressor(max_iter=1000,tol=1e-3,penalty='L2',alpha=0.0001)
2. リッジ回帰と LASSO 回帰

元の損失関数の後に正規項を追加すると、モデルによって学習される θ \theta を減らすことができます。θ のサイズにより、モデルの一般化能力が強化されます。

  • L1 ノルムでパラメータ空間を正規化する線形モデルはリッジ回帰と呼ばれます。
  • L2 ノルムでパラメータ空間を正規化する線形モデルは LASSO 回帰と呼ばれます。
    2 つの違いは次のとおりです。
    ( 1) を使用する α \alpha を使用した、リッジ回帰の改良された多項式回帰アルゴリズムα を変更すると、フィッティング曲線は常に曲線になり、最終的にはほぼ水平な直線になります。つまり、リッジ回帰を使用した後、多項式回帰はモデル内のアルゴリズム 変数の前にまだ係数があるため、傾斜した直線を取得するのは困難です。
    (2) LASSO 回帰によって改良された多項式回帰アルゴリズムを使用し、 α \alpha α を変化させると、フィッティング曲線は急速に斜めの直線に変化し、最終的にはゆっくりと水平に近い直線に変化します。

5.1.3 回帰モデルの評価指標と呼び出し方法

回帰モデルを評価するには、平均絶対誤差、平均二乗誤差、二乗平均平方根誤差、R 二乗値の 4 つの方法があります。
ここに画像の説明を挿入します

1. 平均絶対値誤差

MAE = 1 n ∑ i = 1 n ∣ f i − y i ∣ = 1 n ∑ i = 1 n ∣ e i ∣ MAE=\frac{1}{n}\sum^n_{i=1}{\vert{f_i- y_i}\vert}=\frac{1}{n}\sum^n_{i=1}{\vert{e_i}\vert}MAE=n1 i=1n fi そしてi =n1 i=1n ei

2. 平均二乗誤差

M S E = 1 n ∑ i = 1 n ( ob s e r v e d i − p re d i te d i ) 2 MSE=\frac{1}{n}\sum^n_{i=1}{(observed_i-preedited_i)^2}MSE=n1 i=1n (observ edi predit edi )2

3. 二乗平均平方根誤差

R M S E = M S E = S S E / N = 1 n ∑ i = 1 n w i ( y i − y i ^ ) 2 RMSE=\sqrt{MSE}=\sqrt{SSE/N}=\sqrt{\frac{1}{n}\ sum^n_{i=1}{w_i(y_i-\hat{y_i})^2}}RMSE=MSE =SSE/N =n1 i=1n i (yi そしてi ^ )2

4. R二乗値

R 2 ( y , y ^ ) = 1 − ∑ i = 0 n s a m p l e s − 1 ( y i − y i ^ ) 2 ∑ i = 0 n s a m p l e s − 1 ( y i − y i ‾ ) 2 R^2(y,\hat{y} )=1-\frac{\sum^{n_samples-1}_{i=0}(y_i-\hat{y_i})^2}{\sum^{n_samples-1}_{i=0}(y_i -\overline{y_i})^2}R2(y,そして^ )=1i=0ns amples−i=4>1 < a i=5> (yi そしてi )2i=0ns amples−i=4>1 < a i=5> (yi そしてi ^ )2

5.1.4 相互検証

1. 単純な相互検証

単純な相互検証では、元のデータを 2 つのグループ (1 つはトレーニング セットとして、もう 1 つは検証セットとして) にランダムに分割します。通常、データの 30% がテスト データとして分割されます。
ここに画像の説明を挿入します

2. K 分割相互検証

K 分割相互検証 (K-Fold Cross Validation) では、元のデータを K 個のグループに分割し、データのサブセットごとに検証セットを作成し、データの残りの K-1 サブセットをトレーニング セットとして使用して K モデルを取得します。 、および K 各モデルの最終検証セットの分類精度は、K 分割相互検証分類器のパフォーマンス インデックスとして平均化されます。通常、K は 3 以上に設定します。
ここに画像の説明を挿入します

3. リーブワンアウト相互検証

Leave-One-Out Cross Validation (LOO-CV) とは、各トレーニング セットが元の 1 つのサンプルを除いた残りのサンプルで構成され、1 つのサンプルが残されてテスト セットを形成することを意味し、トレーニングを通じて最終的に N 個のモデルが取得されます。 N 個のモデルの最終検証セットの平均値は、分類子のパフォーマンス指標として平均化されます。
ここに画像の説明を挿入します

4. P-leave 相互検証

Leave-P-Out 相互検証 (LPO-CV) は、完全なデータ セットから p 個のサンプルを削除して、可能なすべてのトレーニング セットとテスト セットを生成します。

5. sklearn のいくつかの相互検証呼び出しメソッドのサンプル コード
from sklearn.model_selection import train_test_split,Kfold,LeaveOneOut,LeavePOut

X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=.4,random_state=0)
kf=Kfold(n_split=10)
loo=LeaveOneOut()
lpo=LeavePOut(p=5)
5. その他の相互検証分割方法
(1) クラスラベルに基づき、階層的な相互検証を行う

主にサンプルの不均衡の問題を解決するために使用されます。
一部の分類問題では、ターゲット カテゴリの分布に大きな不均衡が見られる場合があります。たとえば、負のサンプルが正のサンプルよりも何倍も多い場合があります。この場合は、次のような StratifiedKFold を使用します。 StratifiedShuffleSplit を使用した層化サンプリング手法により、対応するカテゴリの頻度が各トレーニングおよび検証フォールドで確実に保持されます。

  • StratifiedKFold は、層化された折り畳みを返す K-Fold のバリアントです。各小さなセットでは、各カテゴリのサンプルの割合は完全なデータ セットとほぼ同じです。
  • StratifiedShuffleSplit は ShuffleSplit のバリアントで、直接分割を返します。つまり、分割を作成しますが、分割内の各クラスの比率は完全なデータセットと同じです。
(2) グループ化されたデータの相互検証

主にモデルの汎化能力をさらにテストするために使用されます
特定のデータセットでトレーニングされたモデルが新しいデータにうまく適応できるかどうかを測定するには、検証データ内のすべてのサンプルがペアのトレーニングに現れていないことを確認する必要があります。使用する方法は、テスト セットやトレーニング セットに属さない特定のデータ セットを流出させることです。

  • GroupKFold は、テスト セットとトレーニング セットの両方で同じグループが表されないようにする K-Fold の変形です。
  • LeaveOneGroupOut は、ユーザーが指定した整数の配列に基づいてさまざまなグループを区別することでサンプルを提供します。
  • LeavePGroupOut は LeaveOneGroupOut に似ています。
  • GroupShuffleSplit は、ランダムに分割された一連のパーティションを生成し、各グループにグループのサブセットを提供します。
(3) 時系列の分割

TimeSeriesSplit は K-Fold のバリアントです。最初に K フォールドをトレーニング データ セットとして返し、K+1 フォールドをテスト データ セットとして返します。
時系列のサンプル セグメンテーションでは、時間の順序を保証する必要があります。将来のデータを現在のデータの正確性を検証するために使用することはできません。前の期間のデータはモデリングにのみ使用できます。モデル予測の効果を検証するために、その後の期間のデータを使用します。

5.2 モデルパラメータの調整

5.2.1 パラメータの調整

1.パラメータ調整の目的

モデル全体のバイアスと分散の優れた調和を実現します。

  • プロセス影響クラス パラメータ
    サブモデルの数 (n_estimators)、学習率 (learning_rate) など。
  • サブモデル インフルエンス クラス パラメータ
    最大深度 (max_ Depth)、分割条件 (criterion) など。
    バギングのトレーニング プロセスは分散を減らすことを目的とし、ブースティングのトレーニング プロセスはバイアスを減らすことを目的としています。このプロセスはクラス パラメーターに影響を与え、モデル全体のパフォーマンスに大幅な変化を引き起こす可能性があります。

5.2.2 グリッド検索

グリッド検索は、網羅的な検索のためのパラメータ調整方法です。
すべての候補パラメータのうち、ループ トラバーサルを通じてあらゆる可能性を試し、最もよく実現されたパラメータが最終結果となります。

from sklearn.svm import SVC
# grid search start
best_score=0
for gamma in [0.001,0.01,0.1,1,10,100]:
	for C in [0.001,0.01,0.1,1,10,100]:
		svm=SVC(gamma=gamma,C=C)
		svm.fit(X_train,y_train)
		score=svm.score(X_test,y_test)
		if score>beat_score:
			best_score=score
			best_parameters={
    
    'gamma':gamma,'C':C}
print('Best score:{:.2f}'.format(best_score))
print('Best parameters:{}'.format(best_parameters))

5.2.3 学習曲線

学習曲線は、トレーニング セットのサイズが異なる場合にモデルのトレーニング セットと相互検証セットの精度をプロットすることで、新しいデータでのモデルのパフォーマンスを観察し、モデルの分散またはバイアスが高すぎるかどうかを判断します。 、トレーニング セットを増やすと過学習を軽減できるかどうか。
ここに画像の説明を挿入します

import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import ShuffleSplit
from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import learning_curve
plt.figure(figsize=(18,10),dpi=150)
def plot_learning_curve(estimator,titler,X,y,ylim=None,cv=None,n_jobs=1,train_sizes=np.linspace(.1,1.0,5)):
	plt.figure()
	pIt.title(title)
	if ylim is not None:
		plt.ylim(*ylim)
	plt.xlabel("Training examples")
	plt.ylabel("Score")
	train_sizes,train_scores,test_scores=learning curve(estimator,X,y,cv=cv,n_jobs=n_jobs,train_sizes=train_sizes)
	train_scores_mean=np.mean(train_scores,axis=1)
	train_scores_std=np.std(train_scores,axis=l)
	test_scores_mean=np.mean(test_scores,axis=l)
	test_scores_std=np.std(test_scores,axis=1)
	plt.grid()
	plt.fill_between(train_sizes,train_scores_mean-train_scores_std,train_scores_mean+train_scores_std,alpha=0.1,color="r")
	plt.fill_between(train_sizes,test_scores_mean-test_scores_std,test_scores_mean+test_scores_std,alpha=0.1,color="g")
	plt.plot(train_sizes,train_scores_mean,'o-',color="r",label="Training score")
	plt.plot(train_sizes,test_scores_mean,'o-',color="g",label="Cross-validation score")
	plt.legend(loc="best")
	return plt

X=train_data2[test_data2.columns].values
y=train_data2['target'].values
title="LinearRegression"
# Cross validation with 100 iterations to get smoother mean test and train
# score curves,each time with 20% data randomly selected as a validation set.
cv=ShuffleSplit(n_splits=100,test_size=0.2,random_state=0)
estimator=SGDRegressor()
plot_learning_curve(estimator,title,X,y,ylim=(0.7,1.01),cv=cv,n_jobs=-l)

ここに画像の説明を挿入します

5.2.4 検証曲線

検証曲線の横軸は、特定のハイパーパラメータの値の範囲であり、これにより、(異なるトレーニング セット サイズではなく) 異なるパラメータ設定の下でのモデルの精度が比較されます。
ここに画像の説明を挿入します

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import validation_curve

X=train_data2[test_data2.columns].values
y=train_data2['target'].values
param_range=[0.1,0.01,0.001,0.0001,0.00001,0.000001]
train_scores,test_scores=validation_curve(SGDRegressor(max_iter=1000,tol=1e-3,penalty='L1'),X,y,param_name='alpha',param_range=param_range,cv=10,scoring='r2',n_jobs=1)
train_scores_mean=np.mean(train_scores,axis=1)
train_scores_std=np.std(train_scores,axis=l)
test_scores_mean=np.mean(test_scores,axis=l)
test_scores_std=np.std(test_scores,axis=1)

plt.title("Validation Curve with SGDRegressor")
plt.xlabel("alpha")
plt.ylabel("Score")
plt.ylim(0.0,1.1)
plt.semilogx(param_range,train_scores_mean,label="Training score",color="r")
plt.fill_between(param_range,train_scores_mean-train_scores_std,train_scores_mean+train_scores_std,alpha=0.2,color="r")
plt.semilogx(param_range,test_scores_mean,label="Cross-validation score",color="g")
plt.fill_between(param_range,test_scores_mean-test_scores_std,test_scores_mean+test_scores_std,alpha=0.2,color="g")
plt.legend(loc="best")
plt.show()

ここに画像の説明を挿入します

5.3 競合モデルの検証とパラメータ調整

5.2.3 モデルの正則化

3. ElasticNet は L1 と L2 のノルム加重正則化を組み合わせます
from sklearn.linear_model import SGDRegressor
clf=SGDRegressor(max_iter=1000,tol=1e-3,penalty='elasticnet',l1_ratio=0.9,alpha=0.0001)

5.3.3 モデルの相互検証

1. 単純な相互検証
#简单交叉验证
from sklearn.model_selection import train_test_split
train_data,test_data,train_target,test_target=train_test_split(train,target,test_size=0.2,random,state=0)
clf=SGDRegressor(max_iter=1000,tol=1e-3)
clf.fit(train_data,train_target)
score_train=mean_squared_error(train_target,clf.predict(train_data))
score_test=mean_squared_error(test_traget,clf.predict(test_data))
print("SGDRegressor train MSE: ",score_train)
print("SGDRegressor test MSE: ",score_test)
2. K 分割相互検証
#5折交叉验证
from sklearn.model selection import KFold
kf=KFold(n_splits=5)
for k,(train_index,test_index) in enumerate(kf.split(train)):
	train_data,test_data,train_target,test_target=train.values[train_index],train.values[test_index], target[train_index],target[test_index]
	clf=SGDRegressor(max_iter=1000,tol=le-3)
	clf.fit(train_data,train_target)
	score_train=mean_squared_error(train_target,clf.predict(train_data))
	score_test=mean_squared_error(test_target,clf.predict(test_data))
	print(k,"折","SGDRegressor train MSE:",score_train)
	print(k,"折","SGDRegressor test MSE:",score_test,'\n')

5.3.4 モデルのハイパーパラメータ空間とパラメータの調整

1. 徹底的なグリッド検索
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomDorestRegressor
randomForestRegressor=RandomForestRegressor()
parameters={
    
    'n_estimators':[50,100,200],'max_depth':[1,2,3]}
clf=GridSearchCV(randomForestRegressor,parameters,cv=5)

「clf.cv_results_」には、「mean_fit_time」、「mean_score_time」、「std_score_time」、「std_test_score」などのトレーニング時間と検証指標に関する情報も含まれています。

2. ランダムパラメータの最適化
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomDorestRegressor
randomForestRegressor=RandomForestRegressor()
parameters={
    
    'n_estimators':[50,100,200,300],'max_depth':[1,2,3,4,5]}
clf=RandomizedSearchCV(randomForestRegressor,parameters,cv=5)

おすすめ

転載: blog.csdn.net/U202113837/article/details/134432906