Skip to content

监督学习:回归

使用 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)为构建和评估回归模型提供了极好的环境。

线性回归(Linear regression)假设输入特征与输出之间存在线性关系。对于单变量而言,这种关系表示为 y = mx + c,其中 y 是输出,x 是输入,m 是斜率,c 是截距。

首先,我们导入必要的包:

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
import matplotlib.pyplot as plt

接下来,我们将创建一些样本数据。在实际场景中,这些数据将来自文件或数据库。

# Sample data: X (feature), y (target)
# Let's create data that roughly follows y = 2x + noise
np.random.seed(0) # for reproducibility
X = 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 sklearn
X_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_test
sort_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 可以直接处理这种情况。