
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
優點:
缺點:
LightGBM 是一種高效的梯度提升框架,專注于快速訓練和低內存使用。它采用了基于直方圖的決策樹學習算法,顯著提高了效率。
LightGBM 的核心與 GBDT 相同,但在優化方面進行了改進。它引入了基于直方圖的算法,將連續值離散化,從而加快了訓練速度并降低了內存消耗。
優點:
缺點:
XGBoost 是一種高效的梯度提升框架,優化了傳統的 GBDT,并引入了正則化項以防止過擬合。
優點:
缺點:
AdaBoost(Adaptive Boosting)通過結合多個弱分類器來提高分類性能。每個分類器的權重由其錯誤率決定,后續分類器更關注前面分類器錯誤分類的樣本。
優點:
缺點:
這里,咱們是一個使用 GBDT、LightGBM、XGBoost 和 AdaBoost 的完整示例。
整個這個示例將涵蓋以下內容:
我們將使用以下包:
scikit-learn
:用于 GBDT 和 AdaBoost。lightgbm
:用于 LightGBM。xgboost
:用于 XGBoost。matplotlib
和 seaborn
:用于數據可視化。我們將生成一個合成的回歸數據集,以便比較不同模型的性能。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import lightgbm as lgb
import xgboost as xgb
from sklearn.ensemble import GradientBoostingRegressor, AdaBoostRegressor
from sklearn.tree import DecisionTreeRegressor
# 生成合成數據
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 轉換為 DataFrame 以便繪圖
df_train = pd.DataFrame(X_train, columns=[f"feature_{i}" for i in range(X_train.shape[1])])
df_train['target'] = y_train
df_test = pd.DataFrame(X_test, columns=[f"feature_{i}" for i in range(X_test.shape[1])])
df_test['target'] = y_test
# 1. Gradient Boosting Decision Tree (GBDT)
gbdt_model = GradientBoostingRegressor(n_estimators=100, random_state=42)
gbdt_model.fit(X_train, y_train)
y_pred_gbdt = gbdt_model.predict(X_test)
# 2. LightGBM
lgb_model = lgb.LGBMRegressor(n_estimators=100, random_state=42)
lgb_model.fit(X_train, y_train)
y_pred_lgb = lgb_model.predict(X_test)
# 3. XGBoost
xgb_model = xgb.XGBRegressor(n_estimators=100, random_state=42)
xgb_model.fit(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)
# 4. AdaBoost
ada_model = AdaBoostRegressor(base_estimator=DecisionTreeRegressor(max_depth=3), n_estimators=100, random_state=42)
ada_model.fit(X_train, y_train)
y_pred_ada = ada_model.predict(X_test)
def evaluate_model(y_true, y_pred, model_name):
mse = mean_squared_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f"{model_name} - MSE: {mse:.4f}, R2: {r2:.4f}")
print("Performance Comparison:")
evaluate_model(y_test, y_pred_gbdt, "GBDT")
evaluate_model(y_test, y_pred_lgb, "LightGBM")
evaluate_model(y_test, y_pred_xgb, "XGBoost")
evaluate_model(y_test, y_pred_ada, "AdaBoost")
我們將繪制模型的預測結果與實際值的對比圖,并繪制預測值的分布圖。
plt.style.use('ggplot') # 使用有效的樣式
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
axes = axes.flatten()
def plot_predictions(ax, y_true, y_pred, model_name):
sns.scatterplot(x=y_true, y=y_pred, ax=ax)
ax.plot([min(y_true), max(y_true)], [min(y_true), max(y_true)], 'k--', label='Perfect Prediction')
ax.set_title(f'{model_name} Predictions vs Actual')
ax.set_xlabel('Actual Values')
ax.set_ylabel('Predicted Values')
ax.legend()
# 預測與實際值對比
plot_predictions(axes[0], y_test, y_pred_gbdt, 'GBDT')
plot_predictions(axes[1], y_test, y_pred_lgb, 'LightGBM')
plot_predictions(axes[2], y_test, y_pred_xgb, 'XGBoost')
plot_predictions(axes[3], y_test, y_pred_ada, 'AdaBoost')
plt.tight_layout()
plt.show()
# 預測值分布圖
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
axes = axes.flatten()
def plot_prediction_distribution(ax, y_pred, model_name):
sns.histplot(y_pred, ax=ax, kde=True, bins=30)
ax.set_title(f'{model_name} Predicted Values Distribution')
ax.set_xlabel('Predicted Values')
ax.set_ylabel('Frequency')
# 繪制預測值的分布
plot_prediction_distribution(axes[0], y_pred_gbdt, 'GBDT')
plot_prediction_distribution(axes[1], y_pred_lgb, 'LightGBM')
plot_prediction_distribution(axes[2], y_pred_xgb, 'XGBoost')
plot_prediction_distribution(axes[3], y_pred_ada, 'AdaBoost')
plt.tight_layout()
plt.show()
可視化部分:
預測與實際值對比:
預測值分布圖:
針對 GBDT、LightGBM、XGBoost 和 AdaBoost 的調參細節以及每種方法的建議參數范圍和優化技巧。
GBDT 通常使用 sklearn
的 GradientBoostingRegressor
來實現。主要調參項包括:
n_estimators
: 樹的數量。增加數量可以提高模型的性能,但會增加計算時間和可能導致過擬合。推薦范圍:100
到 1000
。learning_rate
: 學習率??刂泼靠脴鋵ψ罱K預測的貢獻。較小的學習率可以提高模型的性能,但需要更多的樹。推薦范圍:0.01
到 0.2
。max_depth
: 每棵樹的最大深度。限制樹的深度可以防止過擬合。推薦范圍:3
到 10
。min_samples_split
: 每個內部節點的最小樣本數,用于進行分裂。增加此值可以防止過擬合。推薦范圍:2
到 20
。min_samples_leaf
: 每個葉子節點的最小樣本數。增加此值也可以防止過擬合。推薦范圍:1
到 20
。subsample
: 每棵樹訓練時使用的樣本比例。推薦范圍:0.5
到 1.0
。調參技巧:
GridSearchCV
)或隨機搜索(RandomizedSearchCV
)來尋找最佳超參數。n_estimators
的值,調整 learning_rate
和 max_depth
,然后調整其他參數。LightGBM 是一個高效的梯度提升框架,適用于大規模數據。主要調參項包括:
num_leaves
: 每棵樹的葉子數量。更多的葉子可能導致過擬合。推薦范圍:20
到 300
。learning_rate
: 學習率。較小的學習率與更多的樹結合使用。推薦范圍:0.01
到 0.2
。n_estimators
: 樹的數量。推薦范圍:100
到 1000
。max_depth
: 樹的最大深度。推薦范圍:-1
(無限制)到 20
。min_child_samples
: 每個葉子上的最小樣本數。推薦范圍:10
到 100
。subsample
: 訓練樣本的比例。推薦范圍:0.5
到 1.0
。colsample_bytree
: 每棵樹的特征比例。推薦范圍:0.5
到 1.0
。調參技巧:
lgb.cv
)來選擇最佳超參數。optuna
等庫來進行超參數優化。XGBoost 是另一種流行的梯度提升框架。主要調參項包括:
n_estimators
: 樹的數量。推薦范圍:100
到 1000
。learning_rate
: 學習率。推薦范圍:0.01
到 0.2
。max_depth
: 樹的最大深度。推薦范圍:3
到 10
。min_child_weight
: 每個葉子節點的最小樣本權重。推薦范圍:1
到 10
。subsample
: 訓練樣本的比例。推薦范圍:0.5
到 1.0
。colsample_bytree
: 每棵樹的特征比例。推薦范圍:0.5
到 1.0
。gamma
: 節點分裂所需的最小損失函數下降值。推薦范圍:0
到 5
。調參技巧:
xgb.cv
)來選擇最佳超參數。GridSearchCV
或 RandomizedSearchCV
來找到最佳參數組合。AdaBoost 是一種提升方法,通過調整每個樣本的權重來提高模型性能。主要調參項包括:
n_estimators
: 基學習器的數量。推薦范圍:50
到 500
。learning_rate
: 學習率??刂泼總€基學習器的貢獻。推薦范圍:0.01
到 1.0
。base_estimator
: 基學習器。常用的基學習器是 DecisionTreeRegressor
,可以設置其參數,如 max_depth
。調參技巧:
DecisionTreeRegressor
的 max_depth
)會影響模型性能,適當調整。假設我們使用網格搜索來調整 GBDT 的超參數:
from sklearn.model_selection import GridSearchCV
# 定義參數網格
param_grid = {
'n_estimators': [100, 200, 300],
'learning_rate': [0.01, 0.1, 0.2],
'max_depth': [3, 5, 7],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 5]
}
# 創建模型
gbdt = GradientBoostingRegressor()
# 使用網格搜索進行調參
grid_search = GridSearchCV(estimator=gbdt, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
# 輸出最佳參數
print("Best parameters found: ", grid_search.best_params_)
大家可以對 LightGBM 和 XGBoost 進行類似的調參,只需使用相應的模型和參數網格。
調參是一個迭代的過程,通常需要多次實驗才能找到最佳參數組合。希望這些細節和技巧能幫助大家在自己實際的實驗中,可以得到一些啟發!~