Skip to main content
 首页 » 编程设计

python之如何找到多项式的最佳次数

2025年05月04日12webabcd

我是机器学习的新手,目前遇到了这个问题。 首先,我使用线性回归来拟合训练集,但得到非常大的 RMSE。然后我尝试使用多项式回归来减少偏差。

import numpy as np 
from sklearn.linear_model import LinearRegression 
from sklearn.preprocessing import PolynomialFeatures 
from sklearn.metrics import mean_squared_error 
 
poly_features = PolynomialFeatures(degree=2, include_bias=False) 
X_poly = poly_features.fit_transform(X) 
poly_reg = LinearRegression() 
poly_reg.fit(X_poly, y) 
 
poly_predict = poly_reg.predict(X_poly) 
poly_mse = mean_squared_error(X, poly_predict) 
poly_rmse = np.sqrt(poly_mse) 
poly_rmse 

然后我得到了比线性回归稍微好一点的结果,然后我继续设置degree = 3/4/5,结果一直在变好。但随着度数的增加,它可能会有些过度拟合。

多项式的最佳次数应该是在交叉验证集中生成最低 RMSE 的次数。但我不知道如何实现这一目标。我应该使用 GridSearchCV 吗?还是其他方法?

如果你能帮我解决这个问题,我将不胜感激。

请您参考如下方法:

下次你应该提供X/Y的数据,或者一些虚拟的,它会更快并为你提供特定的解决方案。现在,我创建了一个形式为 y = X**4 + X**3 + X + 1 的虚拟方程。

您可以通过多种方式对此进行改进,但快速迭代以找到最佳学位的方法是简单地将您的数据拟合到每个学位并选择具有最佳性能(例如,最低 RMSE)的学位。

您还可以尝试如何决定保留训练/测试/验证数据。

import numpy as np 
import matplotlib.pyplot as plt  
 
from sklearn.linear_model import LinearRegression 
from sklearn.preprocessing import PolynomialFeatures 
from sklearn.metrics import mean_squared_error 
from sklearn.model_selection import train_test_split 
 
X = np.arange(100).reshape(100, 1) 
y = X**4 + X**3 + X + 1 
 
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3) 
 
rmses = [] 
degrees = np.arange(1, 10) 
min_rmse, min_deg = 1e10, 0 
 
for deg in degrees: 
 
    # Train features 
    poly_features = PolynomialFeatures(degree=deg, include_bias=False) 
    x_poly_train = poly_features.fit_transform(x_train) 
 
    # Linear regression 
    poly_reg = LinearRegression() 
    poly_reg.fit(x_poly_train, y_train) 
 
    # Compare with test data 
    x_poly_test = poly_features.fit_transform(x_test) 
    poly_predict = poly_reg.predict(x_poly_test) 
    poly_mse = mean_squared_error(y_test, poly_predict) 
    poly_rmse = np.sqrt(poly_mse) 
    rmses.append(poly_rmse) 
     
    # Cross-validation of degree 
    if min_rmse > poly_rmse: 
        min_rmse = poly_rmse 
        min_deg = deg 
 
# Plot and present results 
print('Best degree {} with RMSE {}'.format(min_deg, min_rmse)) 
         
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(degrees, rmses) 
ax.set_yscale('log') 
ax.set_xlabel('Degree') 
ax.set_ylabel('RMSE') 

这将打印:

Best degree 4 with RMSE 1.27689038706e-08

或者,您也可以构建一个执行多项式拟合的新类,并将其传递给带有一组参数的 GridSearchCV。