ホームページ  >  記事  >  バックエンド開発  >  Pythonランダムフォレストモデルのサンプルを詳しく解説

Pythonランダムフォレストモデルのサンプルを詳しく解説

WBOY
WBOY転載
2022-07-01 12:05:174441ブラウズ

この記事では、Python に関する関連知識を提供します。この記事では、アンサンブル モデルの概要、ランダム フォレスト モデルの基本原理、およびsklearn でランダム化を実装する フォレストモデルなどの内容を見ていきましょう。

Pythonランダムフォレストモデルのサンプルを詳しく解説

[関連する推奨事項: Python3 ビデオ チュートリアル ]

1 統合モデルの概要

統合モデルの使用学習モデル 一連の 弱学習器 (基本モデルまたはベース モデルとも呼ばれます) が学習し、各弱学習器の結果を統合して、単一の学習器よりも優れた学習結果を取得します。

統合学習モデルには、バギング アルゴリズムとブースティング アルゴリズムという 2 つの一般的なアルゴリズムがあります。

バギング アルゴリズムの典型的な機械学習モデルはランダム フォレスト モデルですが、ブースティング アルゴリズムの典型的な機械学習モデルは AdaBoost、GBDT、XGBoost、LightGBM モデルです。

1.1 バギング アルゴリズムの概要

バギング アルゴリズムの原理は投票に似ています。各弱学習者は 1 票を持ちます。最後に、すべての弱学習者の投票に基づいて、「少数派」の原則が決まります。最終的な予測結果は下図のとおりです。

元のデータが 10,000 個あり、その 10,000 個のデータが置換によりランダムに抽出されて新しいトレーニング セットが形成されると仮定します (ランダムであるため)。置換バックサンプリングを使用するため、弱い学習器をトレーニングするためにトレーニング セットが使用されるたびに、特定のデータ部分が複数回サンプリングされることも、特定のデータ部分が 1 回もサンプリングされないこともあります。このようにして、置換を伴うランダムなサンプリングを n 回行った後、学習の終了時に、異なる学習セットで学習された n 個の弱学習器が得られます。これらの n 個の弱学習器の予測結果に応じて、「少数派は多数派に従う」を使用して、より正確で合理的な最終予測結果を取得します。

具体的には、分類問題では、n 個の弱学習器を使用して最終結果を得るために投票し、回帰問題では、n 個の弱学習器を使用して、最終結果を取得する 学習者の平均値が最終結果として使用されます。

1.2 ブースティング アルゴリズムの概要

ブースティング アルゴリズムの本質は、弱い学習者を強い学習者に昇格させることです。それとバギング アルゴリズムの違いは、バギング アルゴリズムではすべての弱い学習者を平等に扱うことです。アルゴリズムは、弱い学習者を異なる方法で「扱い」ます。平たく言えば、「エリートの育成」と「間違いに注意を払う」ことに焦点を当てています。

「エリートの育成」とは、トレーニングの各ラウンドの後、より正確な予測結果を持つ弱い学習者には大きな重みが与えられ、パフォーマンスが低い弱い学習者の重みは減らされることを意味します。このように、最終的な予測では「優秀モデル」は複数票を投じることに相当する比重が大きいのに対し、「一般モデル」は一票しか投じられないか、投票できないことになります。

「誤差に注意を払う」とは、トレーニングの各ラウンドの 後にトレーニング セットの重みまたは確率分布を変更することを意味します。前のラウンドでは、前のラウンドで弱学習器によって正しく予測された例の重み を減らして、誤って予測されたデータに対する弱学習器の重点を高めることで、モデルの全体的な予測効果が向上します。 。

2 ランダム フォレスト モデルの基本原理

