ホームページ  >  記事  >  バックエンド開発  >  Python でデシジョン ツリーを構築する方法

Python でデシジョン ツリーを構築する方法

WBOY
WBOY転載
2023-05-13 11:22:052399ブラウズ

デシジョン ツリー

デシジョン ツリーは、今日の最も強力な教師あり学習手法に不可欠な部分です。決定木は基本的に二分木のフローチャートであり、各ノードが何らかの特性変数に基づいて観測値のセットを分割します。

デシジョン ツリーの目標は、データをグループに分割し、グループ内のすべての要素が同じカテゴリに属する​​ようにすることです。デシジョン ツリーは、連続ターゲット変数を近似するために使用することもできます。この場合、各グループの平均二乗誤差が最小になるようにツリーが分割されます。

デシジョン ツリーの重要な特性は、簡単に解釈できることです。デシジョン ツリーが何を行っているかを理解するために、機械学習手法に精通している必要はまったくありません。意思決定木図は解釈しやすいです。

長所と短所

デシジョン ツリー手法の利点は次のとおりです。

  • デシジョン ツリーは、理解可能なルールを生成できます。

  • デシジョン ツリーは、大規模な計算を必要とせずに分類を実行します。

  • デシジョン ツリーは連続変数とカテゴリ変数を処理できます。

  • デシジョン ツリーは、どのフィールドが最も重要であるかを明確に示します。

デシジョン ツリー手法の欠点は次のとおりです。

  • デシジョン ツリーは、連続的な属性値を予測することが目的の推定タスクには適していません。 。

  • デシジョン ツリーは、クラスが多く、トレーニング サンプルが少ない場合の分類問題でエラーが発生する傾向があります。

  • デシジョン ツリーのトレーニングには計算コストがかかる場合があります。デシジョン ツリーを生成するプロセスは、計算コストが非常に高くなります。各ノードで、最適な分割を見つけるために各分割候補フィールドを並べ替える必要があります。一部のアルゴリズムでは、フィールドの組み合わせを使用して、重みの最適な組み合わせを検索する必要があります。枝刈りアルゴリズムも、多くの候補サブツリーを形成して比較する必要があるため、コストがかかる可能性があります。

Python デシジョン ツリー

Python は、データ サイエンティストに強力な機械学習パッケージとツールを提供する汎用プログラミング言語です。この記事では、Python で最も有名な機械学習パッケージである scikit-learn を使用してデシジョン ツリー モデルを構築します。 scikit learn が提供する「DecisionTreeClassifier」アルゴリズムを使用してモデルを作成し、「plot_tree」関数を使用してモデルを視覚化します。

ステップ 1: パッケージのインポート

モデルの構築に使用する主なソフトウェア パッケージは、pandas、scikit learn、NumPy です。コードに従って、必要なパッケージを Python にインポートします。

import pandas as pd # 数据处理 import numpy as np # 使用数组 import matplotlib.pyplot as plt # 可视化 from matplotlib import rcParams # 图大小 from termcolor import colored as cl # 文本自定义  from sklearn.tree import DecisionTreeClassifier as dtc # 树算法 from sklearn.model_selection import train_test_split # 拆分数据 from sklearn.metrics import accuracy_score # 模型准确度 from sklearn.tree import plot_tree # 树图  rcParams['figure.figsize'] = (25, 20)

モデルの構築に必要なすべてのパッケージをインポートしたら、データをインポートして EDA を実行します。

ステップ 2: データと EDA をインポートする

このステップでは、Python で提供されている「Pandas」パッケージを使用してインポートし、EDA を実行します。特定の基準に基づいて患者に処方される薬のデータセットであるデータセットに基づいてデシジョン ツリー モデルを構築します。 Python を使用してデータをインポートしましょう!

Python 実装:

df = pd.read_csv('drug.csv') df.drop('Unnamed: 0', axis = 1, inplace = True)  print(cl(df.head(), attrs = ['bold']))

出力:

   Age Sex      BP Cholesterol  Na_to_K   Drug 0   23   F    HIGH        HIGH   25.355  drugY 1   47   M     LOW        HIGH   13.093  drugC 2   47   M     LOW        HIGH   10.114  drugC 3   28   F  NORMAL        HIGH    7.798  drugX 4   61   F     LOW        HIGH   18.043  drugY

これで、データセットについて明確に理解できました。データをインポートした後、「info」関数を使用してデータに関する基本情報を取得しましょう。この関数によって提供される情報には、エントリ数、インデックス番号、列名、NULL 以外の値の数、属性タイプなどが含まれます。

Python 実装:

df.info()

出力:

