機(jī)器學(xué)習(xí)預(yù)測(cè)數(shù)字游戲入門(mén):決策樹(shù)與隨機(jī)森林實(shí)戰(zhàn)指南
用機(jī)器學(xué)習(xí)預(yù)測(cè)數(shù)字游戲?新手入門(mén)指南
問(wèn)題
想用AI分析數(shù)據(jù)、做預(yù)測(cè),但面對(duì)一堆算法和術(shù)語(yǔ)不知從何開(kāi)始?很多復(fù)雜問(wèn)題都能從簡(jiǎn)單的數(shù)字預(yù)測(cè)場(chǎng)景練手。比如,分析歷史數(shù)據(jù)中的模式,預(yù)測(cè)下一組數(shù)字的出現(xiàn)概率——這和預(yù)測(cè)天氣、股票走勢(shì)背后的邏輯是相通的。
方案
對(duì)入門(mén)者來(lái)說(shuō),決策樹(shù)和隨機(jī)森林是理想的起點(diǎn)。它們像“智能問(wèn)答游戲”:通過(guò)一系列問(wèn)題(特征)將數(shù)據(jù)分類(lèi),最終做出預(yù)測(cè)。隨機(jī)森林就是多棵樹(shù)一起投票,結(jié)果更穩(wěn)定。這類(lèi)模型對(duì)數(shù)據(jù)要求不高,結(jié)果也容易解釋?zhuān)m合理解AI預(yù)測(cè)的基本流程。
步驟:從數(shù)據(jù)到預(yù)測(cè)
以分析公開(kāi)的數(shù)字序列數(shù)據(jù)為例(任何時(shí)序數(shù)據(jù)都可類(lèi)比)。
1. 數(shù)據(jù)準(zhǔn)備與理解
假設(shè)你有一組歷史數(shù)字?jǐn)?shù)據(jù),存儲(chǔ)在 data.csv 中,包含日期、數(shù)字等信息。
import pandas as pd
# 加載數(shù)據(jù)
data = pd.read_csv('data.csv')
print(data.head()) # 查看前幾行
print(data.describe()) # 查看統(tǒng)計(jì)摘要為什么:數(shù)據(jù)是模型的“糧食”。先看清數(shù)據(jù)長(zhǎng)什么樣、有沒(méi)有缺失值,避免“垃圾進(jìn),垃圾出”。
2. 特征工程:把數(shù)據(jù)變成模型能懂的語(yǔ)言
原始數(shù)據(jù)往往不能直接用。我們需要提取特征,比如“過(guò)去5期的平均值”、“數(shù)字是否在特定區(qū)間”。
# 創(chuàng)建新特征:過(guò)去3期的移動(dòng)平均
data['rolling_mean_3'] = data['number'].rolling(window=3).mean().shift(1)
# 創(chuàng)建特征:數(shù)字是否大于中位數(shù)
data['above_median'] = (data['number'] > data['number'].median()).astype(int)
# 刪除包含NaN的行(由rolling操作產(chǎn)生)
data = data.dropna()為什么:特征工程是預(yù)測(cè)成敗的關(guān)鍵。好的特征能顯著提升模型效果,這比盲目調(diào)參更重要。
3. 劃分?jǐn)?shù)據(jù)集
把數(shù)據(jù)分成訓(xùn)練集(讓模型學(xué)習(xí))和測(cè)試集(檢驗(yàn)?zāi)P托Ч?/p>
from sklearn.model_selection import train_test_split
# 假設(shè)我們要預(yù)測(cè) 'number',特征用我們創(chuàng)建的列
X = data[['rolling_mean_3', 'above_median']]
y = data['number']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)為什么:必須用模型沒(méi)見(jiàn)過(guò)的數(shù)據(jù)來(lái)測(cè)試,否則就像用考試原題復(fù)習(xí),分?jǐn)?shù)再高也沒(méi)用。
4. 訓(xùn)練模型:從決策樹(shù)到隨機(jī)森林
先試簡(jiǎn)單的決策樹(shù),再用隨機(jī)森林提升效果。