ランダム フォレスト (ランダム フォレスト) は古典的なバギング モデルであり、その弱学習器はデシジョン ツリー モデルです。 下の図に示すように、ランダム フォレスト モデルは元のデータ セットからランダムにサンプリングして n 個の異なるサンプル データ セットを形成し、これらのデータ セットに基づいて n 個の異なるデシジョン ツリー モデルを構築し、最後に平均に基づいて n 個の異なるデシジョン ツリー モデルを構築します。これらのデシジョン ツリー モデルの値 (回帰モデルの場合) または投票 (分類モデルの場合) を使用して、最終結果を取得します。

モデルの一般化能力 (または汎用能力) を確保するために、ランダム フォレスト モデルは、各モデルを構築するときに「データ」に従います。 2 つの基本原則は、「ランダム」と「特性ランダム性」です。

ランダム データ : すべてのデータからデータをランダムに抽出し、デシジョン ツリー モデルの 1 つのトレーニング データとして置き換えます。たとえば、特定のデシジョン ツリー モデルをトレーニングするための新しいデータ セットを形成するために、1,000 個の元のデータがあり、置換して 1,000 回抽出されます。

特徴ランダム: 各サンプルの特徴次元が M の場合、定数 k

単一のデシジョン ツリー モデルと比較して、ランダム フォレスト モデルは複数のデシジョン ツリーを統合するため、予測結果がより正確になり、過剰適合が発生する可能性が低くなり、汎化能力が強化されます。 . .

3 sklearn を使用してランダム フォレスト モデルを実装する

ランダム フォレスト モデルでは、分類分析と回帰分析の両方を実行できます。対応するモデルは次のとおりです:

·ランダム フォレスト分類モデル(RandomForestClassifier)

·ランダム フォレスト回帰モデル (RandomForestRegressor)

ランダム フォレスト分類モデルの弱学習器は、分類決定木モデル、ランダム フォレストです。回帰 モデルの弱学習器は回帰決定木モデルです。

コードは以下のように表示されます。

from sklearn.ensemble import RandomForestClassifier
X = [[1,2],[3,4],[5,6],[7,8],[9,10]]
y = [0,0,0,1,1]

# 设置弱学习器数量为10
model = RandomForestClassifier(n_estimators=10,random_state=123)
model.fit(X,y)

model.predict([[5,5]])

# 输出为:array([0])

4 ケース: 株価騰落予測モデル

4.1 株価デリバティブ変数の生成

このセクションでは、株式の基本データを使用してデリバティブ変数データを取得する方法について説明します。 、株式テクノロジーなどの一般的に使用される移動平均指標を分析します: 5 日移動平均価格 MA5 および 10 日移動平均価格 MA10、相対強さ指標 RSI、モメンタム指標 MOM、指数移動平均 EMA、移動平均の類似性および差分 MACD、等

4.1.1 基本株価データの取得

まず get_k_data() 関数を使用して、2015-01-01 から 2019-12-31 までの基本株価データを取得します。コードは次のとおりです。 。

データの最初の 5 行は、次の図に示されています。欠落しているデータは休日 (非取引日) のデータです。

set_index() 関数を使用して、日付列を行インデックス に設定します。コードは次のとおりです。

4.1.2 単純な派生変数の生成

いくつかの単純な派生変数データは、次のコードを通じて生成できます。

終値-始値は (終値 - 始値)/始値を意味します;

高値-安値は (最高値 -最安値)/最低価格;

pre_close は昨日の終値を表します。shift(1) を使用して終値列のすべてのデータを 1 行下に移動し、新しい列を形成します。shift( の場合) - 1) は 1 行上に移動することを意味します;

price_change は今日の終値 - 昨日の終値、つまりその日の株価の変化を表します;

p_change はパーセンテージを表しますその日の株価の変化とも呼ばれ、その日の株価の上昇または下降です。

4.1.3 移動平均指標 MA 値の生成

株価の 5 日移動平均と 10 日移動平均は、次のコードを通じて生成できます。

注: ローリング関数の使用

##このうち、MA は移動平均を意味します。 「」は過去 n 日間の終値の算術平均を指し、「移動」は常に過去 n 日間の価格データが計算に使用されることを意味します。

