在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值也比较小,说明预测误差较小。