我正在尝试建立一个梯度增强回归器来预测港口船舶的排放。我的成绩很糟糕。我的参数是:船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、燃油、燃油、发动机、船速、动力、lf_me_巡航、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型、船型Caldera_Hotelling Subtotal_NoCald Total
其中Total为总排放量。
`# Separate features and target variable
X = df[['Motor_Ship','Type_of_Load','Year_of_Construct','Max_Speed','Avg_Speed','Gross_tonnage','Dead_Weight','EM_Fuel','AE_Fuel','Engine_Speed','A_ME']]
y = df['Total']
# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train Gradient Boosting model
gb_model = GradientBoostingRegressor(loss='squared_error', learning_rate=0.1, n_estimators=100, max_depth=3, random_state=42)
gb_model.fit(X_train, y_train)
# Evaluate model on test set
y_pred = gb_model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error on test set: ", mse)`
我还编码了没有数值的列,并向缺失值的列添加了平均值。我得到的均方误差即使在优化后也没有改善。谁能告诉我该怎么做才能得到更好的结果?
`model = GradientBoostingRegressor()
# define hyperparameters for optimization
param_grid = {
'n_estimators': [100, 500, 1000],
'learning_rate': [0.1, 0.05, 0.01],
'max_depth': [3, 5, 7],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4],
'max_features': [None, 'sqrt']
}
# create GridSearchCV object to optimize hyperparameters
grid_search = GridSearchCV(
estimator=model,
param_grid=param_grid,
cv=5,
scoring='neg_mean_squared_error',
n_jobs=-1
)
# fit GridSearchCV object to training data
grid_search.fit(X_train, y_train)
# predict on test data with optimized model
y_pred = grid_search.predict(X_test)
# calculate mean squared error of predictions
mse = mean_squared_error(y_test, y_pred)
print("Mean squared error: ", mse)`
我认为这个问题是梯度爆炸,这意味着更多的层,更大的权重值或梯度消失,这意味着更多的层,更小的权重值。(这取决于你的数据,当你没有标准化。)
有两种可能的解决方案。
首先,您可以添加规范化。这可以防止您的数据显著增加到您不希望看到的范围。
这是min-max scalar normalization
。这是一个参考,这是一个官方文档从sklearn。
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler().fit(X_test)
X_norm = min_max_scaler.transform(X)
第二,减少max_depth
的数量。但是,它可能仅限于您的模型的性能。因此,最好选择第一个选项。