鍵.png)
如何高效爬取全球新聞網(wǎng)站 – 整合Scrapy、Selenium與Mediastack API實(shí)現(xiàn)自動(dòng)化新聞采集
XGBoost 是一個(gè)基于梯度提升樹(Gradient Boosting Decision Tree,GBDT)的模型。它通過集成多棵弱學(xué)習(xí)器(通常是決策樹)來提高整體預(yù)測能力。具體來說,XGBoost在訓(xùn)練過程中通過每一步的預(yù)測誤差來修正前一輪的誤差,并逐步逼近真實(shí)的值。
梯度提升的基本思想是:通過將多個(gè)弱學(xué)習(xí)器(如淺決策樹)逐步組合起來形成一個(gè)強(qiáng)大的預(yù)測模型。在每一步的訓(xùn)練過程中,梯度提升算法會(huì)嘗試去最小化當(dāng)前模型的損失函數(shù),即通過擬合上一輪的殘差來調(diào)整模型的參數(shù),從而達(dá)到提升模型預(yù)測精度的目的。
在XGBoost中,損失函數(shù)由兩部分組成:訓(xùn)練誤差和正則化項(xiàng)。
損失函數(shù)的形式為:
其中:
我們將使用Kaggle中的stock_prices.csv
數(shù)據(jù)集。該數(shù)據(jù)集包含了不同公司的股票價(jià)格信息,字段包括:
Date
: 日期Open
: 開盤價(jià)High
: 最高價(jià)Low
: 最低價(jià)Close
: 收盤價(jià)Adj Close
: 調(diào)整收盤價(jià)Volume
: 成交量我們將使用這些數(shù)據(jù)來訓(xùn)練XGBoost模型,以預(yù)測未來幾天的收盤價(jià)。
在開始建模之前,我們需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。步驟包括:
import pandas as pd
import numpy as np
# 讀取數(shù)據(jù)
df = pd.read_csv('stock_prices.csv')
# 將日期轉(zhuǎn)換為datetime類型,并設(shè)置為索引
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
# 查看缺失值
print(df.isnull().sum())
# 刪除含有缺失值的行
df.dropna(inplace=True)
我們可以從原始數(shù)據(jù)中構(gòu)造更多有意義的特征,比如價(jià)格變化、移動(dòng)平均線、波動(dòng)率等。
# 創(chuàng)建一些技術(shù)指標(biāo)
df['Price Change'] = df['Close'] - df['Open']
df['SMA_5'] = df['Close'].rolling(window=5).mean() # 5日簡單移動(dòng)平均線
df['SMA_20'] = df['Close'].rolling(window=20).mean() # 20日簡單移動(dòng)平均線
df['Volatility'] = (df['High'] - df['Low']) / df['Low'] # 波動(dòng)率
# 刪除前20天無效數(shù)據(jù)
df = df.dropna()
# 特征和目標(biāo)
X = df[['Open', 'High', 'Low', 'Volume', 'Price Change', 'SMA_5', 'SMA_20', 'Volatility']]
y = df['Close']
為了避免模型的過擬合,我們將數(shù)據(jù)劃分為訓(xùn)練集和測試集。
from sklearn.model_selection import train_test_split
# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
import xgboost as xgb
from sklearn.metrics import mean_squared_error
# 構(gòu)建DMatrix
train_dmatrix = xgb.DMatrix(X_train, label=y_train)
test_dmatrix = xgb.DMatrix(X_test, label=y_test)
# 設(shè)置參數(shù)
params = {
'objective': 'reg:squarederror', # 預(yù)測目標(biāo)是回歸
'max_depth': 5,
'learning_rate': 0.1,
'n_estimators': 100
}
# 訓(xùn)練模型
xg_reg = xgb.train(params, train_dmatrix, num_boost_round=100)
# 測試模型
preds = xg_reg.predict(test_dmatrix)
# 計(jì)算均方誤差
mse = mean_squared_error(y_test, preds)
print(f"Mean Squared Error: {mse}")
為了更好地理解模型的表現(xiàn)和股票數(shù)據(jù)的特征,我們可以使用Matplotlib和Seaborn繪制相關(guān)圖形。
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['Close'], label='Close Price')
plt.title('Stock Closing Price Over Time')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
這張圖顯示了股票的收盤價(jià)隨時(shí)間的變化,幫助我們直觀了解價(jià)格的波動(dòng)情況。
plt.figure(figsize=(10, 6))
plt.plot(y_test.index, y_test, label='Actual Price')
plt.plot(y_test.index, preds, label='Predicted Price')
plt.title('Actual vs Predicted Closing Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
這張圖展示了模型的預(yù)測結(jié)果與真實(shí)值之間的差異,幫助評(píng)估模型的預(yù)測能力。
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['Close'], label='Close Price')
plt.plot(df.index, df['SMA_5'], label='5-Day SMA')
plt.plot(df.index, df['SMA_20'], label='20-Day SMA')
plt.title('Stock Price with Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
移動(dòng)平均線是常見的技術(shù)分析工具,這張圖展示了股票價(jià)格與短期(5日)和長期(20日)移動(dòng)平均線的對(duì)比。
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['Volatility'], label='Volatility')
plt.title('Stock Price Volatility Over Time')
plt.xlabel('Date')
plt.ylabel('Volatility')
plt.legend()
plt.show()
這張圖顯示了股票的波動(dòng)率隨時(shí)間的變化,有助于理解價(jià)格劇烈變動(dòng)的時(shí)期。
為了提升模型的預(yù)測能力,我們可以通過調(diào)參來優(yōu)化XGBoost模型。調(diào)參過程主要包括以下幾個(gè)步驟:
我們可以通過網(wǎng)格搜索來尋找最優(yōu)的參數(shù)組合。需要調(diào)整的參數(shù)包括:
max_depth
: 控制樹的最大深度,較大的深度能夠捕捉到更多的特征信息,但也容易導(dǎo)致過擬合。learning_rate
: 學(xué)習(xí)率,控制每一步更新的步長,較小的學(xué)習(xí)率可以使模型收斂更穩(wěn)定,但訓(xùn)練時(shí)間更長。n_estimators
: 決策樹的數(shù)量,更多的樹可以提升模型的預(yù)測能力,但也會(huì)增加計(jì)算成本。from sklearn.model_selection import GridSearchCV
# 參數(shù)范圍
param_grid = {
'max_depth': [3, 5, 7],
'learning_rate': [0.01, 0.1, 0.2],
'n_estimators': [100, 200, 300]
}
# 網(wǎng)格搜索
xgb_model = xgb.XGBRegressor(objective='reg:squarederror')
grid_search = GridSearchCV(estimator=xgb_model, param_grid=param_grid, cv=3, scoring='neg_mean_squared_error', verbose=1)
grid_search.fit(X_train, y_train)
# 輸出最佳參數(shù)
print("Best Parameters:", grid_search.best_params_)
XGBoost中提供了L1和L2正則化,可以有效防止模型過擬合。通過增加正則化項(xiàng)的權(quán)重,模型能夠更好地應(yīng)對(duì)噪聲數(shù)據(jù)。
params = {
'objective': 'reg:squarederror',
'max_depth': 5,
'learning_rate': 0.1,
'n_estimators': 100,
'alpha': 0.1, # L1正則化項(xiàng)權(quán)重
'lambda': 0.1 # L2正則化項(xiàng)權(quán)重
}
全文通過XGBoost模型對(duì)股票市場的趨勢進(jìn)行了預(yù)測,詳細(xì)介紹了從數(shù)據(jù)預(yù)處理、特征工程、模型訓(xùn)練到調(diào)參優(yōu)化的整個(gè)過程。
最后通過繪制股票價(jià)格變化趨勢、真實(shí)值與預(yù)測值對(duì)比、移動(dòng)平均線和波動(dòng)率分析的圖形,我們能夠直觀地理解股票市場的變化規(guī)律。調(diào)參和正則化進(jìn)一步提升了模型的性能。
文章轉(zhuǎn)自微信公眾號(hào)@深夜努力寫Python
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)