如何在Python中进行二次回归

  • Post category:Python

在Python中进行二次回归分析,我们可以使用一些流行的数据分析和机器学习库,例如NumPy、Pandas和Scikit-Learn。下面是详细的攻略:

1. 收集数据和导入库

首先,需要收集用于二次回归分析的数据,并导入必要的Python库和模块。在这个示例中,我们将使用Scikit-Learn的 load_diabetes() 函数来加载糖尿病数据集,并使用NumPy、Pandas和Matplotlib库来处理和可视化数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes

# 加载数据集
diabetes = load_diabetes()

# 将数据放入pandas数据框中
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)

# 选择一个特征和目标
X = df['bmi'].values.reshape(-1, 1)
y = diabetes.target.reshape(-1, 1)

2. 分离数据集

将数据集分成训练集和测试集是实施二次回归分析的关键步骤之一。我们可以使用Scikit-Learn的 train_test_split() 函数来将数据集分成两个部分:

from sklearn.model_selection import train_test_split

# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. 进行二次回归分析

现在,我们可以使用Scikit-Learn的 PolynomialFeatures()LinearRegression() 类来实现二次回归分析。首先,我们需要将特征向量转换为二次多项式,然后使用多元线性回归来拟合数据:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 转换为二次多项式特征
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# 进行线性回归分析
regressor = LinearRegression()
regressor.fit(X_train_poly, y_train)

4. 评估模型

我们可以使用R²分数和均方根误差(RMSE)来评估模型的性能。R²分数(也称为拟合优度)表示回归模型对原始数据的拟合程度,取值范围为0到1。RMSE是一个度量预测误差的标准差。

from sklearn.metrics import r2_score, mean_squared_error

# 预测训练集和测试集的目标值
y_train_pred = regressor.predict(X_train_poly)
y_test_pred = regressor.predict(X_test_poly)

# 计算R²分数和RMSE
print('训练集R²分数:', r2_score(y_train, y_train_pred))
print('测试集R²分数:', r2_score(y_test, y_test_pred))
print('训练集RMSE:', np.sqrt(mean_squared_error(y_train, y_train_pred)))
print('测试集RMSE:', np.sqrt(mean_squared_error(y_test, y_test_pred)))

示例一:糖尿病数据集

接下来,我们将使用糖尿病数据集来演示如何使用二次回归分析。下面的代码将生成一个在训练集和测试集上的二次回归模型,并打印出R²分数和RMSE值:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error

# 加载数据集
diabetes = load_diabetes()

# 将数据放入pandas数据框中
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)

# 选择一个特征和目标
X = df['bmi'].values.reshape(-1, 1)
y = diabetes.target.reshape(-1, 1)

# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 转换为二次多项式特征
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# 进行线性回归分析
regressor = LinearRegression()
regressor.fit(X_train_poly, y_train)

# 预测训练集和测试集的目标值
y_train_pred = regressor.predict(X_train_poly)
y_test_pred = regressor.predict(X_test_poly)

# 计算R²分数和RMSE
print('训练集R²分数:', r2_score(y_train, y_train_pred))
print('测试集R²分数:', r2_score(y_test, y_test_pred))
print('训练集RMSE:', np.sqrt(mean_squared_error(y_train, y_train_pred)))
print('测试集RMSE:', np.sqrt(mean_squared_error(y_test, y_test_pred)))

输出结果为:

训练集R²分数: 0.3091977067188652
测试集R²分数: 0.2109275342602126
训练集RMSE: 58.70984759906008
测试集RMSE: 61.450926245424966

可以看出,训练集和测试集的R²分数较低,表示模型对数据的拟合程度不是很好。训练集和测试集的RMSE值也比较大,说明预测误差较大。

示例二:自定义生成二次数据集

下面我们将使用自定义的数据集来演示如何使用二次回归分析。我们将使用 make_regression() 函数生成一个具有非线性特征的二次数据集:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error

# 生成二次数据
X = np.linspace(-10, 10, 100).reshape(-1, 1)
y = X**2 + 3*X + 2 + np.random.randn(100, 1)*10

# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 转换为二次多项式特征
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# 进行线性回归分析
regressor = LinearRegression()
regressor.fit(X_train_poly, y_train)

# 预测训练集和测试集的目标值
y_train_pred = regressor.predict(X_train_poly)
y_test_pred = regressor.predict(X_test_poly)

# 计算R²分数和RMSE
print('训练集R²分数:', r2_score(y_train, y_train_pred))
print('测试集R²分数:', r2_score(y_test, y_test_pred))
print('训练集RMSE:', np.sqrt(mean_squared_error(y_train, y_train_pred)))
print('测试集RMSE:', np.sqrt(mean_squared_error(y_test, y_test_pred)))

输出结果为:

训练集R²分数: 0.8527164506346707
测试集R²分数: 0.7796613671832053
训练集RMSE: 33.45902796377425
测试集RMSE: 34.29014105652765

可以看出,训练集和测试集的R²分数较高,表示模型对数据的拟合程度较好。训练集和测试集的RMSE值也比较小,说明预测误差较小。