用于多项式回归的 GridsearchCV
GridsearchCV for Polynomial Regression
我是机器学习的新手,一直坚持这一点。
当我尝试在线性模型中实现多项式回归时,例如使用多个多项式范围 (1,10) 并获得不同的 MSE。我实际上使用 GridsearchCV
方法来找到多项式的最佳参数。
from sklearn.model_selection import GridSearchCV
poly_grid = GridSearchCV(PolynomialRegression(), param_grid, cv=10, scoring='neg_mean_squared_error')
我不知道如何获得上述 PolynomialRegression()
估算器。我搜索的一种解决方案是:
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline
def PolynomialRegression(degree=2, **kwargs):
return make_pipeline(PolynomialFeatures(degree), LinearRegression(**kwargs))
param_grid = {'polynomialfeatures__degree': np.arange(10), 'linearregression__fit_intercept': [True, False], 'linearregression__normalize': [True, False]}
poly_grid = GridSearchCV(PolynomialRegression(), param_grid, cv=10, scoring='neg_mean_squared_error')
但它甚至没有生成任何结果。
poly_grid = GridSearchCV...
只会声明和实例化网格搜索对象。您需要使用 fit() 方法提供一些数据以进行任何训练或超参数搜索。
像这样:
poly_grid.fit(X, y)
其中 X 和 y 是您的训练数据和标签。
fit(X, y=None, groups=None, **fit_params)[source]
Run fit with all sets of parameters.
然后用cv_results_
and/orbest_params_
分析结果
请看下面给出的例子:
- http://scikit-learn.org/stable/auto_examples/exercises/plot_cv_diabetes.html
- http://scikit-learn.org/stable/auto_examples/model_selection/plot_randomized_search.html
- http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
回复评论:
@BillyChow 你打不打poly_grid.fit()
?如果没有,那么显然它不会产生任何结果。
如果是,那么根据您的数据,这将花费很多时间,因为您在具有 10 倍 cv 的参数中指定了从 1 到 10 的度数。因此,随着度数的增加,拟合和交叉验证的时间会迅速增加。
不过,如果您想查看工作情况,可以将 verbose
参数添加到 gridSearchCV,如下所示:
poly_grid = GridSearchCV(PolynomialRegression(), param_grid,
cv=10,
scoring='neg_mean_squared_error',
verbose=3)
然后调用poly_grid.fit(X, y)
导入 pandas 作为 numpy:
import numpy as np
import pandas as pd
创建示例数据集:
df = pd.DataFrame(data={'X': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'Y': [1, 4, 9, 16, 25, 36, 49, 64, 81, 100],
'Label': [1, 3, 10, 17, 23, 45, 50, 55, 90, 114]})
X_train = df[['X', 'Y']]
y_train = df['Label']
在多项式回归中,您正在更改 数据集 特征的次数,也就是说,您实际上并没有更改超参数。因此,我认为使用 for 循环模拟 GridSearchCV 比使用 GridSearchCV 更好。在下面的代码中,列表 degrees 是将要测试的度数。
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import cross_val_score
degrees = [2, 3, 4, 5, 6] # Change degree "hyperparameter" here
normalizes = [True, False] # Change normalize hyperparameter here
best_score = 0
best_degree = 0
for degree in degrees:
for normalize in normalizes:
poly_features = PolynomialFeatures(degree = degree)
X_train_poly = poly_features.fit_transform(X_train)
polynomial_regressor = LinearRegression(normalize=normalize)
polynomial_regressor.fit(X_train_poly, y_train)
scores = cross_val_score(polynomial_regressor, X_train_poly, y_train, cv=5) # Change k-fold cv value here
if max(scores) > best_score:
best_score = max(scores)
best_degree = degree
best_normalize = normalize
打印最好成绩:
print(best_score)
0.9031682820376132
打印最佳超参数:
print(best_normalize)
print(best_degree)
False
2
使用最佳超参数创建最佳多项式回归:
poly_features = PolynomialFeatures(degree = best_degree)
X_train_poly = poly_features.fit_transform(X_train)
best_polynomial_regressor = LinearRegression(normalize=best_normalize)
polynomial_regressor.fit(X_train_poly, y_train)
我是机器学习的新手,一直坚持这一点。
当我尝试在线性模型中实现多项式回归时,例如使用多个多项式范围 (1,10) 并获得不同的 MSE。我实际上使用 GridsearchCV
方法来找到多项式的最佳参数。
from sklearn.model_selection import GridSearchCV
poly_grid = GridSearchCV(PolynomialRegression(), param_grid, cv=10, scoring='neg_mean_squared_error')
我不知道如何获得上述 PolynomialRegression()
估算器。我搜索的一种解决方案是:
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline
def PolynomialRegression(degree=2, **kwargs):
return make_pipeline(PolynomialFeatures(degree), LinearRegression(**kwargs))
param_grid = {'polynomialfeatures__degree': np.arange(10), 'linearregression__fit_intercept': [True, False], 'linearregression__normalize': [True, False]}
poly_grid = GridSearchCV(PolynomialRegression(), param_grid, cv=10, scoring='neg_mean_squared_error')
但它甚至没有生成任何结果。
poly_grid = GridSearchCV...
只会声明和实例化网格搜索对象。您需要使用 fit() 方法提供一些数据以进行任何训练或超参数搜索。
像这样:
poly_grid.fit(X, y)
其中 X 和 y 是您的训练数据和标签。
fit(X, y=None, groups=None, **fit_params)[source]
Run fit with all sets of parameters.
然后用cv_results_
and/orbest_params_
分析结果
请看下面给出的例子:
- http://scikit-learn.org/stable/auto_examples/exercises/plot_cv_diabetes.html
- http://scikit-learn.org/stable/auto_examples/model_selection/plot_randomized_search.html
- http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
回复评论:
@BillyChow 你打不打poly_grid.fit()
?如果没有,那么显然它不会产生任何结果。
如果是,那么根据您的数据,这将花费很多时间,因为您在具有 10 倍 cv 的参数中指定了从 1 到 10 的度数。因此,随着度数的增加,拟合和交叉验证的时间会迅速增加。
不过,如果您想查看工作情况,可以将 verbose
参数添加到 gridSearchCV,如下所示:
poly_grid = GridSearchCV(PolynomialRegression(), param_grid,
cv=10,
scoring='neg_mean_squared_error',
verbose=3)
然后调用poly_grid.fit(X, y)
导入 pandas 作为 numpy:
import numpy as np
import pandas as pd
创建示例数据集:
df = pd.DataFrame(data={'X': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'Y': [1, 4, 9, 16, 25, 36, 49, 64, 81, 100],
'Label': [1, 3, 10, 17, 23, 45, 50, 55, 90, 114]})
X_train = df[['X', 'Y']]
y_train = df['Label']
在多项式回归中,您正在更改 数据集 特征的次数,也就是说,您实际上并没有更改超参数。因此,我认为使用 for 循环模拟 GridSearchCV 比使用 GridSearchCV 更好。在下面的代码中,列表 degrees 是将要测试的度数。
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import cross_val_score
degrees = [2, 3, 4, 5, 6] # Change degree "hyperparameter" here
normalizes = [True, False] # Change normalize hyperparameter here
best_score = 0
best_degree = 0
for degree in degrees:
for normalize in normalizes:
poly_features = PolynomialFeatures(degree = degree)
X_train_poly = poly_features.fit_transform(X_train)
polynomial_regressor = LinearRegression(normalize=normalize)
polynomial_regressor.fit(X_train_poly, y_train)
scores = cross_val_score(polynomial_regressor, X_train_poly, y_train, cv=5) # Change k-fold cv value here
if max(scores) > best_score:
best_score = max(scores)
best_degree = degree
best_normalize = normalize
打印最好成绩:
print(best_score)
0.9031682820376132
打印最佳超参数:
print(best_normalize)
print(best_degree)
False
2
使用最佳超参数创建最佳多项式回归:
poly_features = PolynomialFeatures(degree = best_degree)
X_train_poly = poly_features.fit_transform(X_train)
best_polynomial_regressor = LinearRegression(normalize=best_normalize)
polynomial_regressor.fit(X_train_poly, y_train)