データの前処理とモデル評価 [機械学習、人工知能、実践例]

機械学習におけるデータの前処理とモデルの評価

機械学習の分野では、データの前処理とモデルの評価は 2 つの重要なステップです。これらにより、私たちが構築する機械学習モデルがデータから効果的に学習し、正確な予測を行えることが保証されます。この記事では、データ前処理とモデル評価の概念を詳しく紹介し、実際の例を通じてそれらの密接な関係を説明します。

データの前処理

データの前処理とは何ですか?

データの前処理は機械学習において不可欠なステップであり、これにはデータ クリーニングと特徴エンジニアリングという 2 つの主要な側面が含まれます。

データクリーニング

データ クリーニングには、データ内のエラー、異常、欠損値の特定と処理が含まれます。これらの問題により、モデルのトレーニングが不安定になったり、不正確な予測が生成されたりする可能性があります。データ クリーニングの主な手順は次のとおりです。

  • 欠損値の処理: 欠損値を特定して処理するか、欠損値を含むサンプルを削除するかを選択します。たとえば、販売データで製品の価格データが欠落している場合、平均または中央値を使用してそれを埋めることができます。

  • 外れ値の検出と処理: 外れ値を検出して処理し、モデルのパフォーマンスに影響を与えないようにします。外れ値は、データ収集エラーまたはその他の理由が原因である可能性があります。たとえば、体重データに負の値がある場合、これは明らかに異常であり、修正または削除する必要があります。

特徴エンジニアリング

特徴エンジニアリングには、機械学習モデルで使用する特徴の選択、変換、作成が含まれます。優れた特徴量エンジニアリングにより、モデルのパフォーマンスを大幅に向上させることができます。特徴量エンジニアリングの主な手順は次のとおりです。

  • 機能の選択: 問題に関連する機能を選択し、冗長または無関係な機能を削除します。これは、モデルの複雑さを軽減し、汎化機能を向上させるのに役立ちます。

  • 特徴変換: モデルによりよく適合するように特徴を変換します。たとえば、対数変換を使用すると、右に歪んだデータをほぼ正規分布に変換でき、これは線形モデルにとって有益です。

例: 医療データセットの前処理

患者の年齢、性別、体重、血圧、病気の状態を含む医療データセットの例を見てみましょう。データを前処理する前に、次の問題が発生する可能性があります。

  1. 欠損値: 一部の患者の体重データが欠落しています。データの整合性を維持するために、これらの欠損値を埋めるために平均体重を使用することを選択できます。

  2. 外れ値: データには 200 歳の患者の記録がありますが、これは明らかに外れ値です。それを削除するか修正する必要があります。

  3. 特徴の選択: 性別は、病状の予測において無関係な特徴である可能性があります。データセットからそれを削除することを選択できます。

  4. 特徴変換: 血圧データが右に歪んだ分布を示している場合、モデルの仮定をよりよく満たすために対数変換できます。

これらの前処理ステップを通じて、機械学習モデルのトレーニングにより適したデータを準備できます。

以下は、NumPy と Pandas を使用したデータ処理のコード例で、データ前処理の実際の手順をより詳細に示しています。

import numpy as np
import pandas as pd

# 创建一个示例数据集
data = {
    
    'Age': [25, 30, 35, 40, 45],
        'Weight': [70, 75, np.nan, 80, 85],
        'BloodPressure': [120, 130, 140, 150, 160],
        'DiseaseStatus': [0, 1, 0, 1, 1]}

df = pd.DataFrame(data)

# 处理缺失值
mean_weight = df['Weight'].mean()
df['Weight'].fillna(mean_weight, inplace=True)

# 处理异常值
df = df[df['Age'] < 100]

# 特征选择和变换
# 假设我们决定在建模时不考虑性别,可以将其从数据集中删除
df.drop('Gender', axis=1, inplace=True)

# 对血压进行对数变换
df['BloodPressure'] = np.log(df['BloodPressure'])

# 打印预处理后的数据集
print(df)

上記のコードは、まずサンプル データセットを作成し、次に Pandas を使用して欠損値と外れ値を処理し、特徴の選択と特徴の変換を実行します。これらの手順はデータの前処理の一部であり、データが機械学習モデルのトレーニングに適していることを確認します。

モデルの評価と選択

モデル評価とは何ですか?

機械学習の過程では、モデルをトレーニングしたら、そのパフォーマンスを完全に評価する必要があります。このプロセスは と呼ばれ模型评估、モデルが実際のアプリケーションのニーズに対応できるほど堅牢であることを確認するための重要なステップです。

相互検証

