Dapatkah saya mengekstrak aturan keputusan yang mendasari (atau 'jalur keputusan') dari pohon yang terlatih dalam pohon keputusan sebagai daftar tekstual?
Sesuatu seperti:
if A>0.4 then if B<0.2 then if C>0.8 then class='X'
Terima kasih atas bantuan Anda.
python
machine-learning
scikit-learn
decision-tree
random-forest
Dror Hilman
sumber
sumber
Jawaban:
Saya percaya bahwa jawaban ini lebih benar daripada jawaban lain di sini:
Ini mencetak fungsi Python yang valid. Berikut ini contoh output untuk pohon yang mencoba mengembalikan inputnya, angka antara 0 dan 10.
Berikut adalah beberapa batu sandungan yang saya lihat di jawaban lain:
tree_.threshold == -2
untuk memutuskan apakah suatu simpul adalah daun bukanlah ide yang baik. Bagaimana jika itu adalah simpul keputusan nyata dengan ambang -2? Sebaliknya, Anda harus melihattree.feature
atautree.children_*
.features = [feature_names[i] for i in tree_.feature]
crash dengan versi sklearn saya, karena beberapa nilaitree.tree_.feature
-2 (khusus untuk node daun).sumber
print "{}return {}".format(indent, tree_.value[node])
harus diubah keprint "{}return {}".format(indent, np.argmax(tree_.value[node][0]))
untuk fungsi untuk mengembalikan indeks kelas.RandomForestClassifier.estimators_
, tapi saya tidak bisa mengetahui cara menggabungkan hasil estimator.print "bla"
=>print("bla")
Saya membuat fungsi saya sendiri untuk mengekstrak aturan dari pohon keputusan yang dibuat oleh sklearn:
Fungsi ini dimulai dengan node (diidentifikasi oleh -1 pada array anak) dan kemudian secara rekursif menemukan orang tua. Saya menyebutnya 'garis silsilah' simpul. Sepanjang jalan, saya ambil nilai-nilai yang perlu saya buat jika / kemudian / logika SAS:
Kumpulan tupel di bawah ini berisi semua yang saya butuhkan untuk membuat SAS if / then / else statement. Saya tidak suka menggunakan
do
blok di SAS yang mengapa saya membuat logika yang menggambarkan seluruh jalur node. Integer tunggal setelah tupel adalah ID dari simpul terminal di jalur. Semua tupel sebelumnya bergabung untuk membuat simpul itu.sumber
(0.5, 2.5]
. Pohon-pohon dibuat dengan partisi rekursif. Tidak ada yang mencegah suatu variabel dipilih berulang kali.Saya memodifikasi kode yang dikirimkan oleh Zelazny7 untuk mencetak beberapa pseudocode:
jika Anda memanggil
get_code(dt, df.columns)
contoh yang sama Anda akan mendapatkan:sumber
(threshold[node] != -2)
ke( left[node] != -1)
(mirip dengan metode di bawah ini untuk mendapatkan id dari simpul anak)Scikit belajar memperkenalkan metode baru yang lezat yang disebut
export_text
dalam versi 0.21 (Mei 2019) untuk mengekstrak aturan dari pohon. Dokumentasi di sini . Tidak perlu lagi membuat fungsi khusus.Setelah sesuai dengan model Anda, Anda hanya perlu dua baris kode. Pertama, impor
export_text
:Kedua, buat objek yang akan berisi aturan Anda. Untuk membuat aturan terlihat lebih mudah dibaca, gunakan
feature_names
argumen dan berikan daftar nama fitur Anda. Misalnya, jika model Anda dipanggilmodel
dan fitur Anda dinamai dalam kerangka data yang disebutX_train
, Anda bisa membuat objek yang disebuttree_rules
:Kemudian cukup cetak atau simpan
tree_rules
. Output Anda akan terlihat seperti ini:sumber
Ada
DecisionTreeClassifier
metode barudecision_path
,, dalam rilis 0.18.0 . Para pengembang menyediakan luas (terdokumentasi) walkthrough .Bagian pertama dari kode dalam panduan yang mencetak struktur pohon tampaknya OK. Namun, saya memodifikasi kode di bagian kedua untuk menginterogasi satu sampel. Perubahan saya dilambangkan dengan
# <--
Sunting Perubahan yang ditandai oleh
# <--
dalam kode di bawah ini telah diperbarui di tautan langkah-langkah setelah kesalahan ditunjukkan dalam permintaan tarik # 8653 dan # 10951 . Jauh lebih mudah untuk diikuti sekarang.Ubah
sample_id
untuk melihat jalur keputusan untuk sampel lain. Saya belum bertanya kepada pengembang tentang perubahan ini, hanya tampak lebih intuitif ketika mengerjakan contoh.sumber
Anda dapat melihat Pohon digraf. Kemudian,
clf.tree_.feature
danclf.tree_.value
adalah array fitur pembelahan node dan array nilai node masing-masing. Anda dapat merujuk lebih detail dari sumber github ini .sumber
Hanya karena semua orang sangat membantu saya hanya akan menambahkan modifikasi untuk solusi Zelazny7 dan Daniele yang indah. Yang ini untuk python 2.7, dengan tab agar lebih mudah dibaca:
sumber
Kode di bawah ini adalah pendekatan saya di bawah anaconda python 2.7 plus nama paket "pydot-ng" untuk membuat file PDF dengan aturan keputusan. Saya harap ini membantu.
pertunjukan grafik pohon di sini
sumber
Saya telah melalui ini, tetapi saya membutuhkan aturan untuk ditulis dalam format ini
Jadi saya mengadaptasi jawaban @paulkernfeld (terima kasih) yang dapat Anda sesuaikan dengan kebutuhan Anda
sumber
Berikut adalah cara untuk menerjemahkan seluruh pohon menjadi ekspresi python tunggal (tidak harus terlalu bisa dibaca manusia) menggunakan perpustakaan SKompiler :
sumber
Ini didasarkan pada jawaban @ paulkernfeld. Jika Anda memiliki kerangka data X dengan fitur-fitur Anda dan kerangka data target y dengan resonses Anda dan Anda ingin mendapatkan ide mana nilai y berakhir di simpul mana (dan juga semut untuk memplotnya), Anda dapat melakukan hal berikut:
bukan versi yang paling elegan tetapi berfungsi ...
sumber
Ini adalah kode yang Anda butuhkan
Saya telah memodifikasi kode paling disukai untuk indentasi di jupyter notebook python 3 dengan benar
sumber
Berikut adalah fungsi, aturan pencetakan pohon keputusan scikit-learn di bawah python 3 dan dengan offset untuk blok bersyarat untuk membuat struktur lebih mudah dibaca:
sumber
Anda juga dapat membuatnya lebih informatif dengan membedakan kelas mana yang dimiliki atau bahkan dengan menyebutkan nilai outputnya.
sumber
Berikut ini adalah pendekatan saya untuk mengekstrak aturan keputusan dalam bentuk yang dapat digunakan secara langsung dalam sql, sehingga data dapat dikelompokkan berdasarkan node. (Berdasarkan pendekatan poster sebelumnya.)
Hasilnya akan menjadi
CASE
klausa berikutnya yang dapat disalin ke pernyataan sql, mis.SELECT COALESCE(*CASE WHEN <conditions> THEN > <NodeA>*, > *CASE WHEN <conditions> THEN <NodeB>*, > ....)NodeName,* > FROM <table or view>
sumber
Sekarang Anda dapat menggunakan export_text.
Contoh lengkap dari [sklearn] [1]
sumber
Memodifikasi kode Zelazny7 untuk mengambil SQL dari pohon keputusan.
sumber
Rupanya sudah lama ada seseorang yang memutuskan untuk mencoba menambahkan fungsi berikut ke fungsi ekspor pohon scikit resmi (yang pada dasarnya hanya mendukung export_graphviz)
Inilah komitmen penuhnya:
https://github.com/scikit-learn/scikit-learn/blob/79bdc8f711d0af225ed6be9fdb708cea9f98a910/sklearn/tree/export.py
Tidak yakin apa yang terjadi pada komentar ini. Tetapi Anda juga bisa mencoba menggunakan fungsi itu.
Saya pikir ini menjamin permintaan dokumentasi serius kepada orang-orang baik scikit-belajar untuk mendokumentasikan
sklearn.tree.Tree
API yang merupakan struktur pohon yang mendasari yangDecisionTreeClassifier
mengekspos sebagai atributnyatree_
.sumber
Cukup gunakan fungsi dari sklearn.tree seperti ini
Dan kemudian lihat di folder proyek Anda untuk file tree.dot , salin SEMUA konten dan tempel di sini http://www.webgraphviz.com/ dan hasilkan grafik Anda :)
sumber
Terima kasih atas solusi luar biasa dari @paulkerfeld. Di atas solusi nya, untuk semua orang yang ingin memiliki versi serial pohon, hanya menggunakan
tree.threshold
,tree.children_left
,tree.children_right
,tree.feature
dantree.value
. Karena daun tidak memiliki perpecahan dan karenanya tidak ada fitur nama dan anak-anak, placeholder merekatree.feature
dantree.children_***
yang_tree.TREE_UNDEFINED
dan_tree.TREE_LEAF
. Setiap pemisahan diberi indeks unik olehdepth first search
.Perhatikan bahwa
tree.value
bentuknya[n, 1, 1]
sumber
Berikut adalah fungsi yang menghasilkan kode Python dari pohon keputusan dengan mengubah output dari
export_text
:Penggunaan sampel:
Output sampel:
Contoh di atas dihasilkan dengan
names = ['f'+str(j+1) for j in range(NUM_FEATURES)]
.Salah satu fitur praktis adalah dapat menghasilkan ukuran file yang lebih kecil dengan pengurangan jarak. Baru diatur
spacing=2
.sumber