Python 中的模型诊断技术:从学习曲线到残差分析
模型诊断是评估机器学习模型性能的重要步骤。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 提供了丰富的模型诊断技术,学习曲线和残差分析是其中两个重要的技术。它们可以帮助我们了解模型的表现和缺陷,从而优化模型并提高预测的准确性。
相关文章