モデルのパフォーマンスと一般化能力を評価するには、相互検証と呼ばれる広く認識されている手法を使用します。相互検証の原理は、データセットを重複しない複数のサブセットに分割し、1 つの部分をモデルのトレーニングに使用し、もう 1 つの部分をモデルの検証に使用することです。このアプローチの利点は、トレーニングと検証を複数回繰り返して、モデルのパフォーマンスをより正確に推定できることです。

評価指標の選択

ただし、モデルのパフォーマンスについての洞察を得るには、問題とタスクに適切な評価指標を選択する必要があります。問題が異なれば、モデルの有効性を測定するための指標も異なります。一般的な評価指標をいくつか示します。

  • 精度: これは、バイナリまたは多分類の問題に使用される一般的なメトリックで、モデルによって正しく分類されたサンプルの割合を測定します。ただし、クラスの不均衡がある場合、正確さが誤解を招く可能性があることに注意してください。

  • 精度再現率: これらの指標は、不均衡なクラスの問題に対処するために非常に重要です。精度はモデルが陽性クラスをどれだけ正確に予測するかを測定し、再現率は陽性クラスを発見するモデルの能力を測定します。それらの間のトレードオフは、特定のアプリケーション シナリオによって異なります。

  • 平均二乗誤差 (MSE) : 回帰問題では、通常、モデルのパフォーマンスを測定するために MSE を使用します。モデルの予測値と実際の値の間の平均差を測定します。MSE が小さいほど、モデルの予測が実際の状況に近いことを示します。

適切な評価指標を選択することで、さまざまな状況でモデルがどのように機能するかをより深く理解し、必要に応じて調整や改善を行うことができます。このプロセスはモデル開発に不可欠な部分であり、モデルが実際のアプリケーションで適切に動作することを保証するのに役立ちます。

過学習と過小学習を解決する

過学習

過学習とは、モデルがトレーニング データでは良好にパフォーマンスするが、未確認のテスト データではパフォーマンスが低下することです。これは、モデルが複雑すぎるため、トレーニング データ内のノイズが過剰適合されるためです。

アンダーフィッティング

アンダーフィッティングとは、モデルがトレーニング データにうまく適合できず、トレーニング データとテスト データの両方でパフォーマンスが低下することを意味します。多くの場合、これはモデルが単純すぎて、データ内の複雑な関係を捉えることができないことが原因です。

過学習と過小学習を解決するにはどうすればよいでしょうか?

  • 過学習を解決するには、モデルの複雑さを軽減する、トレーニング データの量を増やす、正則化手法 (
    L1 または L2 正則化など) を使用するなどの方法を採用できます。

  • アンダーフィッティングの解決: モデルの複雑さの増加、特徴量エンジニアリングの改善、トレーニング時間の増加などを行うことができます。

データの前処理とモデルの評価を通じて、データをより深く理解し、活用して、高性能の機械学習モデルを構築できます。これらの手順は、現実世界の機械学習プロジェクトを成功させるための重要な要素であり、過学習や過小学習などの一般的な問題を回避し、モデルの信頼性と汎化能力を向上させるのに役立ちます。

実践例:住宅価格予測

住宅価格予測のための機械学習プロジェクトに取り組んでいるとします。住宅の特徴とそれに対応する価格を含むデータセットがあり、私たちの目標は、入力された特徴に基づいて住宅の価格を予測できるモデルを構築することです。このシナリオでは、データの前処理とモデルの評価が非常に重要です。

データの前処理

まず、データを前処理して、モデルのトレーニングに適していることを確認する必要があります。実行する必要がある可能性のあるデータの前処理手順をいくつか示します。

  1. 欠損値の処理: 家の寸法や寝室の数など、データに欠損値がないか確認します。平均値、中央値、またはその他の統計情報を使用して、これらの欠損値を埋めることができます。

  2. 外れ値の処理: 極端に高い価格や安い価格などの外れ値を見つけて処理し、モデルのパフォーマンスに影響を与えないようにします。外れ値は切り捨てまたは置換によって処理できます。

  3. 特徴エンジニアリング: ドメインの知識または機能の重要性に基づいて、適切な機能を選択します。たとえば、価格の変化をより適切に捕捉するために、家の総面積などの新しい特徴を作​​成できます。

  4. データの正規化: 線形回帰などの一部の機械学習アルゴリズムでは、データの標準化 (正規化) がモデルのトレーニングに役立つ場合があります。これは、平均を減算し、標準偏差で割ることによって達成できます。

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 加载数据集
data = pd.read_csv('house_prices.csv')

# 处理缺失值
data.fillna(data.mean(), inplace=True)

