监督学习:回归
使用 Python 实现 AI – 监督学习:回归
Section titled “使用 Python 实现 AI – 监督学习:回归”回归分析(Regression analysis)是统计建模和机器学习(Machine learning)的基石。它通常是首先学习的技术之一。回归模型基于一个或多个输入特征(自变量 - independent variables)预测一个连续的输出值(因变量 - dependent variable)。核心思想是从数据中学习这些变量之间的关系。
回归的应用非常广泛,包括预测股票价格、房屋价值、温度、销售数据,或任何可以用实数表示的数量。
使用 Scikit-learn 在 Python 中构建回归器
Section titled “使用 Scikit-learn 在 Python 中构建回归器”Python 及其强大的库(如 Scikit-learn、NumPy 和 Matplotlib)为构建和评估回归模型提供了极好的环境。
线性回归器(单变量)
Section titled “线性回归器(单变量)”线性回归(Linear regression)假设输入特征与输出之间存在线性关系。对于单变量而言,这种关系表示为 y = mx + c,其中 y 是输出,x 是输入,m 是斜率,c 是截距。
首先,我们导入必要的包:
import numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn import metricsimport matplotlib.pyplot as plt接下来,我们将创建一些样本数据。在实际场景中,这些数据将来自文件或数据库。
# Sample data: X (feature), y (target)# Let's create data that roughly follows y = 2x + noisenp.random.seed(0) # for reproducibilityX = np.sort(5 * np.random.rand(80, 1), axis=0)y = (2 * X).ravel() + np.random.randn(80) * 2将数据分割(Split the data)为训练集(training set)和测试集(testing set),以便在未见数据(unseen data)上评估模型性能:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)创建并训练(Train)线性回归模型:
linear_regressor = LinearRegression()linear_regressor.fit(X_train, y_train)对测试数据进行预测(Make predictions):
y_pred = linear_regressor.predict(X_test)可视化(Visualize)结果:
plt.figure(figsize=(8, 6))plt.scatter(X_test, y_test, color='red', label='Actual values')plt.plot(X_test, y_pred, color='black', linewidth=2, label='Predicted regression line')plt.xlabel('X (Feature)')plt.ylabel('y (Target)')plt.title('Linear Regression - Single Variable')plt.legend()plt.grid(True)plt.show()[图片描述:一个散点图,红色数据点代表实际值,黑色直线代表线性回归模型的拟合线。x 轴表示“X(特征)”,y 轴表示“y(目标)”。这条直线试图捕捉散点数据的整体趋势。]
评估(Evaluate)模型的性能:
print('Linear Regressor Performance:')print('Mean Absolute Error (MAE):', round(metrics.mean_absolute_error(y_test, y_pred), 2))print('Mean Squared Error (MSE):', round(metrics.mean_squared_error(y_test, y_pred), 2))print('Root Mean Squared Error (RMSE):', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 2))print('R-squared (R2 Score):', round(metrics.r2_score(y_test, y_pred), 2))性能指标(Performance metrics)解释:
- 平均绝对误差 (MAE):实际值与预测值之间的平均绝对差。
- 均方误差 (MSE):平方差的平均值。对较大的误差惩罚更多。
- 均方根误差 (RMSE):MSE 的平方根,与目标变量的单位相同。
- R 平方 (R2 Score):因变量中可由自变量预测的方差比例。取值范围通常在 0 到 1 之间(或对于较差模型可能更低);值越高越好。
这些指标的输出值取决于随机数据生成,但它们提供了对模型拟合程度的评估。
多变量回归器(多项式回归示例)
Section titled “多变量回归器(多项式回归示例)”当特征与目标之间的关系不是线性时,可以使用多项式回归(Polynomial regression)。它将输入特征转换为多项式特征(例如,x, x^2, x^3),然后应用线性回归。
首先,导入 PolynomialFeatures:
from sklearn.preprocessing import PolynomialFeatures我们生成一些非线性样本数据,例如 y = 0.5x^2 - 2x + 1 + noise:
np.random.seed(0)X_poly_data = np.sort(6 * np.random.rand(100, 1) - 3, axis=0)y_poly_data = (0.5 * X_poly_data**2 - 2 * X_poly_data + 1).ravel() + np.random.randn(100) * 1.5
# Reshape X for sklearnX_poly_train, X_poly_test, y_poly_train, y_poly_test = train_test_split(X_poly_data, y_poly_data, test_size=0.3, random_state=42)创建多项式特征(例如,次数 degree 为 2):
poly_features = PolynomialFeatures(degree=2, include_bias=False)X_train_transformed = poly_features.fit_transform(X_poly_train)X_test_transformed = poly_features.transform(X_poly_test)在这些转换后的特征上训练一个线性回归模型:
poly_regressor = LinearRegression()poly_regressor.fit(X_train_transformed, y_poly_train)进行预测:
y_poly_pred = poly_regressor.predict(X_test_transformed)可视化多项式回归拟合:
# For plotting the curve, we need to sort X_poly_testsort_axis = np.argsort(X_poly_test[:,0])X_poly_test_sorted = X_poly_test[sort_axis]y_poly_pred_sorted = y_poly_pred[sort_axis]
plt.figure(figsize=(8, 6))plt.scatter(X_poly_test, y_poly_test, color='blue', label='Actual values')plt.plot(X_poly_test_sorted, y_poly_pred_sorted, color='red', linewidth=2, label='Polynomial regression fit (degree 2)')plt.xlabel('X (Feature)')plt.ylabel('y (Target)')plt.title('Polynomial Regression')plt.legend()plt.grid(True)plt.show()[图片描述:一个散点图,蓝色数据点呈现曲线状。一条红色直线代表多项式回归拟合,它比直线更能紧密地跟随数据点的曲线趋势。x 轴表示“X(特征)”,y 轴表示“y(目标)”。]
评估多项式回归模型:
print('\nPolynomial Regressor Performance (degree 2):')print('Mean Absolute Error (MAE):', round(metrics.mean_absolute_error(y_poly_test, y_poly_pred), 2))print('Mean Squared Error (MSE):', round(metrics.mean_squared_error(y_poly_test, y_poly_pred), 2))print('R-squared (R2 Score):', round(metrics.r2_score(y_poly_test, y_poly_pred), 2))为多项式回归选择合适的次数(degree)至关重要。次数过低可能导致欠拟合(underfit),而次数过高则可能导致过拟合(overfit)。通常使用交叉验证(Cross-validation)来选择最优次数。对于具有多个输入特征的数据集(多变量回归),线性回归可以自然地扩展为 y = b0 + b1*x1 + b2*x2 + ... + bn*xn。如果 X 包含多列,Scikit-learn 的 LinearRegression 可以直接处理这种情况。