<class> RangeIndex: 200 entries, 0 to 199 Data columns (total 6 columns):  #   Column       Non-Null Count  Dtype   ---  ------       --------------  -----    0   Age          200 non-null    int64    1   Sex          200 non-null    object   2   BP           200 non-null    object   3   Cholesterol  200 non-null    object   4   Na_to_K      200 non-null    float64  5   Drug         200 non-null    object  dtypes: float64(1), int64(1), object(4) memory usage: 9.5+ KB</class>

ステップ 3: データ処理

できること性別、血圧、コレステロールなどの属性は、本質的にカテゴリカルでオブジェクト タイプであることに注意してください。問題は、scikit-learn の決定木アルゴリズムが本質的に「オブジェクト」タイプの X 変数 (特徴) をサポートしていないことです。したがって、これらの「オブジェクト」値を「バイナリ」値に変換する必要があります。 Python を使用して実装しましょう

Python 実装:

for i in df.Sex.values:     if i  == 'M':         df.Sex.replace(i, 0, inplace = True)     else:         df.Sex.replace(i, 1, inplace = True)  for i in df.BP.values:     if i == 'LOW':         df.BP.replace(i, 0, inplace = True)     elif i == 'NORMAL':         df.BP.replace(i, 1, inplace = True)     elif i == 'HIGH':         df.BP.replace(i, 2, inplace = True)  for i in df.Cholesterol.values:     if i == 'LOW':         df.Cholesterol.replace(i, 0, inplace = True)     else:         df.Cholesterol.replace(i, 1, inplace = True)  print(cl(df, attrs = ['bold']))

出力:

     Age  Sex  BP  Cholesterol  Na_to_K   Drug 0     23    1   2            1   25.355  drugY 1     47    1   0            1   13.093  drugC 2     47    1   0            1   10.114  drugC 3     28    1   1            1    7.798  drugX 4     61    1   0            1   18.043  drugY ..   ...  ...  ..          ...      ...    ... 195   56    1   0            1   11.567  drugC 196   16    1   0            1   12.006  drugC 197   52    1   1            1    9.894  drugX 198   23    1   1            1   14.020  drugX 199   40    1   0            1   11.349  drugX  [200 rows x 6 columns]

すべての「オブジェクト」値が処理されることがわかりますカテゴリデータを表す「バイナリ」値に変換します。例えば、コレステロール属性では、「低」を示す値は0として処理され、「高」の値は1として処理されます。これで、データから従属変数と独立変数を作成する準備が整いました。

ステップ 4: データを分割する

データを正しい構造に処理した後、「X」変数 (独立変数)、「Y」変数を設定します。 (従属変数)。 Python を使用して実装してみましょう

Python 実装:

X_var = df[['Sex', 'BP', 'Age', 'Cholesterol', 'Na_to_K']].values # 自变量 y_var = df['Drug'].values # 因变量  print(cl('X variable samples : {}'.format(X_var[:5]), attrs = ['bold'])) print(cl('Y variable samples : {}'.format(y_var[:5]), attrs = ['bold']))

出力:

X variable samples : [[ 1.     2.    23.     1.    25.355]  [ 1.     0.    47.     1.    13.093]  [ 1.     0.    47.     1.    10.114]  [ 1.     1.    28.     1.     7.798]  [ 1.     0.    61.     1.    18.043]] Y variable samples : ['drugY' 'drugC' 'drugC' 'drugX' 'drugY']

これで、scikit の "train_test_split" アルゴリズムを使用して学習できるようになりました。データは、定義した X 変数と Y 変数を含むトレーニング セットとテスト セットに分割されます。 Python でデータを分割するには、コードに従ってください。

Python 実装:

X_train, X_test, y_train, y_test = train_test_split(X_var, y_var, test_size = 0.2, random_state = 0)  print(cl('X_train shape : {}'.format(X_train.shape), attrs = ['bold'], color = 'black')) print(cl('X_test shape : {}'.format(X_test.shape), attrs = ['bold'], color = 'black')) print(cl('y_train shape : {}'.format(y_train.shape), attrs = ['bold'], color = 'black')) print(cl('y_test shape : {}'.format(y_test.shape), attrs = ['bold'], color = 'black'))

出力:

X_train shape : (160, 5) X_test shape : (40, 5) y_train shape : (160,) y_test shape : (40,)

これで、デシジョン ツリー モデルを構築するためのすべてのコンポーネントが揃いました。それでは、Python でモデルを構築しましょう。

ステップ 5: モデルと予測の構築

scikit 学習パッケージによって提供される「DecisionTreeClassifier」アルゴリズムを利用すると、デシジョン ツリーを構築できます。その後、トレーニングされたモデルを使用してデータを予測できます。最後に、予測結果の精度は、「精度」評価指標を使用して計算できます。 Python を使用してこのプロセスを完了しましょう!