# 处理异常值(例如,删除价格小于1000的记录)
data = data[data['Price'] >= 1000]

# 特征工程:创建总面积特征
data['TotalArea'] = data['LivingArea'] + data['GarageArea']

# 数据标准化
scaler = StandardScaler()
data[['TotalArea', 'Bedrooms']] = scaler.fit_transform(data[['TotalArea', 'Bedrooms']])

# 分割数据集为训练集和测试集
X = data[['TotalArea', 'Bedrooms']]
y = data['Price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

モデルの評価

データの前処理が完了したら、モデルのトレーニングと評価を開始できます。この例では、モデルとして線形回帰を使用し、評価指標として二乗平均平方根誤差 (RMSE) を選択します。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算均方根误差(RMSE)来评估模型性能
rmse = mean_squared_error(y_test, y_pred, squared=False)
print(f'Root Mean Squared Error (RMSE): {
      
      rmse}')

この例では、均方根误差を使用してモデルのパフォーマンスを評価します。RMSE 値が低いほど、モデルの予測が実際の住宅価格に近いことを示し、これは重要な評価指標です。

機械学習モデルの過学習と過小学習の問題については、サンプル コードと解決策を使用して、これら 2 つの問題とその対処方法を説明できます。

過学習問題

過学習とは、モデルがトレーニング データでは良好にパフォーマンスするが、未確認のテスト データではパフォーマンスが低下することです。これは通常、モデルが複雑すぎる場合に発生し、トレーニング データのノイズやニュアンスをキャプチャしようとします。以下は、住宅価格予測モデルで過学習問題がどのように現れるか、およびその解決方法を示す例です。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt

# 创建一个带有噪声的示例数据集
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - np.random.rand(16))

# 拟合一个高阶多项式模型
degree = 15
model = LinearRegression()
X_poly = np.vander(X.ravel(), degree)
model.fit(X_poly, y)
y_pred = model.predict(X_poly)

# 计算训练集和测试集的均方根误差(RMSE)
rmse_train = np.sqrt(mean_squared_error(y, y_pred))

# 绘制数据和拟合曲线
plt.scatter(X, y, s=20, label='Data')
plt.plot(X, y_pred, color='r', label=f'Polynomial Degree {
      
      degree}\nTrain RMSE: {
      
      rmse_train:.2f}')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()

この例では、高次多項式モデル (次数 15) を使用してノイズのあるデータを適合させます。図に示すように、モデルはトレーニング データにほぼ完全に適合しますが、テスト データではパフォーマンスが低下する可能性があり、これは典型的な過剰適合状況です。

過学習問題を解決する方法:
  1. モデルの複雑さを減らす: 多項式の次数を減らしたり、ニューラル ネットワークの層の数を減らしたりするなど、モデルの複雑さを減らすことができます。

  2. トレーニング データの量を増やす: データが増えると、モデルの一般化が向上します。

  3. 正則化メソッドを使用する: L1 正則化や L2 正則化などの正則化手法を使用すると、モデルの複雑さを制限できます。

アンダーフィッティングの問題

過小適合とは、モデルがトレーニング データにうまく適合できないことを指します。通常は、モデルが単純すぎてデータの特徴を捉えることができないことが原因です复杂关系

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt

# 创建一个带有噪声的示例数据集
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

# 拟合一个线性模型
model = LinearRegression()
model.fit(X, y)
y_pred = model.predict(X)

# 计算训练集的均方根误差(RMSE)
rmse_train = np.sqrt(mean_squared_error(y, y_pred))

# 绘制数据和拟合线
plt.scatter(X, y, s=20, label='Data')
plt.plot(X, y_pred, color='r', label=f'Linear Model\nTrain RMSE: {
      
      rmse_train:.2f}')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()

この例では、線形モデルを使用してノイズの多い正弦波データを近似します。図に示すように、線形モデルはデータの非線形関係をうまく当てはめることができません。これは、アンダーフィッティングの問題の典型的な現れです。

アンダーフィッティングの問題を解決する方法:
  1. モデルの複雑性を高める: 多項式回帰やディープ ニューラル ネットワークなど、より複雑なモデルの使用を試すことができます。

  2. 特徴エンジニアリングの改善: 関連性のある特徴を追加するか、特徴変換を実行します。

  3. トレーニング時間を増やす: モデルのトレーニング時間を増やし、データによりよく適合できるようにします。

  4. アンサンブル学習: ランダム フォレストや勾配ブースト ツリーなどのアンサンブル学習手法を使用して、モデルのパフォーマンスを向上させます。

おすすめ

転載: blog.csdn.net/qq_22841387/article/details/133432863