Python 中的模型诊断技术:从学习曲线到残差分析

2023-04-14 00:00:00 模型 曲线 诊断

模型诊断是评估机器学习模型性能的重要步骤。Python 提供了丰富的模型诊断技术,以下依次介绍两个常用的模型诊断技术:学习曲线和残差分析。

学习曲线

学习曲线可以帮助我们评估模型的性能是否过拟合或欠拟合。学习曲线通常是以样本量为横轴,以训练误差和测试误差为纵轴绘制的。如果训练误差和测试误差都很高,则代表欠拟合;而如果训练误差很低而测试误差很高,则代表过拟合。

下面的代码演示了使用学习曲线来评估一个决策树模型:

from sklearn.datasets import load_boston
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

data = load_boston()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target)

train_errors, test_errors = [], []
for i in range(1, len(X_train)):
    model = DecisionTreeRegressor(max_depth=i)
    model.fit(X_train[:i], y_train[:i])
    y_train_pred = model.predict(X_train[:i])
    y_test_pred = model.predict(X_test)
    train_errors.append(mean_squared_error(y_train[:i], y_train_pred))
    test_errors.append(mean_squared_error(y_test, y_test_pred))

plt.plot(range(1, len(X_train)), train_errors, label='Train')
plt.plot(range(1, len(X_train)), test_errors, label='Test')
plt.xlabel('Training set size')
plt.ylabel(' MSE')
plt.legend()
plt.show()

代码中使用波士顿房价数据集,训练数据和测试数据按照3:1的比例进行划分。然后,我们逐步增加数据量,使用不同深度的决策树模型进行训练,计算训练误差和测试误差。最后,将结果绘制成学习曲线。

残差分析

残差分析可以排除模型在某些参数上的缺陷,也可以评估模型在现实数据中的性能。残差是指模型的预测结果与实际结果之间的差距。在模型进行预测时,我们可以将训练样本中的每个实例作为测试样本,计算它们的残差。 如果残差有规律,则说明模型有问题。

下面的代码演示了如何使用残差图来诊断线性回归模型的错误:

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

data = load_boston()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target)

model = LinearRegression()
model.fit(X_train, y_train)
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
train_residuals = y_train - y_train_pred
test_residuals = y_test - y_test_pred

plt.scatter(y_train_pred, train_residuals, c='blue', marker='o', label='Training data')
plt.scatter(y_test_pred, test_residuals, c='lightgreen', marker='s', label='Testing data')
plt.xlabel('Predicted values')
plt.ylabel('Residuals')
plt.legend()
plt.title('Linear regression residuals')
plt.show()

代码中使用波士顿房价数据集训练了一个线性回归模型,并计算了训练和测试的残差。然后,我们将预测值绘制在 x 轴上,残差绘制在 y 轴上,同时绘制训练集和测试集的残差图。

总结

Python 提供了丰富的模型诊断技术,学习曲线和残差分析是其中两个重要的技术。它们可以帮助我们了解模型的表现和缺陷,从而优化模型并提高预测的准确性。

相关文章