Python 実装:

model = dtc(criterion = 'entropy', max_depth = 4) model.fit(X_train, y_train)  pred_model = model.predict(X_test)  print(cl('Accuracy of the model is {:.0%}'.format(accuracy_score(y_test, pred_model)), attrs = ['bold']))

出力:

Accuracy of the model is 88%

在代码的第一步中,我们定义了一个名为“model”变量的变量,我们在其中存储DecisionTreeClassifier模型。接下来,我们将使用我们的训练集对模型进行拟合和训练。之后,我们定义了一个变量,称为“pred_model”变量,其中我们将模型预测的所有值存储在数据上。最后,我们计算了我们的预测值与实际值的精度,其准确率为88%。

步骤6:可视化模型

现在我们有了决策树模型,让我们利用python中scikit  learn包提供的“plot_tree”函数来可视化它。按照代码从python中的决策树模型生成一个漂亮的树图。

Python实现:

feature_names = df.columns[:5] target_names = df['Drug'].unique().tolist()  plot_tree(model,            feature_names = feature_names,            class_names = target_names,            filled = True,            rounded = True)  plt.savefig('tree_visualization.png')

输出:

Python でデシジョン ツリーを構築する方法

结论

有很多技术和其他算法用于优化决策树和避免过拟合,比如剪枝。虽然决策树通常是不稳定的,这意味着数据的微小变化会导致最优树结构的巨大变化,但其简单性使其成为广泛应用的有力候选。在神经网络流行之前,决策树是机器学习中最先进的算法。其他一些集成模型,比如随机森林模型,比普通决策树模型更强大。

决策树由于其简单性和可解释性而非常强大。决策树和随机森林在用户注册建模、信用评分、故障预测、医疗诊断等领域有着广泛的应用。我为本文提供了完整的代码。

完整代码:

import pandas as pd # 数据处理 import numpy as np # 使用数组 import matplotlib.pyplot as plt # 可视化 from matplotlib import rcParams # 图大小 from termcolor import colored as cl # 文本自定义  from sklearn.tree import DecisionTreeClassifier as dtc # 树算法 from sklearn.model_selection import train_test_split # 拆分数据 from sklearn.metrics import accuracy_score # 模型准确度 from sklearn.tree import plot_tree # 树图  rcParams['figure.figsize'] = (25, 20)  df = pd.read_csv('drug.csv') df.drop('Unnamed: 0', axis = 1, inplace = True)  print(cl(df.head(), attrs = ['bold']))  df.info()  for i in df.Sex.values:     if i  == 'M':         df.Sex.replace(i, 0, inplace = True)     else:         df.Sex.replace(i, 1, inplace = True)  for i in df.BP.values:     if i == 'LOW':         df.BP.replace(i, 0, inplace = True)     elif i == 'NORMAL':         df.BP.replace(i, 1, inplace = True)     elif i == 'HIGH':         df.BP.replace(i, 2, inplace = True)  for i in df.Cholesterol.values:     if i == 'LOW':         df.Cholesterol.replace(i, 0, inplace = True)     else:         df.Cholesterol.replace(i, 1, inplace = True)  print(cl(df, attrs = ['bold']))  X_var = df[['Sex', 'BP', 'Age', 'Cholesterol', 'Na_to_K']].values # 自变量 y_var = df['Drug'].values # 因变量  print(cl('X variable samples : {}'.format(X_var[:5]), attrs = ['bold'])) print(cl('Y variable samples : {}'.format(y_var[:5]), attrs = ['bold']))  X_train, X_test, y_train, y_test = train_test_split(X_var, y_var, test_size = 0.2, random_state = 0)  print(cl('X_train shape : {}'.format(X_train.shape), attrs = ['bold'], color = 'red')) print(cl('X_test shape : {}'.format(X_test.shape), attrs = ['bold'], color = 'red')) print(cl('y_train shape : {}'.format(y_train.shape), attrs = ['bold'], color = 'green')) print(cl('y_test shape : {}'.format(y_test.shape), attrs = ['bold'], color = 'green'))  model = dtc(criterion = 'entropy', max_depth = 4) model.fit(X_train, y_train)  pred_model = model.predict(X_test)  print(cl('Accuracy of the model is {:.0%}'.format(accuracy_score(y_test, pred_model)), attrs = ['bold']))  feature_names = df.columns[:5] target_names = df['Drug'].unique().tolist()  plot_tree(model,            feature_names = feature_names,            class_names = target_names,            filled = True,            rounded = True)  plt.savefig('tree_visualization.png')

以上がPython でデシジョン ツリーを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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