Python 機械学習におけるモデルの選択と評価

1 はじめに

機械学習システムでは、より良いモデルをトレーニングする方法、モデルの効果を判断する方法、およびモデルが過剰適合しているかどうかは、モデルの最終的な使用にとって非常に重要です。

2. モデルフィッティング効果

機械学習モデルのトレーニング プロセス中に、モデルのアンダーフィッティング、モデルの通常のフィッティング、モデルのオーバーフィッティングの 3 つの状況が発生する可能性があります。モデルのアンダーフィッティングとモデルのオーバーフィッティングはどちらも悪い状況です。モデルがどのフィッティング状況に属するかを別の角度から判断する方法を紹介します。

2.1 アンダーフィッティングとオーバーフィッティングのパフォーマンス

データの 3 つのフィッティング状況を以下に説明します。

  • アンダーフィッティング: アンダーフィッティングとは、トレーニング データから有用なデータ パターンをうまく学習できないことを指し、トレーニング データも予測されるデータも良好な予測結果を得ることができません。使用するトレーニング サンプルが少なすぎると、アンダーフィットのトレーニング モデルを取得しやすくなります。
  • 通常のフィッティング: 通常のフィッティングとは、トレーニングされたモデルがトレーニング セットから学習して、一般化能力が高く、予測誤差が小さいモデルを取得できることを意味します. 同時に、モデルはテスト対象のデータに対して適切な予測を行い、印象的な結果を得ることができます.十分な予測効果。
  • オーバーフィッティング: オーバーフィッティングとは、特定のデータセットを正確に当てはめることを指し、結果として得られるモデルが他のデータにうまく適合しないか、将来の観測を予測しません。モデルがオーバーフィットしている場合、モデルの偏差は小さくなりますが、分散は大きくなります。

以下は、分類問題と回帰問題のさまざまなタスクのフィッティング効果から得られたデータでトレーニングした後のモデルの表現を紹介しています。

二項分類問題の場合、インターフェイスを使用して、取得したモデルとトレーニング データの表現を表すことができます。
二分法の問題

上の図から、アンダーフィッティング データ モデルは比較的単純であるため、得られる予測誤差は大きくなりますが、オーバーフィッティング モデルは正反対です. そのインターフェースはすべてのトレーニング データを完全に正しく分類し、得られたモデルは複雑すぎます.トレーニング データは 100% 正しく予測できますが、新しいテスト データを予測するときはエラー率が高くなります。ただし、通常はデータに適合するモデルの場合、データへの適合効果は過小適合と過剰適合の間であり、テスト セットでの一般化能力を確保するために、トレーニングによって複雑度の低いモデルが取得されます。3 つのケースのトレーニング セットの予測エラーの形式は、アンダーフィッティング > 通常のフィッティング > オーバーフィッティングであり、テスト セットの予測エラーの形式は、アンダーフィッティング > オーバーフィッティング > 通常のフィッティングです。

回帰問題の場合、連続変数を予測するときの 3 つのデータ フィッティング状況を下の図に示します。これは、3 つの状況の一連の連続変数に対してデータ フィッティングを実行したときに起こりうるアンダーフィッティング、ノーマル フィッティング、およびオーバーフィッティングを示しています。
ここに画像の説明を挿入

多くの場合、高次元のデータに直面すると、分類モデルのインターフェースと回帰モデルの予測効果を視覚化することが難しいため、モデルの適合性をどのように判断するか? この場合、2 つの判断スキーム通常使用できます: 1 つは、トレーニング セットとテスト セットの予測誤差の違いを判断するもので、通常のフィッティング モデルは通常、トレーニング セットとテスト セットの予測誤差が同じであり、予測効果は良好です。テスト セットに対する予測効果は低く、オーバーフィッティング モデルはトレーニング セットでは小さな予測エラーを取得しますが、テスト セットでは大きな予測エラーを取得します。2 つ目は、下の図に示すように、モデルのトレーニング プロセス中に、トレーニング データとテスト データ (または検証データ) の 3 つの異なるデータ フィッティングの損失関数の変化を視覚化することです。
ここに画像の説明を挿入

2.2 アンダーフィッティングとオーバーフィッティングを回避する方法

実際には, 訓練されたモデルがデータに適合しないか過剰適合することが判明した場合, 通常はモデルを調整する必要があります. これらの問題を解決することは複雑なプロセスであり, 多くの場合複数の調整が必要です. 以下に使用できるいくつかの方法を紹介します. .

1. データ量を増やす
トレーニングデータが小さい場合、データのアンダーフィッティングにつながる可能性があり、場合によってはトレーニングセットでオーバーフィッティングの問題も発生します。したがって、通常、トレーニング サンプルが多いほど、モデルがより安定するため、トレーニング サンプルを増やすと、より効果的なトレーニング結果が得られるだけでなく、モデルのフィッティング効果がある程度調整され、一般化能力が向上します。ただし、トレーニング サンプルが限られている場合は、データ拡張手法を使用して既存のデータ セットを拡張することもできます。