from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
# 決策樹(shù)
tree_model = DecisionTreeRegressor(random_state=42)
tree_model.fit(X_train, y_train)
tree_pred = tree_model.predict(X_test)
print(f"決策樹(shù) 平均絕對(duì)誤差: {mean_absolute_error(y_test, tree_pred):.2f}")
# 隨機(jī)森林(通常更準(zhǔn))
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)
print(f"隨機(jī)森林 平均絕對(duì)誤差: {mean_absolute_error(y_test, rf_pred):.2f}")為什么:決策樹(shù)簡(jiǎn)單快速,適合理解原理;隨機(jī)森林集成多棵樹(shù),抗過(guò)擬合能力更強(qiáng),預(yù)測(cè)通常更穩(wěn)定。
驗(yàn)證:模型真的有用嗎?
誤差數(shù)字越低越好,但還要看實(shí)際效果。我們可以可視化對(duì)比預(yù)測(cè)值和真實(shí)值。
import matplotlib.pyplot as plt
# 對(duì)比最后20個(gè)測(cè)試樣本
plt.figure(figsize=(10, 5))
plt.plot(y_test.values[-20:], label='真實(shí)值', marker='o')
plt.plot(rf_pred[-20:], label='隨機(jī)森林預(yù)測(cè)', marker='x')
plt.title('真實(shí)值 vs 預(yù)測(cè)值(最后20個(gè)樣本)')
plt.legend()
plt.show()如果預(yù)測(cè)曲線能大致跟上真實(shí)值的趨勢(shì),說(shuō)明模型學(xué)到了一些規(guī)律。
常見(jiàn)問(wèn)題
誤差很大怎么辦?
- 檢查特征:這是首要任務(wù)。嘗試創(chuàng)造更多特征,比如“數(shù)字的奇偶性”、“是否是周末”等。
- 增加數(shù)據(jù)量:數(shù)據(jù)太少,模型學(xué)不到規(guī)律。
- 嘗試更復(fù)雜的模型:如梯度提升樹(shù)(XGBoost, LightGBM)。
模型在新數(shù)據(jù)上效果變差?
- 這可能是過(guò)擬合。嘗試簡(jiǎn)化模型(如限制決策樹(shù)深度)、增加數(shù)據(jù),或使用正則化。
如何應(yīng)用到其他領(lǐng)域?
- 框架完全通用。把“數(shù)字”換成“股價(jià)”、“銷(xiāo)售額”、“氣溫”,把特征換成對(duì)應(yīng)領(lǐng)域的指標(biāo)(如歷史價(jià)格、促銷(xiāo)活動(dòng)、季節(jié)),同樣的代碼就能用于金融、銷(xiāo)售或氣象預(yù)測(cè)。
下一步學(xué)習(xí)建議
這個(gè)例子幫你走通了“數(shù)據(jù)→特征→模型→評(píng)估”的全流程。接下來(lái)可以:
- 深入特征工程:學(xué)習(xí)時(shí)間序列特征(滯后特征、滑動(dòng)窗口統(tǒng)計(jì))。
- 探索其他模型:嘗試用
XGBoost庫(kù),它在各類(lèi)預(yù)測(cè)競(jìng)賽中表現(xiàn)優(yōu)異。 - 學(xué)習(xí)分類(lèi)問(wèn)題:如果預(yù)測(cè)的是類(lèi)別(如“漲/跌”),改用
RandomForestClassifier,評(píng)估指標(biāo)換成準(zhǔn)確率、F1分?jǐn)?shù)。
相關(guān)推薦:在m.nhjb.com.cn(m.nhjb.com.cn)搜索“Scikit-learn入門(mén)”、“時(shí)間序列預(yù)測(cè)實(shí)戰(zhàn)”,有更多結(jié)合具體場(chǎng)景的詳細(xì)教程。記住,多動(dòng)手、多調(diào)參、多思考特征,才是掌握AI預(yù)測(cè)的捷徑。