web-dev-qa-db-ja.com

scikit-learnで決定木を視覚化する

Python(Windows OSでAnacondaのIpythonノートブックを使用して、Python 2.7.3で)と次のように視覚化します。

from pandas import read_csv, DataFrame
from sklearn import tree
from os import system

data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)

dotfile = open("D:/dtree2.dot", 'w')
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
system("dot -Tpng D:.dot -o D:/dtree2.png")

ただし、次のエラーが表示されます。

AttributeError: 'NoneType' object has no attribute 'close'

次のブログ投稿を参照として使用します。 ブログ投稿リンク

次のstackoverflowの質問は私にとってもうまくいかないようです: Question

Scikit-learnでデシジョンツリーを視覚化する方法を教えてください。

28
Ravi

_sklearn.tree.export_graphviz_ は何も返さないため、デフォルトではNoneを返します。

dotfile = tree.export_graphviz(...)を実行すると、以前にdotfileに割り当てられていた開いているファイルオブジェクトを上書きするため、ファイルを閉じようとするとエラーが発生します(現在はNone)。

修正するには、コードを

_...
dotfile = open("D:/dtree2.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
...
_
23
Ffisegydd

jupyterとsklearn(18.2+)を使用している人向けのライナーが1つあります。そのためにmatplotlibも必要ありません。唯一の要件は graphviz です

pip install graphviz

実行するよりも(質問Xのコードによるとpandas DataFrame)

from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))

これにより、SVG形式で表示されます。上記のコードは、Graphvizの Source オブジェクト( source_code -怖くない)を生成します。これはjupyterで直接レンダリングされます。

あなたがそれでやりそうなこと

Jupterで表示します。

from IPython.display import SVG
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
SVG(graph.pipe(format='svg'))

Png形式で保存:

graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = 'png'
graph.render('dtree_render',view=True)

PNG画像を取得し、保存して表示します。

graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
png_bytes = graph.pipe(format='png')
with open('dtree_pipe.png','wb') as f:
    f.write(png_bytes)

from IPython.display import Image
Image(png_bytes)

そのライブラリを使用する場合は、 examples および serguide へのリンクがあります

25
singer

私のように、graphvizのインストールに問題がある場合は、次の方法でツリーを視覚化できます。

  1. 前の回答に示されているように、export_graphvizでエクスポートする
  2. テキストエディターで.dotファイルを開きます
  3. コードをコピーして貼り付けます@ webgraphviz.com
20
FrancoisHawaii

または、pydotを使用して、ドットからpngファイルを生成してみることもできます。

...
tree.export_graphviz(dtreg, out_file='tree.dot') #produces dot file

import pydot
dotfile = StringIO()
tree.export_graphviz(dtreg, out_file=dotfile)
pydot.graph_from_dot_data(dotfile.getvalue()).write_png("dtree2.png")
...
9
CSquare

Export_graphvizファイルの内容をコピーし、同じものを webgraphviz.com サイトに貼り付けることができます。

詳しくは、How to デシジョンツリーをPython with graphviz)で視覚化してください の記事をご覧ください。

2

ソース.dotを直接取得する際に問題が発生した場合は、次のようにSource.from_fileを使用することもできます。

from graphviz import Source
from sklearn import tree
tree.export_graphviz(dtreg, out_file='tree.dot', feature_names=X.columns)
Source.from_file('tree.dot')
0
louis_guitton

以下も正常に機能します。

from sklearn.datasets import load_iris
iris = load_iris()

# Model (can also use single decision tree)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=10)

# Train
model.fit(iris.data, iris.target)
# Extract single tree
estimator = model.estimators_[5]

from sklearn.tree import export_graphviz
# Export as dot file
export_graphviz(estimator, out_file='tree.dot', 
                feature_names = iris.feature_names,
                class_names = iris.target_names,
                rounded = True, proportion = False, 
                precision = 2, filled = True)

# Convert to png using system command (requires Graphviz)
from subprocess import call
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])

# Display in jupyter notebook
from IPython.display import Image
Image(filename = 'tree.png')

enter image description here

ソースを見つけることができます こちら

0
Jeril

以下のようにコードの一部をコピーして変更します。

from pandas import read_csv, DataFrame
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from os import system

data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)

Dtreeがあることを確認した後、つまり上記のコードが適切に実行されることを確認したら、以下のコードを追加して決定ツリーを視覚化します。

最初にgraphvizをインストールすることを忘れないでください:pip install graphviz

import graphviz 
from graphviz import Source
dot_data = tree.export_graphviz(dtree, out_file=None, feature_names=X.columns)
graph = graphviz.Source(dot_data) 
graph.render("name of file",view = True)

データを試してみましたが、視覚化はうまく機能し、すぐにPDFファイルが表示されました。

0
vuminh91

シンプルな方法 here with pydotplus (graphvizをインストールする必要があります):

from IPython.display import Image  
from sklearn import tree
import pydotplus # installing pyparsing maybe needed

...

dot_data = tree.export_graphviz(best_model, out_file=None, feature_names = X.columns)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
0
Alexey Shrub