例:MA5の計算

上記データより、No.5のMA5値は(1.2+1.4+1. 6+1.8+2.0 )/5=1.6、No.6のMA5値は(1.4+1.6+1.8+2.0+2.2)/5=1.8、となります。一定期間にわたる株価の移動平均を曲線に結び付けたものが移動平均です。同様にMA10は計算日から過去10日間の平均株価です。

MA5 のようなデータを計算する場合、最初の 4 日間のデータ量が不足しているため、この 4 日間に対応する移動平均を計算できず、NULL 値 NaN が生成されます。通常、dropna() 関数は、後続の計算で null 値によって引き起こされる問題を回避するために、null 値を削除するために使用されます。コードは次のとおりです。

#16 行目より前の行が削除されていることがわかります。

4.1.4 TA-Lib ライブラリを使用して相対強度インジケーター RSI 値を生成する

相対強度インジケーター RSI 値は、次のコードを通じて生成できます。

RSI 値は、短期的な株価下落に対する株価上昇の強さを反映しており、より適切な判断を下すのに役立ちます。株価の上昇と下落の傾向。

RSI 値が大きいほど、下降傾向に対して上昇傾向が強くなり、逆に、下降傾向に対して上昇傾向が弱くなります。

RSI値の計算式は以下の通りです。

例:

上記の表のデータに基づいて、 N=6 とすると、6 日間の平均上昇価格は (2+2+2)/6=1、6 日間の平均下落価格は (1+1+1)/6=0.5 であることがわかります。 , したがって、RSI 値は (1/(1+0.5))×100=66.7 となります。

通常、RSI値は20~80の間で、80を超えていれば買われすぎ、20未満であれば売られすぎ、50に等しい場合は売られすぎと考えられます。売り手と買い手の力は平等です。たとえば、株価が 6 日連続で上昇した場合、6 日目の平均下落価格は 0、6 日目の RSI 値は 100 になります。これは、株の購入者が現在非常に強い立場にあることを示しています。しかし、投資家は、これも過剰な期間である可能性があることに注意する必要があり、買いの状態では、株価の下落リスクを防ぐ必要があります。

4.1.5 TA-Lib ライブラリを使用してモメンタム インジケーターの MOM 値を生成する

モメンタム インジケーターの MOM 値は、次のコードを通じて生成できます。

MOM はモメンタムの略語で、 一定期間における株価の上昇率と下落率を反映します , 計算式は次のようになります。

例:

次の MOM 値を計算するとします。 No. 6、前のコードでは、パラメータ timeperiod が 5 に設定されているため、No. 6 の終値から No. 1 の終値を引く必要があります。つまり、No. 6 の MOM 値は 2.2 です。 -1.2=1、同様にNo.7のMOM値は2.4-1.4=1となります。連続した日のMOM値を結ぶと、株価の上昇と下降を反映する曲線が形成されます。

4.1.6 TA-Lib ライブラリを使用して指数移動平均 EMA を生成する

次のコードを通じて指数移動平均 EMA を生成できます。

#EMA は、指数関数的に降順に重み付けされた移動平均であり、計算結果に基づいて分析されます。株価の今後の動向、トレンド。

EMAの計算式は以下の通りです。

このうち、EMAtodayはその日のEMA値、Pricetodayはその日の終値、EMAyesterdayは昨日のEMA値、αは平滑化インデックス。通常、値は 2/(N+1) です。N は日数を表します。N が 6、α は 2/7 の場合、対応する EMA は EMA6 と呼ばれます。これは 6 日間の指数関数的な移動です。平均。最初の EMA 値が表示されるまで、数式は再帰的に続きます (最初の EMA 値は通常、最初の 5 つの数値の平均です)。

例: EMA6

