質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.70%

python 決定木をdotファイルで出力する際のエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,378

---stax---

score 138

表題の件で質問お願い致します
回帰問題について決定木のモデルを作成し、その結果を出力させようとした際に以下のエラーが発生しており、エラーで検索しても答えが見つけられず困っています

NotFittedError                            Traceback (most recent call last)
<ipython-input-51-8598195d41d5> in <module>()
      4                 feature_names=X_train1.columns,
      5                 impurity=False,
----> 6                 filled=True)
      7 
      8 with open(r'C:\Users\Desktop\tree.dot') as f:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\tree\export.py in export_graphviz(decision_tree, out_file, max_depth, feature_names, class_names, label, filled, leaves_parallel, impurity, node_ids, proportion, rotate, rounded, special_characters, precision)
    390                 out_file.write('%d -> %d ;\n' % (parent, node_id))
    391 
--> 392     check_is_fitted(decision_tree, 'tree_')
    393     own_file = False
    394     return_string = False

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py in check_is_fitted(estimator, attributes, msg, all_or_any)
    766 
    767     if not all_or_any([hasattr(estimator, attr) for attr in attributes]):
--> 768         raise NotFittedError(msg % {'name': type(estimator).__name__})
    769 
    770 

NotFittedError: This GridSearchCV instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

以下実際のコードなのですが、graphvizを使用する前にモデルをfitメソッドを使って学習させているのでどこが問題かわかりません・・・
初歩的な質問ですがアドバイス宜しくお願い致します

import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.tree import export_graphviz
import graphviz
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import GridSearchCV
import time 
from sklearn.metrics import roc_curve, auc, accuracy_score

df = pd.read_csv(r'C:\Users\Desktop\test3.csv', engine='python')
%time tmp = pd.read_csv(r'C:\Users\Desktop\test3.csv', engine='python') 
df.describe()

drop_columns = [除去する列(多いので割愛します)]


X = df.drop(drop_columns, axis=1)
Y = df['結果']
X_train1, X_test1, y_train1, y_test1 = train_test_split(X, Y, random_state=42)



dr_param_grid = {'max_depth':[3, 4, 5]}

dr = DecisionTreeRegressor(random_state=42)
dr_cv = GridSearchCV(dr, dr_param_grid, cv=5)
dr_cv.fit(X_train1, y_train1)

print('Training Data Score: {:.2f}'.format(dr_cv.score(X_train1, y_train1)))
print('Test Data Score: {:.2f}'.format(dr_cv.score(X_test1, y_test1)))

print('Best parameters: {}'.format(dr_cv.best_params_))
print('Best Cross Validation score: {:.2f}'.format(dr_cv.best_score_))



export_graphviz(dr_cv, out_file=r'C:\Users\Desktop\tree.dot', 
                feature_names=X_train1.columns,
                impurity=False, 
                filled=True)

with open(r'C:\Users\Desktop\tree.dot') as f:
    dot_graph = f.read()

graphviz.Source(dot_graph)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

第一引数にはdecision tree classifierのインスタンスを渡せとドキュメントに書いてありますね。GridSearchCVのインスタンスは受け付けないようです。
(エラーメッセージが不親切というか、入力されたインスタンスの型を見て例外投げる処理とかちゃんとやってない雰囲気なのですが。svmとか放り込んでも同じメッセージが出ますよ)

sklearn.tree.export_graphviz — scikit-learn 0.19.2 documentation

ドキュメントに詳しい説明はまったくありませんが、一応回帰木自体は出力できるようです。

from sklearn.datasets import load_boston
from sklearn.tree import DecisionTreeRegressor
from sklearn.tree import export_graphviz

boston = load_boston()
dtr = DecisionTreeRegressor(max_depth=3)
dtr.fit(boston.data, boston.target)
export_graphviz(dtr, feature_names=boston.feature_names, class_names=boston.target, filled=True)
# shellで$ dot -Tpng tree.dot -o tree.pngして画像を出力

イメージ説明

GridSearchCVのインスタンスのbest_estimator_を渡してあげれば良いでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/09 13:46

    ありがとうございます。
    探し切れていませんでした・・・。
    グリッドサーチして出た結果をもとに描画用のモデルを作り直してたのですが、アドバイス頂いたとおりに追記すればGridSearchCVのモデルでも描画できました。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.70%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる