15-評価回帰アルゴリズムRSquare

  前回のブログでは、回帰アルゴリズムの長所と短所を評価するための3つの指標、MSE、RMSE、およびMAEが紹介されました。実際、これらの指標には問題があります。分類問題を学習していたとき、分類問題の評価指標、つまり分類の精度は非常に単純だったことを思い出してください。分類精度の場合、その値は0〜1です。 1の場合は、分類精度が100%で最高であり、0の場合は最低であり、分類精度が0-1であるため、この評価基準は非常に明確です。分類する問題が異なっていても、それらの間の長所と短所を簡単に比較できます。

  しかし、RMSEとMAEにはそのような特性はありません。たとえば、私の予測は不動産データである可能性があります。最後に取得するRMSEまたはMAEのいずれの場合でも、値は5です。つまり、エラーは50,000元であり、学生の成績ではエラーが10であると予測される可能性があります。 、つまり、予測ギャップは10ポイントです。この場合、不動産の予測に私たちのアルゴリズムが使用されていますか?それとも、学生のパフォーマンスを予測するために使用する必要がありますか?判断できません。これは、5と10は異なる種類のものに対応しており、直接比較できないためです。これは、私たちが使用するRMSEとMAEの制限です。

  その後、この問題を解決することができます。解決策は、新しいインジケーターR Squaredを使用することです。これは、通常、中国語ではRSquareと呼ばれます。次の式を使用して計算します。
ここに写真の説明を挿入
  これを参照してください。気を失ってはいけません。次の式を見てください
ここに写真の説明を挿入
  。このような式がリストされていれば、このR二乗を計算するようにプログラムすることができます。

  しかし、R-squareインジケーターの意味についてもっと知りたいですか?なんでいいの?
ここに写真の説明を挿入
次に、R側の計算結果を見てみましょう。次の結論が得られます。

  • R ^ 2 <= 1
  • R ^ 2大きいほど良い。予測モデルに誤りがない場合、R ^ 2は最大値1を取得します。
  • モデルがベースラインモデルと等しい場合、R ^ 2は0です。
  • R ^ 2 <0の場合、学習したモデルはベンチマークモデルほど良くありません。この時点で、データに線形関係がない可能性が非常に高くなります。

  したがって、R ^ 2を使用することには非常に重要な利点があります。これは、回帰問題の最終的な測定結果を0-1の間に減らすことと同等であり、1が最良で、0が最悪です。この場合、このインジケーターを非常に便利に使用して、同じ回帰アルゴリズムをさまざまな問題に適用して得られた最終結果を比較できます。ただし、R-squareと分類の問題の精度は大きく異なります。つまり、R-squareが0未満の状況があります。R-squareが0未満の場合、モデルが取得するエラーが、ベンチマークモデルを使用して取得するエラーよりも大きいことを意味します。これはどういう意味ですか?これは、モデルを長い間トレーニングしてきたことを意味します。トレーニングしない方がよいです。ベンチマークモデルを直接使用して予測した結果は、トレーニングしたモデルの結果よりも優れています。この場合、R-squareはゼロ未満になります。実際、実際のデータを処理しているときに、R二乗が0未満の状況が発生する可能性があります。この状況が発生した場合は、注意が必要です。トレーニングしたモデルが非常に悪いことを示しています。率直である方がよいでしょう。ベンチマークモデルを使用します。したがって、この場合、通常、データに線形関係がまったくないことを意味します。ここで学習しているのは線形回帰です。これは非常に重要な仮定です。データ間に特定の線形関係があることを前提としています。ここで説明する線形関係は、正の相関を持つ線形関係または負の相関を持つ線形関係です。傾きが0より大きいか0より小さいというだけです。ただし、データに線形関係がまったくない場合、取得されたR二乗が0未満である可能性が非常に高いため、線形回帰を使用してこの問題を解決できないことを考慮する必要があります。

  最後に、特定の実装のレベルで、R式の式を詳しく見てみましょう。この式は少し馴染みがありますか?式の一部の分子と分母を同時に1からmで割ると、分子が計算されます。これはMSEであり、分母が分散を計算します。
ここに写真の説明を挿入
ここに写真の説明を挿入
  式(3)の形式でR-squareを書くと、R-squareの計算は非常に簡単になります。すると、この式から、R側の方が統計的有意性が深いと漠然と感じるかもしれませんが、私は初心者なので深くは入りません。興味のある友達は自分で関連情報を確認できます。


プログラミングの実現

  次に、RSquareの非常に重要な標準を実装するようにプログラムします。

  以前のブログのJupyterNotebookでコードを書き続けています。

