如何在Python中实现加权均方误差

  • Post category:Python

加权均方误差(Weighted Mean Squared Error, WMSE)是一种用于评估预测结果准确性的指标,与均方误差(MSE)类似,但是WMSE考虑了样本的权重。下面是在Python中实现WMSE的方法。

1. 计算WMSE的公式

WMSE的公式如下:

$$ WMSE = \frac{1}{\sum_{i=1}^{n}w_i} \sum_{i=1}^{n}w_i(y_i – \hat{y_i})^2 $$

其中,$y_i$是真实值,$\hat{y_i}$是预测值,$w_i$是样本权重。

2. 实现WMSE的python代码

下面给出一个简单的Python函数来计算WMSE:

def weighted_mean_squared_error(y_true, y_pred, weights):
    """计算加权均方误差"""
    squared_errors = (y_true - y_pred) ** 2
    weighted_errors = weights * squared_errors
    return weighted_errors.sum() / weights.sum()

其中,y_true是真实值,y_pred是预测值,weights是样本权重。函数首先计算每个样本的平方误差,然后将其乘以对应的权重,最后对加权误差进行求和,并除以所有样本的权重和。

3. 示例说明

在下面的示例中,我们使用iris数据集对WMSE进行演示。在前50个样本中,我们将setosa种类的样本权重设为2,其余为1。我们针对这个加权数据集计算了KNN模型在测试集中的表现。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 设定样本权重
n_train = len(y_train)
weights_train = np.ones(n_train)
weights_train[y_train == 0] = 2

# 建立模型,并计算加权准确率
knn = KNeighborsClassifier()
knn.fit(X_train, y_train, sample_weight=weights_train)
weighted_accuracy = knn.score(X_test, y_test)

# 计算加权均方误差
y_pred = knn.predict(X_test)
weights_test = np.ones(len(y_test))
weights_test[y_test == 0] = 2
weighted_mse = weighted_mean_squared_error(y_test, y_pred, weights_test)

print("加权准确率:", weighted_accuracy)
print("加权均方误差:", weighted_mse)

上述代码中,我们使用了numpy库来创建样本权重数组。我们将setosa种类的样本权重设置为2,其余样本的权重为1。我们然后使用这些样本权重来建立KNN模型,并计算出该模型在测试集上的加权准确率和加权均方误差。