最初の EMA 値を最初の 5 つの数値の平均として取得します。したがって、最初の EMA 値は存在しません。 5 日間; No.6 の EMA 値は、過去 5 日間の平均である最初の EMA 値、つまり 1 であり、No.7 の EMA 値は 2 番目の EMA 値です。計算プロセスは次のとおりです。 。

4.1.7 TA-Lib ライブラリを使用して移動平均の収束と発散の MACD 値を生成します

MACD を生成できます次のコードを使用して、移動平均の収束と発散の値を取得します。

MACD は株式市場でよく使用される指標で、EMA 値に基づく派生変数であり、計算方法は比較的複雑です。興味のある読者は学ぶことができます。ここで知っておく必要があるのは、MACD がトレンド指標であり、その変化が市場トレンドの変化を表すことだけであり、さまざまな K ライン レベルの MACD は、現在のレベル サイクルにおける売買トレンドを表します。

4.2 模型搭建

4.2.1 引入需要搭建的库

# 导入相关库
import tushare as ts
import numpy as np
import pandas as pd
import talib
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

4.2.2 获取数据

# 1.股票基本数据获取
import tushare as ts
df = ts.get_k_data('000002',start='2015-01-01',end='2019-12-31')
df = df.set_index('date')

# 2.简单衍生变量数据构造
df['close-open'] = (df['close'] - df['open']) / df['open']
df['high-low'] = (df['high'] - df['low']) / df['low']
df['pre_close'] = df['close'].shift(1)
df['price_change'] = df['close'] - df['pre_close']
df['p_change'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100

# 3.移动平均线相关数据构造
df['MA5'] = df['close'].rolling(5).mean()
df['MA10'] = df['close'].rolling(10).mean()
df.dropna(inplace=True)

# 4.通过TA-Lib库构造衍生变量数据
df['RSI'] = talib.RSI(df['close'],timeperiod=12)
df['MOM'] = talib.MOM(df['close'],timeperiod=5)
df['EMA12'] = talib.EMA(df['close'],timeperiod=12) #12日指移动平均值数
df['EMA26'] = talib.EMA(df['close'],timeperiod=26) #26日指移动平均值数
df['MACD'],df['MACDsignal'],df['MACDhist'] = talib.MACD(df['close'],fastperiod=6,slowperiod=12,signalperiod=9)
df.dropna(inplace=True)

4.2.3 提取特征变量和目标变量

X = df[['close','volume','close-open','MA5','MA10','high-low','RSI','MOM','EMA12','MACD','MACDsignal','MACDhist']]
y = np.where(df['price_change'].shift(-1) > 0,1,-1)

 首先强调最核心的一点:应该是用当天的股价数据预测下一天的股价涨跌情况,所以目标变量y应该是下一天的股价涨跌情况。为什么是用当天的股价数据预测下一天的股价涨跌情况呢?这是因为特征变量中的很多数据只有在当天交易结束后才能确定(例如,收盘价close只有收盘了才有),所以当天正在交易时的股价涨跌情况是无法预测的,而等到收盘时尽管所需数据齐备,但是当天的股价涨跌情况已成定局,也就没有必要预测了,所以是用当天的股价数据预测下一天的股价涨跌情况。

第2行代码中使用了NumPy库中的where()函数,传入的3个参数的含义分别为判断条件、满足条件的赋值、不满足条件的赋值。其中df['price_change'].shift(-1)是利用shift()函数将price_change(股价变化)这一列的所有数据向上移动1行,这样就获得了每一行对应的下一天的股价变化。因此,这里的判断条件就是下一天的股价变化是否大于0,如果大于0,说明下一天股价涨了,则y赋值为1;如果不大于0,说明下一天股价不变或跌了,则y赋值为-1。预测结果就只有1或-1两种分类。

4.2.4 划分训练集和测试集

这里需要注意的是,划分要按照时间序列进行,而不能用train_test_split()函数进行随机划分。这是因为股价的变化趋势具有时间性特征,而随机划分会破坏这种特征,所以需要根据当天的股价数据预测下一天的股价涨跌情况,而不能根据任意一天的股价数据预测下一天的股价涨跌情况。

将前90%的数据作为训练集,后10%的数据作为测试集,代码如下。

X_length = X.shape[0]
split = int(X_length * 0.9)
X_train,X_test = X[:split],X[split:]
y_train,y_test = y[:split],y[split:]

 4.2.5 模型搭建

model = RandomForestClassifier(max_depth=3,n_estimators=10,min_samples_leaf=10,random_state=123)
model.fit(X_train,y_train)

 设置模型参数:决策树的最大深度max_depth设置为3,即每个决策树最多只有3层;弱学习器(即决策树模型)的个数n_estimators设置为10,即该随机森林中共有10个决策树;叶子节点的最小样本数min_samples_leaf设置为10,即如果叶子节点的样本数小于10则停止分裂;随机状态参数random_state的作用是使每次运行结果保持一致,这里设置的数字123没有特殊含义,可以换成其他数字。

4.3 模型评估与使用

4.3.1 预测下一天的股价涨跌情况

用predict_proba()函数可以预测属于各个分类的概率,代码如下。

4.3.2 模型准确度评估

通过如下代码可以查看整体的预测准确度。

打印输出score为0.40,说明模型对整个测试集中约40%的数据预测正确。这一预测准确度并不算高,也的确符合股票市场千变万化的特点。

4.3.3 分析特征变量的特征重要性

通过如下代码可以分析各个特征变量的特征重要性。

由图可知,当日收盘价close、MA5、MACDhist相关指标等特征变量对下一天股价涨跌结果的预测准确度影响较大。

4.4 参数调优

from sklearn.model_selection import GridSearchCV
parameters={'n_estimators':[5,10,20],'max_depth':[2,3,4,5,6],'min_samples_leaf':[5,10,20,30]}
new_model = RandomForestClassifier(random_state=123)
grid_search = GridSearchCV(new_model,parameters,cv=6,scoring='accuracy')
grid_search.fit(X_train,y_train)
grid_search.best_params_

# 输出
# {'max_depth': 5, 'min_samples_leaf': 20, 'n_estimators': 5}

 4.5 收益回测曲线绘制

前面已经评估了模型的预测准确度,不过在商业实战中,更关心它的收益回测曲线(又称为净值曲线),也就是看根据搭建的模型获得的结果是否比不利用模型获得的结果更好。

# 在测试数据上添加一列,预测收益
X_test['prediction'] = model.predict(X_test)

# 计算每天的股价变化率
X_test['p_change'] = (X_test['close'] - X_test['close'].shift(1)) / X_test['close'].shift(1)

# 计算累积收益率
# 例如,初始股价是1,2天内的价格变化率为10%
# 那么用cumprod()函数可以求得2天后的股价为1×(1+10%)×(1+10%)=1.21
# 此结果也表明2天的收益率为21%。
X_test['origin'] = (X_test['p_change'] + 1).cumprod()

# 计算利用模型预测后的收益率
X_test['strategy'] = (X_test['prediction'].shift(1) * X_test['p_change'] + 1).cumprod()

X_test[['strategy','origin']].dropna().plot()
# 设置自动倾斜
plt.gcf().autofmt_xdate()
plt.show()

可视化结果如下图所示。图中上方的曲线为根据模型得到的收益率曲线,下方的曲线为股票本身的收益率曲线,可以看到,利用模型得到的收益还是不错的。

要说明的是,这里讲解的量化金融内容比较浅显,搭建的模型过于理想化,真正的股市是错综复杂的,股票交易也有很多限制,如不能做空、不能T+0交易,还要考虑手续费等因素。

随机森林模型是一种非常重要的集成模型,它集成了决策树模型的众多优点,又规避了决策树模型容易过度拟合等缺点,在实战中应用较为广泛。

【相关推荐:Python3视频教程

以上がPythonランダムフォレストモデルのサンプルを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。