ここに写真の説明を挿入
  以下では、作成したmetrics.pyファイルにメソッド(r2_score)をカプセル化します。

import numpy as np
from math import sqrt

def accuracy_score(y_true, y_predict):
    """计算y_true和y_predict之间的准确率"""
    assert y_true.shape[0] == y_predict.shape[0], \
        "the size of y_true must be equal to the size of y_predict"
    return sum(y_true == y_predict) / len(y_true)

# MSE:均方误差
def mean_squared_error(y_true, y_predict):
    """计算y_true与y_predict之阿的MSE"""
    assert len(y_true) == len(y_predict), \
        "the size of y_true must be equal to the size of y_predict"
    return np.sum((y_true - y_predict) ** 2) / len(y_true)

# RMSE:均方根误差
def root_mean_squared_error(y_true, y_predict):
    """计算y_true与y_predict之阿的RMSE"""
    return sqrt(mean_squared_error(y_true, y_predict))

# MAE:平均绝对误差
def mean_absolute_error(y_true, y_predict):
    """计算y_true与y_predict之阿的MAE"""
    assert len(y_true) == len(y_predict), \
        "the size of y_true must be equal to the size of y_predict"
    return np.sum(np.absolute(y_true - y_predict)) / len(y_true)

# R Square
def r2_score(y_true, y_predict):
    """计算y_true和y_predict之间的R Square"""
    return 1 - mean_squared_error(y_true, y_predict) / np.var(y_true)

ここに写真の説明を挿入
ここに写真の説明を挿入

  最後に、sklearnでは線形回帰アルゴリズムがのLinearRegressionカプセル化されていますが、単純な線形回帰を学習しているだけなので、このLinearRegressionは複数の線形回帰を直接サポートしています。このクラスはまだ使用しないでください。

  以前に学習したkNNアルゴリズムでは、スコアなどの関数がkNNアルゴリズムに直接カプセル化され、アルゴリズム自体の精度を直接測定することを思い出してください。スコア関数もある回帰アルゴリズムについても同じことが言えます。
ここに写真の説明を挿入
  スコア関数がR側の基準を直接返すことがわかります。ここから、Rの基準が重要すぎて、最も広く使用されている基準でもあることがわかります。そのため、SimpleLinearRegressionにスコア関数も追加します。

# SimpleLinearRegression.py

import numpy as np
from metrics import r2_score
# 使用向量化运算
class SimpleLinearRegression:
    def __init__(self):
        """初始化 Simple Linear Regression 模型"""
        self.a_ = None
        self.b_ = None
    def fit(self, x_train, y_train):
        """根据训练数据集 x_train, y_train训练模型"""
        assert x_train.ndim == 1, \
            "Simple Linear Regression can only solve single feature training data"
        assert len(x_train) == len(y_train), \
            "the size of x_train must be equal to the size of y_train"

        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        num = (x_train - x_mean).dot(y_train - y_mean) #分子点乘
        d = (x_train - x_mean).dot(x_train - x_mean) #分母点乘

        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean

        return self
    def predict(self, x_predict): # x_predict 为一个向量
        """给定预测数据集x_predict, 返回表示x_predict的结果向量"""
        assert x_predict.ndim == 1, \
            "Simple Linear Regression can only solve single feature training data"
        assert self.a_ is not None and self.b_ is not None, \
            "must fit before predict!"
        return np.array([self._predict(x) for x in x_predict])
    def _predict(self, x_single): # x_single 为一个数
        """给定单个预测数据x_single, 返回x_single的预测结果值"""
        return self.a_ * x_single + self.b_
    def score(self, x_test, y_test):
        """根据测试数据集x_test和y_test确定当前模型的准确度"""
        y_predict = self.predict(x_test)
        return r2_score(y_test, y_predict)
    def __repr__(self):
        return "SimpleLinearRegression()"

ここに写真の説明を挿入

  これまでのところ、単純な線形回帰学習はここで終了します。実際、アルゴリズムの部分は比較的単純です。アルゴリズムの使用方法は?アルゴリズムを評価する方法は?これらの問題については、勉強する価値のある場所がたくさんあるかもしれません。

  後で、各サンプルが単純な線形回帰で1つの特徴しか持てないという条件を破棄します。サンプルごとに複数の特徴が存在する可能性があり、n個の特徴のより一般的な形式は複数の線形回帰問題に対応します。


特定のコードについては、14回帰アルゴリズムの評価を参照してください。ipynb

おすすめ

転載: blog.csdn.net/qq_41033011/article/details/109012402