この記事では、学習曲線を通じて機械学習モデルの過学習と過小学習を効果的に特定する方法を紹介します。
モデルがデータからノイズを学習するまでデータ上で過剰トレーニングされた場合、モデルは過剰適合していると言われます。過学習モデルはすべての例を完璧に学習するため、見たことのない新しい例を誤って分類してしまいます。過適合モデルの場合、完璧/ほぼ完璧なトレーニング セット スコアとひどい検証セット/テスト スコアが得られます。
少し修正: 「過学習の理由: 複雑なモデルを使用して単純な問題を解決し、データからノイズを抽出します。小さなデータ セットはトレーニング セットとして使用できない可能性があるためです。」すべてのデータの正しい表現を表します。「
モデルがデータ内のパターンを正しく学習できない場合は、フィッティングが不十分だと言うだけです。アンダーフィッティングのモデルは、データセット内のすべての例を完全には学習しません。この場合、トレーニング セットと検証セットの両方でエラーが低いことがわかります。これは、モデルが単純すぎて、データに適合させるのに十分なパラメーターがないことが原因である可能性があります。アンダーフィッティングの問題を解決するには、モデルの複雑さを増し、層またはニューロンの数を増やすことを試みることができます。ただし、モデルの複雑さが増すと、過学習のリスクも高まることに注意してください。
不適切な理由: 単純なモデルを使用して複雑な問題を解決する場合、モデルはデータ内のすべてのパターンを学習できないか、モデルが基礎となるパターンを誤って学習します。データ。 データ分析と機械学習では、モデルの選択が非常に重要です。問題に対して適切なモデルを選択すると、予測の精度と信頼性が向上します。複雑な問題の場合は、データ内のすべてのパターンを捕捉するために、より複雑なモデルが必要になる場合があります。さらに、
学習曲線は、トレーニング サンプル自体のトレーニング合計を、段階的に追加することによって描画します。新しいトレーニング サンプルの損失。検証スコア (未確認データのスコア) を向上させるためにトレーニング サンプルを追加する必要があるかどうかを判断するのに役立ちます。モデルが過剰適合している場合、トレーニング例を追加すると、目に見えないデータに対するモデルのパフォーマンスが向上する可能性があります。同様に、モデルがアンダーフィットしている場合、トレーニング サンプルを追加しても役に立たない可能性があります。 「learning_curve」メソッドは、Scikit-Learn の「model_selection」モジュールからインポートできます。
from sklearn.model_selection import learning_curve
ロジスティック回帰とアイリス データを使用してデモンストレーションします。ロジスティック回帰モデルに適合し、相互検証スコア、トレーニング スコア、および学習曲線データを返す「learn_curve」という関数を作成します。
#The function below builds the model and returns cross validation scores, train score and learning curve data def learn_curve(X,y,c): ''' param X: Matrix of input featuresparam y: Vector of Target/Labelc: Inverse Regularization variable to control overfitting (high value causes overfitting, low value causes underfitting)''' '''We aren't splitting the data into train and test because we will use StratifiedKFoldCV.KFold CV is a preferred method compared to hold out CV, since the model is tested on all the examples.Hold out CV is preferred when the model takes too long to train and we have a huge test set that truly represents the universe''' le = LabelEncoder() # Label encoding the target sc = StandardScaler() # Scaling the input features y = le.fit_transform(y)#Label Encoding the target log_reg = LogisticRegression(max_iter=200,random_state=11,C=c) # LogisticRegression model # Pipeline with scaling and classification as steps, must use a pipelne since we are using KFoldCV lr = Pipeline(steps=(['scaler',sc],['classifier',log_reg])) cv = StratifiedKFold(n_splits=5,random_state=11,shuffle=True) # Creating a StratifiedKFold object with 5 folds cv_scores = cross_val_score(lr,X,y,scoring="accuracy",cv=cv) # Storing the CV scores (accuracy) of each fold lr.fit(X,y) # Fitting the model train_score = lr.score(X,y) # Scoring the model on train set #Building the learning curve train_size,train_scores,test_scores =learning_curve(estimator=lr,X=X,y=y,cv=cv,scoring="accuracy",random_state=11) train_scores = 1-np.mean(train_scores,axis=1)#converting the accuracy score to misclassification rate test_scores = 1-np.mean(test_scores,axis=1)#converting the accuracy score to misclassification rate lc =pd.DataFrame({"Training_size":train_size,"Training_loss":train_scores,"Validation_loss":test_scores}).melt(id_vars="Training_size") return {"cv_scores":cv_scores,"train_score":train_score,"learning_curve":lc}
上記のコードは非常に簡単です。学習曲線の使用方法を紹介しましょう。
「learn_curve」関数を使用して、反正則化変数/パラメーター「c」を設定することで、適切な近似モデルを取得します。から 1 (つまり、正則化は実行しません)。
lc = learn_curve(X,y,1) print(f'Cross Validation Accuracies:\n{"-"*25}\n{list(lc["cv_scores"])}\n\n\ Mean Cross Validation Accuracy:\n{"-"*25}\n{np.mean(lc["cv_scores"])}\n\n\ Standard Deviation of Deep HUB Cross Validation Accuracy:\n{"-"*25}\n{np.std(lc["cv_scores"])}\n\n\ Training Accuracy:\n{"-"*15}\n{lc["train_score"]}\n\n') sns.lineplot(data=lc["learning_curve"],x="Training_size",y="value",hue="variable") plt.title("Learning Curve of Good Fit Model") plt.ylabel("Misclassification Rate/Loss");
#上記の結果では、相互検証の精度はトレーニングの精度に近くなっています。
トレーニング損失 (青): 適切に適合したモデルの学習曲線は、トレーニング例の数が増加するにつれて徐々に減少していきます。は平坦になり、トレーニング サンプルをさらに追加してもトレーニング データに対するモデルのパフォーマンスが向上しないことを示しています。
検証損失 (黄色): 適切に適合したモデルの学習曲線は、最初は検証損失が高く、トレーニング例の数が増加するにつれて徐々に減少し、徐々に減少します。は平坦になる傾向があり、サンプルが多いほど、より多くのパターンを学習できることを示しています。これらのパターンは、「目に見えない」データに役立ちます。
最後に、「追加後」でもそれがわかります。適切な数のトレーニング例がある場合、トレーニング損失と検証損失は互いに近づきます。
変数/パラメーター 'c' を非正則化して 'learn_curve' 関数を使用します。過適合モデルを取得するには 10000 (「c」の値が大きいと過適合が発生します)。
与拟合模型相比,交叉验证精度的标准差较高。
过拟合模型的学习曲线一开始的训练损失很低,随着训练样例的增加,学习曲线逐渐增加,但不会变平。过拟合模型的学习曲线在开始时具有较高的验证损失,随着训练样例的增加逐渐减小并且不趋于平坦,说明增加更多的训练样例可以提高模型在未知数据上的性能。同时还可以看到,训练损失和验证损失彼此相差很远,在增加额外的训练数据时,它们可能会彼此接近。
将反正则化变量/参数' c '设置为1/10000来获得欠拟合模型(' c '的低值导致欠拟合)。
lc = learn_curve(X,y,1/10000) print(f'Cross Validation Accuracies:\n{"-"*25}\n{list(lc["cv_scores"])}\n\n\ Mean Cross Validation Accuracy:\n{"-"*25}\n{np.mean(lc["cv_scores"])}\n\n\ Standard Deviation of Cross Validation Accuracy:\n{"-"*25}\n{np.std(lc["cv_scores"])} (Low variance)\n\n\ Training Deep HUB Accuracy:\n{"-"*15}\n{lc["train_score"]}\n\n') sns.lineplot(data=lc["learning_curve"],x="Training_size",y="value",hue="variable") plt.title("Learning Curve of an Underfit Model") plt.ylabel("Misclassification Rate/Loss");
与过拟合和良好拟合模型相比,交叉验证精度的标准差较低。
欠拟合模型的学习曲线在开始时具有较低的训练损失,随着训练样例的增加逐渐增加,并在最后突然下降到任意最小点(最小并不意味着零损失)。这种最后的突然下跌可能并不总是会发生。这表明增加更多的训练样例并不能提高模型在未知数据上的性能。
在机器学习和统计建模中,过拟合(Overfitting)和欠拟合(Underfitting)是两种常见的问题,它们描述了模型与训练数据的拟合程度如何影响模型在新数据上的表现。
分析生成的学习曲线时,可以关注以下几个方面:
根据学习曲线的分析,你可以采取以下策略进行调整:
使用正则化技术(如L1、L2正则化)。
减少模型的复杂性,比如减少参数数量、层数或特征数量。
增加更多的训练数据。
应用数据增强技术。
使用早停(early stopping)等技术来避免过度训练。
通过这样的分析和调整,学习曲线能够帮助你更有效地优化模型,并提高其在未知数据上的泛化能力。
以上が学習曲線を通じて過学習と過小学習を特定するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。