2. 合理的なデータ セグメンテーション
既存のデータ セットの場合、モデルをトレーニングするときに、データ セットをトレーニング セット、検証セット、およびテスト セットに分割できます (または交差検証法を使用します)。データがセグメント化された後、トレーニング セットを使用してモデルをトレーニングし、検証セットを介してモデルの学習プロセスを監視し、ネットワークがオーバーフィットする前にモデルのトレーニングを終了できます。モデルのトレーニングが終了したら、テスト セットを使用して、トレーニング結果の一般化能力をテストできます。
もちろん, データが可能な限り同じ分布から来ることを保証する場合, データセットを効果的に分割する方法も非常に重要です. 従来のデータ分割方法は通常 60:20 の比率に従って分割されます: 20, しかし、データの量は異なります. データセグメンテーションの比率も異なります, 特にビッグデータの時代に, データセットに数百万または数億のエントリがある場合, この伝統的な分割 60:20:20できるだけ多くのサンプルがトレーニングされるように、データセットの 98% をトレーニングに使用し、サンプルの 1% を検証セットに使用することをお勧めします. この 1% のデータには、モデルが過剰適合しているかどうかを監視するのに十分なサンプルが既にあり、最終的にサンプルの 1% を使用して、ネットワークの汎化能力をテストします。したがって、データ ボリュームのサイズとネットワーク パラメータの数に関しては、実際のニーズに応じてデータ分割比率を決定できます。

3. 正規化法 正規
化法は、モデルのオーバーフィッティングの問題を解決する手段です. 通常、損失関数のトレーニング パラメータにノルム ペナルティを追加し、追加されたノルム ペナルティを通じてトレーニングする必要があるパラメータを制約して、モデルが過剰適合。一般的に使用される正則化パラメーターは、l、1、ノルム、1、ノルム ペナルティの目的はパラメーターの絶対値を最小化すること、1、ノルム ペナルティの目的はパラメーターの二乗和を最小化することです。 . 過適合を防ぐために正則化を使用することは非常に効果的です. 古典的な線形回帰モデルでは, 1 ノルム正則化を使用するモデルは LASSO 回帰と呼ばれ, 1 ノルム正則化を使用するモデルはリッジ回帰と呼ばれます. これらの 2 つの方法については後の章で紹介します.

3. 分析例

3.1 アイリスデータセット

Sklearn 機械学習パッケージでは、さまざまなデータセットが統合されています。非常に一般的に使用されるデータ セットである Iris (Iris) データ セット。アヤメには 3 つの亜属、Iris-setosa、Iris-versicolor、および Iris-virginica があります。データセットには、合計 4 つの特徴変数と 1 つのカテゴリ変数が含まれています。全部で150個のサンプルがあります. アイリスはアヤメの植物です. ​​がく片と花びらの長さと幅がここに格納されています. 全部で4つの属性があります. アヤメには3種類あります.
ここに画像の説明を挿入

3.2 虹彩データのクラスタリング

##输出高清图像
##图像显示中文的问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus'] = False
import seaborn as sns ##设置绘图的主题
sns.set(font="Kaiti",style="ticks" , font_scale=1.4)

import pandas as pd #设置数据表每个单元显示内容的最大宽度
pd.set_option ("max_colwidth",100)
import numpy as np
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.model_selection import KFold,StratifiedKFold
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from mlxtend.plotting import plot_decision_regions
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier

##数据准备,读取鸢尾花数据集
X,y=load_iris(return_X_y=True)
##为了方便数据的可视化分析,将数据降维到二维空间
pca=PCA(n_components=2,random_state=3)
X=pca.fit_transform(X)
#可视化数据降维后在空间中的分布情况
plt.figure(figsize=(4,3))
sns.scatterplot(x=X[:,0],y= X[:,1],style=y)
plt.title("Iris Dimension Reduction")
plt.legend(loc="lower right")
plt.grid()
plt.show()

##使用KFold对Iris数据集分类
kf=KFold(n_splits=6,random_state=1,shuffle=True)
datakf=kf.split(X,y)
##获取6折数据
##使用线性判别分类算法进行数据分类
LDA_clf=LinearDiscriminantAnalysis(n_components=2)
scores=[]
##用于保存每个测试集上的精度
plt.figure(figsize=(7,4))
for ii,(train_index,test_index) in enumerate (datakf):
    #使用每个部分的训练数据训练模型
    LDA_clf=LDA_clf.fit (X[train_index], y[train_index])#计算每次在测试数据上的预测精度
    prey=LDA_clf.predict (X[test_index])
    acc=metrics.accuracy_score(y[test_index] ,prey)##可视化每个模型在训练数据上的切分平面
    plt.subplot(2,3,ii+1)
    plot_decision_regions (X[train_index], y[train_index],LDA_clf)
    plt.title ("Test Acc:"+str(np.round (acc,4)))
    scores.append(acc)

plt.tight_layout()
plt.show()
#计算精度的平均值
print("平均Acc:" , np.mean (scores))

結果
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/wokaowokaowokao12345/article/details/128444410