[機械学習]回帰 – 決定木回帰

データセットの従属変数が連続値である場合、ツリーアルゴリズムは回帰ツリーであり、リーフノードによって観測された平均値を予測値として使用することができ、データセットの従属変数が離散値である場合ツリーアルゴリズムは分類木であり、分類問題をうまく解決することができます。 しかし、アルゴリズムは2分木であることに留意すべきである。すなわち 、各非リーフノードは2つのブランチを拡張することしかできないため、非リーフノードが複数レベルの離散変数である場合、変数は複数回使用することができます。

sklearnの決定木の一般化を改善するために使用できる超パラメータは主に
– max_depth:ツリーの最大深度。つまり、ツリーの深さがmax_depthに達すると、いくつの分岐を扱うことができるかにかかわらず、デシジョンツリーは操作を停止します。
– min_samples_split:分割に必要なノードの最小数リーフノードのサンプル数がこのパラメータより小さい場合、ブランチは生成されません。ブランチのラベル​​分類は、ブランチの下にあるラベルが最も多いカテゴリに基づいています。
– min_samples_leaf;ブランチに必要なサンプルの最小数新しいリーフノードのフィーチャサンプルの数がブランチ後のハイパーパラメータよりも小さい場合は、それが返されて、もはやプルーニングされず、リターン後のリーフノードのラベルが使用されます。リーフノードの中で最もラベルが付いている、あなたは
– min_weight_fraction_leaf:最小重み係数
max_leaf_nodes:リーフノードの最大数。Noneの場合は制限がありません。整数をとる場合は、max_depthを無視してください。

今回使用するデータは、会社内のさまざまなプロモーションレベルに対応する給与です。

Pythonでどのように実装されているかを見てみましょう。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
 
dataset = pd.read_csv('Position_Salaries.csv')
X = dataset.iloc[:, 1:2].values
# 这里注意:1:2其实只有第一列,与1 的区别是这表示的是一个matrix矩阵,而非单一向量。
y = dataset.iloc[:, 2].values

次に、トピックに移動し、Decision Tree Regressionリターンを開始します。

from sklearn.tree import DecisionTreeRegressor
regressor = DecisionTreeRegressor(random_state = 0)
regressor.fit(X, y)
 
y_pred = regressor.predict(6.5)
# 图像中显示
X_grid = np.arange(min(X), max(X), 0.01)
X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(X, y, color = 'red')
plt.plot(X_grid, regressor.predict(X_grid), color = 'blue')
plt.title('Truth or Bluff (Decision Tree Regression)')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
 
# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(10 * rng.rand(160, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 2 * (0.5 - rng.rand(32)) # 每五个点增加一次噪音
 
# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=4)
regr_3 = DecisionTreeRegressor(max_depth=8)
regr_1.fit(X, y)
regr_2.fit(X, y)
regr_3.fit(X, y)
 
# Predict
X_test = np.arange(0.0, 10.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)
 
# Plot the results
plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",
            c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue",
         label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=4", linewidth=2)
plt.plot(X_test, y_3, color="r", label="max_depth=8", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

上記のテストから、決定木の最大深度が増加するにつれて、決定木を適合させる能力が上昇し続けることが分かる。
この例では、合計160のサンプルがあります。最大深度が8(lg(200)より大きい場合)、私たちの決定木は正しいサンプルに適合するだけでなく、 追加しノイズにも適合します。一般化能力の低下につながる。

最大深度とトレーニングエラーテストエラーの関係

以下では、さまざまな最大深さ決定木について、トレーニングエラーとテストエラーを実行します。
もちろん、デシジョンツリーを制御できる他のハイパーパラメータを変更してテストすることもできます。

from sklearn import model_selection
def creat_data(n):
    np.random.seed(0)
    X = 5 * np.random.rand(n, 1)
    y = np.sin(X).ravel()
    noise_num=(int)(n/5)
    y[::5] += 3 * (0.5 - np.random.rand(noise_num)) # 每第5个样本,就在该样本的值上添加噪音
    return model_selection.train_test_split(X, y,test_size=0.25,random_state=1)
def test_DecisionTreeRegressor_depth(*data,maxdepth):
    X_train,X_test,y_train,y_test=data
    depths=np.arange(1,maxdepth)
    training_scores=[]
    testing_scores=[]
    for depth in depths:
        regr = DecisionTreeRegressor(max_depth=depth)
        regr.fit(X_train, y_train)
        training_scores.append(regr.score(X_train,y_train))
        testing_scores.append(regr.score(X_test,y_test))
 
    ## 绘图
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    ax.plot(depths,training_scores,label="traing score")
    ax.plot(depths,testing_scores,label="testing score")
    ax.set_xlabel("maxdepth")
    ax.set_ylabel("score")
    ax.set_title("Decision Tree Regression")
    ax.legend(framealpha=0.5)
    plt.show()
 
X_train,X_test,y_train,y_test=creat_data(200)    
test_DecisionTreeRegressor_depth(X_train,X_test,y_train,y_test,maxdepth=12)

上の図から分かるように、train_testを使用してデータセットをセグメント化すると、最大深度2が必要な最適なハイパーパラメータになります。

同様に、他のハイパーパラメータをテストしたり、テストにcvを使用したり、hyperoptやauto-sklearnなどの成果物を使用したりすることができます。

元のサイトへ