1はじめに
Scikit-Learnモジュールを使用してPythonで機械学習アルゴリズムを実装するのは比較的簡単であり、すべての詳細を知る必要はありません。これは、アルゴリズムでランダムフォレスト回帰を実行する方法の概要とパラメーターの詳細です。それがあなたの仕事に役立つことを願っています。
ここでは、コードを表示するだけでなく、Pythonでランダムフォレスト回帰を構築して使用する方法を紹介し、モデルがどのように機能するかを理解しようとします。
1.1ランダムフォレストの概要
ランダムフォレストは、アンサンブル学習に基づく教師あり機械学習アルゴリズムです。アンサンブル学習は、さまざまなタイプのアルゴリズムまたは同じアルゴリズムを複数回追加して、より強力な予測モデルを形成できるタイプの学習です。ランダムフォレストは、同じタイプの複数のアルゴリズム、つまり複数の意思決定ツリーを組み合わせたものであるため、「ランダムフォレスト」という名前が付けられています。
1.2デシジョンツリーを理解する
デシジョンツリーはランダムフォレストの構成要素であり、それ自体が直感的なモデルです。デシジョンツリーは、データについて質問するフローチャートと考えることができます。これは、私たちが実際に何をするかを決定するため、解釈可能なモデルです。最終的に決定に達する前に、データについて一連の質問をします。
ランダムフォレストは、多くの決定木で構成される全体的なモデルです。予測は、各決定木の予測を平均することによって行われます。フォレストがツリーのコレクションであるように、ランダムフォレストモデルも決定木のモデルのコレクションです。これにより、ランダムフォレストは、単一の決定木よりもはるかに強力な強力なモデリング手法になります。
ランダムフォレスト内の各ツリーは、データのサブセットでトレーニングを行っています。その背後にある基本的な考え方は、個々の決定木に依存するのではなく、最終的な出力を決定するときに複数の決定木を組み合わせるというものです。各デシジョンツリーの分散は大きくなりますが、すべてのデシジョンツリーを並列に組み合わせると、各デシジョンツリーは特定のサンプルデータ用に完全にトレーニングされるため、結果の分散は非常に小さくなり、出力は複数のデシジョンツリーに依存しません。複数の決定木。回帰問題の場合、最終出力はすべての決定木の出力の平均です。
1.3ランダムフォレストの作業プロセスの概要
- N個のサンプルサブセットがデータセットからランダムに選択されます。
- N個のサンプルサブセットに基づいて決定木を構築します。
- アルゴリズムに必要なツリーの数を選択してから、手順1と2を繰り返します。
回帰問題の場合、フォレスト内の各ツリーはY値(出力)を予測します。最終的な値は、フォレスト内のすべての決定木の予測値の平均を取ることによって計算されます。
1.4ブートストラップとバギング
ブートストラップ
ブートストラップアルゴリズムとは、複数回の繰り返しサンプリングによる限られたサンプルデータの使用を指します。例:元のサンプルを置き換えてサンプリングする、n回サンプリングする。新しいサンプルが抽出されるたびに、操作が繰り返されて多くの新しいサンプルが形成されます。
ランダムフォレストは、各ランダムサンプルで決定木をトレーニングすることです。各ツリーは特定のトレーニングデータのセットとは大きく異なる場合がありますが、全体として、フォレスト全体の分散は非常に小さいです。
バギング
ランダムフォレストは、ランダムに選択されたさまざまなサンプルサブセットで各決定木をトレーニングし、予測を平均して全体的な予測を行います。このプロセスはバギングと呼ばれます。
2ランダムフォレストの長所と短所
2.1ランダムフォレスト回帰の利点
機械学習の分野では、ランダムフォレスト回帰アルゴリズムは、他の一般的で一般的なアルゴリズムよりも回帰問題に適しています。
- フィーチャとラベルの間には、非線形または複雑な関係があります。
- トレーニングセットのノイズに敏感ではなく、堅牢なモデルを取得するのに役立ちます。ランダムフォレストアルゴリズムは、無関係な決定木のセットを使用するため、単一の決定木よりも堅牢です。
- モデルの過剰適合は避けてください。
2.2ランダムフォレストのデメリット
- ランダムフォレストの主な欠点は、その複雑さです。多数のデシジョンツリーを相互に接続する必要があるため、より多くのコンピューティングリソースが必要になります。
- それらは複雑であるため、他の同様のアルゴリズムよりもトレーニングに多くの時間を必要とします。
2.3ランダムフォレストの過剰適合問題
下の図に、過適合、適合、および過剰適合を示します。過剰適合の状況がある場合、トレーニングデータモデルのパフォーマンスは良好であり、テストデータモデルのパフォーマンスは明らかに劣ります。機械学習は過剰適合しやすい傾向があります。ランダムフォレストの過剰適合の問題は2つの学校に分けられ、過剰適合と過剰適合ではありません。
過剰適合しない:Leo Breiman(ランダムフォレストアルゴリズムの作成者)の論文「RandomForests」ステートメント:
過剰適合:
問題の説明、トレーニングサンプルとしてのデータの一部(データの90%)、一部(10% )テストサンプルとして、トレーニングサンプルのR2は常に0.85であるのに対し、テストサンプルのR2はわずか0.5であり、高値はわずか0.6であることがわかります。
この問題の場合、独立変数と従属変数自体の関係が非常に低く、過剰適合のアーティファクトが発生する可能性も非常に高くなります。
3ランダムフォレスト回帰を使用した練習
このセクションでは、Scikit-Learnを使用してランダムフォレストを適用して回帰問題を解決する方法を学習します。
3.1問題の説明
米国の48州におけるガソリン税(米ドル)、1人当たりの所得(米ドル)、高速道路(マイル)、およびガソリン消費量を予測する人口の割合(数百万ガロン)に基づいています。
この回帰問題を解決するために、Scikit-Learnのランダムフォレストアルゴリズムが使用されます。
3.2サンプルデータ
サンプルデータセットは、次の場所で入手できます(開くには、KeXueShangWangが必要です):https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_/view
3.3コード
関連する説明はコードにコメントされています
import pandas as pd
import numpy as np
# 导入数据,路径中要么用\\或/或者在路径前加r
dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')
# 输出数据预览
print(dataset.head())
# 准备训练数据
# 自变量:汽油税、人均收入、高速公路、人口所占比例
# 因变量:汽油消耗量
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values
# 将数据分为训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,
y,
test_size=0.2,
random_state=0)
# 特征缩放,通常没必要
# 因为数据单位,自变量数值范围差距巨大,不缩放也没问题
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
# 训练随机森林解决回归问题
from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators=200, random_state=0)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
# 评估回归性能
from sklearn import metrics
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:',
np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
出力結果
Petrol_tax Average_income Paved_Highways Population_Driver_licence(%) Petrol_Consumption
0 9.0 3571 1976 0.525 541
1 9.0 4092 1250 0.572 524
2 9.0 3865 1586 0.580 561
3 7.5 4870 2351 0.529 414
4 8.0 4399 431 0.544 410
Mean Absolute Error: 48.33899999999999
Mean Squared Error: 3494.2330150000003
Root Mean Squared Error: 59.112037818028234
4Sklearnランダムフォレスト回帰パラメーターの詳細な説明
sklearn.ensemble.RandomForestRegressor
各パラメーターの意味を理解するには、関数の定義から始める必要があります。具体的な説明では、公式Webサイトの説明を参照する必要があります。
sklearn.ensemble.RandomForestRegressor(
n_estimators=100, *, # 树的棵树,默认是100
criterion='mse', # 默认“ mse”,衡量质量的功能,可选择“mae”。
max_depth=None, # 树的最大深度。
min_samples_split=2, # 拆分内部节点所需的最少样本数:
min_samples_leaf=1, # 在叶节点处需要的最小样本数。
min_weight_fraction_leaf=0.0, # 在所有叶节点处的权重总和中的最小加权分数。
max_features='auto', # 寻找最佳分割时要考虑的特征数量。
max_leaf_nodes=None, # 以最佳优先方式生长具有max_leaf_nodes的树。
min_impurity_decrease=0.0, # 如果节点分裂会导致杂质的减少大于或等于该值,则该节点将被分裂。
min_impurity_split=None, # 提前停止树木生长的阈值。
bootstrap=True, # 建立树木时是否使用bootstrap抽样。 如果为False,则将整个数据集用于构建每棵决策树。
oob_score=False, # 是否使用out-of-bag样本估算未过滤的数据的R2。
n_jobs=None, # 并行运行的Job数目。
random_state=None, # 控制构建树时样本的随机抽样
verbose=0, # 在拟合和预测时控制详细程度。
warm_start=False, # 设置为True时,重复使用上一个解决方案,否则,只需拟合一个全新的森林。
ccp_alpha=0.0,
max_samples=None) # 如果bootstrap为True,则从X抽取以训练每个决策树。
5ランダムフォレストの可視化
5.1コード
import sklearn.datasets as datasets
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.decomposition import PCA
# 导入数据,路径中要么用\\或/或者在路径前加r
dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')
# 输出数据预览
print(dataset.head())
# 准备训练数据
# 自变量:汽油税、人均收入、高速公路、人口所占比例
# 因变量:汽油消耗量
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X,
y,
test_size=0.2,
random_state=0)
regr = RandomForestRegressor()
# regr = RandomForestRegressor(random_state=100,
# bootstrap=True,
# max_depth=2,
# max_features=2,
# min_samples_leaf=3,
# min_samples_split=5,
# n_estimators=3)
pipe = Pipeline([('scaler', StandardScaler()), ('reduce_dim', PCA()),
('regressor', regr)])
pipe.fit(X_train, y_train)
ypipe = pipe.predict(X_test)
from six import StringIO
from IPython.display import Image
from sklearn.tree import export_graphviz
import pydotplus
import os
# 执行一次
# os.environ['PATH'] = os.environ['PATH']+';'+r"D:\CLibrary\Graphviz2.44.1\bin\graphviz"
dot_data = StringIO()
export_graphviz(pipe.named_steps['regressor'].estimators_[0],
out_file=dot_data)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('tree.png')
Image(graph.create_png())
5.2GraphVizの実行可能ファイルが見つからないエラーレポートソリューション
参照ブログ投稿
5.3 InvocationException:GraphVizの実行可能ファイルが見つからないソリューション
参照ブログ投稿
5.4ランダムフォレストの視覚化
X [0]、X [1]、X [2]、X [3]、X [4] ...は対応する独立変数です。構造から、mseが徐々に減少していることがわかります。ここには合計12層の木があり、実際の作業での例よりもはるかに大きい可能性があります。
5.5変数の重要性
変数の重要度の評価を通じて、これらの重要でない変数を削除でき、パフォーマンスに影響を与えることはありません。さらに、さまざまな機械学習方法(サポートベクターマシンなど)を使用する場合、特徴選択方法としてランダムフォレスト特徴の重要度を使用できます。
ランダムフォレスト全体のすべての変数のモデルへの寄与を定量化するために、変数の相対的な重要性を調べることができます。Skicit-learnで返される重要性は、特定の変数を含めることで予測を改善できることを示しています。重要度の実際の計算はこの記事の範囲を超えており、ここではモデル出力の重要度の値のみが使用されます。
# Get numerical feature importances
importances = list(regr.feature_importances_)
# List of tuples with variable and importance
print(importances)
# Saving feature names for later use
feature_list = list(dataset.columns)[0:4]
feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]
# Sort the feature importances by most important first
feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)
# Print out the feature and importances
# [print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances];
# Import matplotlib for plotting and use magic command for Jupyter Notebooks
import matplotlib.pyplot as plt
# Set the style
# plt.style.use('fivethirtyeight')
# list of x locations for plotting
x_values = list(range(len(importances)))
print(x_values)
# Make a bar chart
plt.bar(x_values, importances, orientation = 'vertical')
# Tick labels for x axis
plt.xticks(x_values, feature_list,rotation=6)
# Axis labels and title
plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');
plt.show()
参照してください
https://stackabuse.com/random-forest-algorithm-with-python-and-scikit-learn/
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
HTTPS ://towardsdatascience.com/random-forest-in-python-24d0893d51c0
リンクの説明を追加